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);