[mutter/wip/garnacho/wayland-emulated-output-transform: 33/34] backends/native: Set offscreen on the transformed MetaRendererViews
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/garnacho/wayland-emulated-output-transform: 33/34] backends/native: Set offscreen on the transformed MetaRendererViews
- Date: Tue, 16 Aug 2016 10:20:26 +0000 (UTC)
commit d9a07ce2de3690e067a6d5afc57849178aa4259d
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon Aug 1 03:48:30 2016 +0200
backends/native: Set offscreen on the transformed MetaRendererViews
The texture is only created if the view is transformed at the software level,
otherwise the texture is NULL, and rendering happens on the onscreen.
https://bugzilla.gnome.org/show_bug.cgi?id=745079
src/backends/native/meta-renderer-native.c | 64 ++++++++++++++++++++++++++++
1 files changed, 64 insertions(+), 0 deletions(-)
---
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index 1fdcbd3..895c82b 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -887,6 +887,45 @@ meta_renderer_native_create_onscreen (MetaRendererNative *renderer,
return TRUE;
}
+static gboolean
+meta_renderer_native_maybe_create_offscreen (MetaRendererNative *renderer,
+ CoglContext *context,
+ MetaMonitorTransform transform,
+ gint view_width,
+ gint view_height,
+ CoglOffscreen **offscreen,
+ GError **error)
+{
+ CoglOffscreen *fb;
+ CoglTexture2D *tex;
+
+ *offscreen = NULL;
+
+ if (transform == META_MONITOR_TRANSFORM_NORMAL)
+ return TRUE;
+
+ tex = cogl_texture_2d_new_with_size (context, view_width, view_height);
+ cogl_primitive_texture_set_auto_mipmap (COGL_PRIMITIVE_TEXTURE (tex), FALSE);
+
+ if (!cogl_texture_allocate (COGL_TEXTURE (tex), error))
+ {
+ cogl_object_unref (tex);
+ return FALSE;
+ }
+
+ fb = cogl_offscreen_new_with_texture (COGL_TEXTURE (tex));
+ cogl_object_unref (tex);
+ if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (fb), error))
+ {
+ cogl_object_unref (fb);
+ return FALSE;
+ }
+
+ *offscreen = fb;
+
+ return TRUE;
+}
+
gboolean
meta_renderer_native_set_legacy_view_size (MetaRendererNative *renderer_native,
MetaRendererView *view,
@@ -1089,8 +1128,12 @@ meta_renderer_native_create_view (MetaRenderer *renderer,
MetaBackend *backend = meta_get_backend ();
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend);
+ CoglDisplay *cogl_display = cogl_context_get_display (cogl_context);
+ CoglDisplayEGL *egl_display = cogl_display->winsys;
+ CoglOnscreenEGL *egl_onscreen;
MetaMonitorTransform transform;
CoglOnscreen *onscreen = NULL;
+ CoglOffscreen *offscreen = NULL;
MetaRendererView *view;
GError *error = NULL;
@@ -1109,13 +1152,34 @@ meta_renderer_native_create_view (MetaRenderer *renderer,
error->message);
}
+ /* Ensure we don't point to stale surfaces when creating the offscreen */
+ egl_onscreen = onscreen->winsys;
+ _cogl_winsys_egl_make_current (cogl_display,
+ egl_onscreen->egl_surface,
+ egl_onscreen->egl_surface,
+ egl_display->egl_context);
+
+ if (!meta_renderer_native_maybe_create_offscreen (META_RENDERER_NATIVE (renderer),
+ cogl_context,
+ transform,
+ monitor_info->rect.width,
+ monitor_info->rect.height,
+ &offscreen,
+ &error))
+ {
+ meta_fatal ("Failed to allocate back buffer texture: %s\n",
+ error->message);
+ }
+
view = g_object_new (META_TYPE_RENDERER_VIEW,
"layout", &monitor_info->rect,
"framebuffer", onscreen,
+ "offscreen", offscreen,
"monitor-info", monitor_info,
"transform", transform,
NULL);
cogl_object_unref (onscreen);
+ g_clear_pointer (&offscreen, cogl_object_unref);
meta_onscreen_native_set_view (onscreen, view);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]