[mutter] wayland/buffer: Add 'realization' concept to buffers



commit 405aa8fb9ea290a2f3e10f3e2ee65540fece9f91
Author: Jonas Ådahl <jadahl gmail com>
Date:   Fri Dec 9 11:15:11 2016 +0800

    wayland/buffer: Add 'realization' concept to buffers
    
    Instead of having a way to determine the type of a buffer, add a
    realization step that implicitly detects the buffer type. This makes it
    possible to both realize (i.e. creating needed objects from the buffer)
    and determine the type at the same time, which may be the only possible
    way (for example, the only way to know whether a buffer is a EGLStream
    is to create the EGLStream from it).
    
    https://bugzilla.gnome.org/show_bug.cgi?id=773629

 src/wayland/meta-wayland-buffer.c |   74 +++++++++++++++++++-----------------
 src/wayland/meta-wayland-buffer.h |   10 +++++
 2 files changed, 49 insertions(+), 35 deletions(-)
---
diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c
index 1f4d384..0ad219a 100644
--- a/src/wayland/meta-wayland-buffer.c
+++ b/src/wayland/meta-wayland-buffer.c
@@ -81,16 +81,14 @@ meta_wayland_buffer_from_resource (struct wl_resource *resource)
   return buffer;
 }
 
-typedef enum _MetaWaylandBufferType
+static gboolean
+meta_wayland_buffer_is_realized (MetaWaylandBuffer *buffer)
 {
-  META_WAYLAND_BUFFER_TYPE_UNKNOWN,
-  META_WAYLAND_BUFFER_TYPE_SHM,
-  META_WAYLAND_BUFFER_TYPE_EGL_IMAGE,
-  META_WAYLAND_BUFFER_TYPE_EGL_STREAM,
-} MetaWaylandBufferType;
-
-static MetaWaylandBufferType
-determine_buffer_type (MetaWaylandBuffer *buffer)
+  return buffer->type != META_WAYLAND_BUFFER_TYPE_UNKNOWN;
+}
+
+static gboolean
+meta_wayland_buffer_realize (MetaWaylandBuffer *buffer)
 {
   EGLint format;
   MetaBackend *backend = meta_get_backend ();
@@ -98,20 +96,31 @@ determine_buffer_type (MetaWaylandBuffer *buffer)
   ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
   CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend);
   EGLDisplay egl_display = cogl_egl_context_get_egl_display (cogl_context);
+  MetaWaylandEglStream *stream;
 
   if (wl_shm_buffer_get (buffer->resource) != NULL)
-    return META_WAYLAND_BUFFER_TYPE_SHM;
-
+    {
+      buffer->type = META_WAYLAND_BUFFER_TYPE_SHM;
+      return TRUE;
+    }
 
   if (meta_egl_query_wayland_buffer (egl, egl_display, buffer->resource,
                                      EGL_TEXTURE_FORMAT, &format,
                                      NULL))
-    return META_WAYLAND_BUFFER_TYPE_EGL_IMAGE;
+    {
+      buffer->type = META_WAYLAND_BUFFER_TYPE_EGL_IMAGE;
+      return TRUE;
+    }
 
-  if (meta_wayland_is_egl_stream_buffer (buffer))
-    return META_WAYLAND_BUFFER_TYPE_EGL_STREAM;
+  stream = meta_wayland_egl_stream_new (buffer, NULL);
+  if (stream)
+    {
+      buffer->egl_stream.stream = stream;
+      buffer->type = META_WAYLAND_BUFFER_TYPE_EGL_STREAM;
+      return TRUE;
+    }
 
-  return META_WAYLAND_BUFFER_TYPE_UNKNOWN;
+  return FALSE;
 }
 
 static void
@@ -284,16 +293,9 @@ static gboolean
 egl_stream_buffer_attach (MetaWaylandBuffer  *buffer,
                           GError            **error)
 {
-  MetaWaylandEglStream *stream;
+  MetaWaylandEglStream *stream = buffer->egl_stream.stream;
 
-  stream = buffer->egl_stream.stream;
-  if (!stream)
-    stream = meta_wayland_egl_stream_new (buffer, error);
-
-  if (!stream)
-    return FALSE;
-
-  buffer->egl_stream.stream = stream;
+  g_assert (stream);
 
   if (!buffer->texture)
     {
@@ -317,13 +319,20 @@ gboolean
 meta_wayland_buffer_attach (MetaWaylandBuffer *buffer,
                             GError           **error)
 {
-  MetaWaylandBufferType buffer_type;
-
   g_return_val_if_fail (buffer->resource, FALSE);
 
-  buffer_type = determine_buffer_type (buffer);
+  if (!meta_wayland_buffer_is_realized (buffer))
+    {
+      if (!meta_wayland_buffer_realize (buffer))
+        {
+          g_set_error (error, G_IO_ERROR,
+                       G_IO_ERROR_FAILED,
+                       "Unknown buffer type");
+          return FALSE;
+        }
+    }
 
-  switch (buffer_type)
+  switch (buffer->type)
     {
     case META_WAYLAND_BUFFER_TYPE_SHM:
       return shm_buffer_attach (buffer, error);
@@ -333,9 +342,7 @@ meta_wayland_buffer_attach (MetaWaylandBuffer *buffer,
       return egl_stream_buffer_attach (buffer, error);
       break;
     case META_WAYLAND_BUFFER_TYPE_UNKNOWN:
-      g_set_error (error, G_IO_ERROR,
-                   G_IO_ERROR_FAILED,
-                   "Unknown buffer type");
+      g_assert_not_reached ();
       return FALSE;
     }
 
@@ -412,15 +419,12 @@ void
 meta_wayland_buffer_process_damage (MetaWaylandBuffer *buffer,
                                     cairo_region_t    *region)
 {
-  MetaWaylandBufferType buffer_type;
   gboolean res = FALSE;
   GError *error = NULL;
 
   g_return_if_fail (buffer->resource);
 
-  buffer_type = determine_buffer_type (buffer);
-
-  switch (buffer_type)
+  switch (buffer->type)
     {
     case META_WAYLAND_BUFFER_TYPE_SHM:
       res = process_shm_buffer_damage (buffer, region, &error);
diff --git a/src/wayland/meta-wayland-buffer.h b/src/wayland/meta-wayland-buffer.h
index 9189e28..39ec8fe 100644
--- a/src/wayland/meta-wayland-buffer.h
+++ b/src/wayland/meta-wayland-buffer.h
@@ -32,6 +32,14 @@
 #include "meta-wayland-types.h"
 #include "meta-wayland-egl-stream.h"
 
+typedef enum _MetaWaylandBufferType
+{
+  META_WAYLAND_BUFFER_TYPE_UNKNOWN,
+  META_WAYLAND_BUFFER_TYPE_SHM,
+  META_WAYLAND_BUFFER_TYPE_EGL_IMAGE,
+  META_WAYLAND_BUFFER_TYPE_EGL_STREAM,
+} MetaWaylandBufferType;
+
 struct _MetaWaylandBuffer
 {
   GObject parent;
@@ -42,6 +50,8 @@ struct _MetaWaylandBuffer
   CoglTexture *texture;
   gboolean is_y_inverted;
 
+  MetaWaylandBufferType type;
+
   struct {
     MetaWaylandEglStream *stream;
   } egl_stream;


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