[mutter/wip/garnacho/wayland-emulated-output-transform: 14/15] backends/native: Set offscreen on the transformed MetaRendererViews



commit bb38c89861a33f1ddd33b5bf70621d9665921e8b
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]