[mutter/gnome-3-34] wayland/egl-stream: Cache texture snippet



commit f52c0a3bf76d2b90a6fa81055d7b9b0ea7ce4ba5
Author: Jonas Ådahl <jadahl gmail com>
Date:   Thu Dec 5 19:43:07 2019 +0100

    wayland/egl-stream: Cache texture snippet
    
    While it's not very relevant now, as we would rarely create it anyway
    since the buffer nor texture never changes for a surface, it will be in
    the future, as the actor state (including its content,
    MetaShapedTexture) will be synchronized by the MetaWaylandActorSurface
    at a later point in time, and not by MetaWaylandSurface, at state
    application time.
    
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/961
    (cherry picked from commit 76ee026caa1ab0215be389e4a33a6994ce3d26fc)

 src/wayland/meta-wayland-buffer.c     |  2 +-
 src/wayland/meta-wayland-egl-stream.c | 25 ++++++++++++++++---------
 src/wayland/meta-wayland-egl-stream.h |  2 +-
 3 files changed, 18 insertions(+), 11 deletions(-)
---
diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c
index cdaad26eb..5639c3a17 100644
--- a/src/wayland/meta-wayland-buffer.c
+++ b/src/wayland/meta-wayland-buffer.c
@@ -456,7 +456,7 @@ meta_wayland_buffer_create_snippet (MetaWaylandBuffer *buffer)
   if (!buffer->egl_stream.stream)
     return NULL;
 
-  return meta_wayland_egl_stream_create_snippet ();
+  return meta_wayland_egl_stream_create_snippet (buffer->egl_stream.stream);
 #else
   return NULL;
 #endif /* HAVE_WAYLAND_EGLSTREAM */
diff --git a/src/wayland/meta-wayland-egl-stream.c b/src/wayland/meta-wayland-egl-stream.c
index 3f8908e67..3fe9669c9 100644
--- a/src/wayland/meta-wayland-egl-stream.c
+++ b/src/wayland/meta-wayland-egl-stream.c
@@ -134,6 +134,7 @@ struct _MetaWaylandEglStream
   MetaWaylandBuffer *buffer;
   CoglTexture2D *texture;
   gboolean is_y_inverted;
+  CoglSnippet *snippet;
 };
 
 G_DEFINE_TYPE (MetaWaylandEglStream, meta_wayland_egl_stream,
@@ -289,18 +290,22 @@ meta_wayland_egl_stream_is_y_inverted (MetaWaylandEglStream *stream)
 }
 
 CoglSnippet *
-meta_wayland_egl_stream_create_snippet (void)
+meta_wayland_egl_stream_create_snippet (MetaWaylandEglStream *stream)
 {
-  CoglSnippet *snippet;
+  if (!stream->snippet)
+    {
+      CoglSnippet *snippet;
 
-  snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_TEXTURE_LOOKUP,
-                              "uniform samplerExternalOES tex_external;",
-                              NULL);
-  cogl_snippet_set_replace (snippet,
-                            "cogl_texel = texture2D (tex_external,\n"
-                            "                        cogl_tex_coord.xy);");
+      snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_TEXTURE_LOOKUP,
+                                  "uniform samplerExternalOES tex_external;",
+                                  NULL);
+      cogl_snippet_set_replace (snippet,
+                                "cogl_texel = texture2D (tex_external,\n"
+                                "                        cogl_tex_coord.xy);");
+      stream->snippet = snippet;
+    }
 
-  return snippet;
+  return cogl_object_ref (stream->snippet);
 }
 
 gboolean
@@ -341,6 +346,8 @@ meta_wayland_egl_stream_finalize (GObject *object)
 
   meta_egl_destroy_stream (egl, egl_display, stream->egl_stream, NULL);
 
+  cogl_clear_object (&stream->snippet);
+
   G_OBJECT_CLASS (meta_wayland_egl_stream_parent_class)->finalize (object);
 }
 
diff --git a/src/wayland/meta-wayland-egl-stream.h b/src/wayland/meta-wayland-egl-stream.h
index fe488ed54..b8a6b1968 100644
--- a/src/wayland/meta-wayland-egl-stream.h
+++ b/src/wayland/meta-wayland-egl-stream.h
@@ -47,7 +47,7 @@ gboolean meta_wayland_egl_stream_attach (MetaWaylandEglStream *stream,
 
 CoglTexture2D * meta_wayland_egl_stream_create_texture (MetaWaylandEglStream *stream,
                                                         GError              **error);
-CoglSnippet * meta_wayland_egl_stream_create_snippet (void);
+CoglSnippet * meta_wayland_egl_stream_create_snippet (MetaWaylandEglStream *stream);
 
 gboolean meta_wayland_egl_stream_is_y_inverted (MetaWaylandEglStream *stream);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]