[mutter] MetaWaylandEglStream: Use EGL_WL_wayland_eglstream instead of fd hack



commit 2df35d636e916a21cabf44333f0925e043aba92c
Author: Jonas Ådahl <jadahl gmail com>
Date:   Fri Dec 9 11:23:46 2016 +0800

    MetaWaylandEglStream: Use EGL_WL_wayland_eglstream instead of fd hack
    
    Use the proposed EGL_WL_wayland_eglstream EGL extension instead of the
    file descriptor hack that was used as a temporary solution.
    
    Note that this results in EGL clients will no longer work if they are
    running on a Nvidia driver with a version older than 370.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=773629

 src/backends/meta-egl.c               |   25 ---------------------
 src/backends/meta-egl.h               |    5 ----
 src/wayland/meta-wayland-egl-stream.c |   38 ++++++++++----------------------
 3 files changed, 12 insertions(+), 56 deletions(-)
---
diff --git a/src/backends/meta-egl.c b/src/backends/meta-egl.c
index 77ca4a8..7e75d86 100644
--- a/src/backends/meta-egl.c
+++ b/src/backends/meta-egl.c
@@ -66,8 +66,6 @@ struct _MetaEgl
 
   PFNEGLSTREAMCONSUMERACQUIREKHRPROC eglStreamConsumerAcquireKHR;
   PFNEGLSTREAMCONSUMERACQUIREATTRIBNVPROC eglStreamConsumerAcquireAttribNV;
-
-  PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC eglCreateStreamFromFileDescriptorKHR;
 };
 
 G_DEFINE_TYPE (MetaEgl, meta_egl, G_TYPE_OBJECT)
@@ -699,27 +697,6 @@ meta_egl_stream_consumer_acquire (MetaEgl     *egl,
   return TRUE;
 }
 
-EGLStreamKHR
-meta_egl_create_stream_from_file_descriptor (MetaEgl                   *egl,
-                                             EGLDisplay                 display,
-                                             EGLNativeFileDescriptorKHR file_descriptor,
-                                             GError                   **error)
-{
-  EGLStreamKHR stream;
-
-  if (!is_egl_proc_valid (egl->eglCreateStreamFromFileDescriptorKHR, error))
-    return EGL_NO_STREAM_KHR;
-
-  stream = egl->eglCreateStreamFromFileDescriptorKHR (display, file_descriptor);
-  if (stream == EGL_NO_STREAM_KHR)
-    {
-      set_egl_error (error);
-      return EGL_NO_STREAM_KHR;
-    }
-
-  return stream;
-}
-
 #define GET_EGL_PROC_ADDR(proc) \
   egl->proc = (void *) eglGetProcAddress (#proc);
 
@@ -762,8 +739,6 @@ meta_egl_constructed (GObject *object)
 
   GET_EGL_PROC_ADDR (eglStreamConsumerAcquireKHR);
   GET_EGL_PROC_ADDR (eglStreamConsumerAcquireAttribNV);
-
-  GET_EGL_PROC_ADDR (eglCreateStreamFromFileDescriptorKHR);
 }
 
 #undef GET_EGL_PROC_ADDR
diff --git a/src/backends/meta-egl.h b/src/backends/meta-egl.h
index 367555b..209cc3e 100644
--- a/src/backends/meta-egl.h
+++ b/src/backends/meta-egl.h
@@ -163,9 +163,4 @@ gboolean meta_egl_stream_consumer_gl_texture_external (MetaEgl     *egl,
                                                        EGLStreamKHR stream,
                                                        GError     **error);
 
-EGLStreamKHR meta_egl_create_stream_from_file_descriptor (MetaEgl                   *egl,
-                                                          EGLDisplay                 display,
-                                                          EGLNativeFileDescriptorKHR file_descriptor,
-                                                          GError                   **error);
-
 #endif /* META_EGL_H */
diff --git a/src/wayland/meta-wayland-egl-stream.c b/src/wayland/meta-wayland-egl-stream.c
index d3fab3e..39ff934 100644
--- a/src/wayland/meta-wayland-egl-stream.c
+++ b/src/wayland/meta-wayland-egl-stream.c
@@ -29,6 +29,7 @@
 #include "cogl/cogl-egl.h"
 #include "backends/meta-backend-private.h"
 #include "backends/meta-egl.h"
+#include "backends/meta-egl-ext.h"
 #include "meta/meta-backend.h"
 #include "wayland/meta-wayland-buffer.h"
 
@@ -54,43 +55,28 @@ meta_wayland_egl_stream_new (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);
-  g_autoptr (MetaWaylandEglStream) stream = NULL;
-  int stream_fd;
+  EGLAttrib stream_attribs[] = {
+    EGL_WAYLAND_EGLSTREAM_WL, (EGLAttrib) buffer->resource,
+    EGL_NONE
+  };
   EGLStreamKHR egl_stream;
+  MetaWaylandEglStream *stream;
 
-  stream = g_object_new (META_TYPE_WAYLAND_EGL_STREAM, NULL);
-
-  /*
-   * HACK: Use a (as far as I can tell) undocumented hack by passing
-   * EGL_WAYLAND_BUFFER_WL to eglQueryWaylandBufferWL. If it happens to be a
-   * dummy EGLStream buffer, we'll get a EGLStream file descriptor.
-   *
-   * FIXME: At some point, replace this with the EGL_WL_wayland_eglstream
-   * extension.
-   */
-  if (!meta_egl_query_wayland_buffer (egl, egl_display, buffer->resource,
-                                      EGL_WAYLAND_BUFFER_WL, &stream_fd,
-                                      error))
-    return NULL;
-
-  if (stream_fd == EGL_NO_FILE_DESCRIPTOR_KHR)
+  egl_stream = meta_egl_create_stream_attrib (egl, egl_display, stream_attribs,
+                                              error);
+  if (egl_stream == EGL_NO_STREAM_KHR)
     {
       g_set_error (error, G_IO_ERROR,
                    G_IO_ERROR_FAILED,
-                   "Stream already used with other wl_buffer");
+                   "Failed to create stream from wl_buffer resource");
       return NULL;
     }
 
-  egl_stream = meta_egl_create_stream_from_file_descriptor (egl, egl_display, stream_fd,
-                                                            error);
-  close (stream_fd);
-  if (egl_stream == EGL_NO_STREAM_KHR)
-    return NULL;
-
+  stream = g_object_new (META_TYPE_WAYLAND_EGL_STREAM, NULL);
   stream->egl_stream = egl_stream;
   stream->buffer = buffer;
 
-  return g_steal_pointer (&stream);
+  return stream;
 }
 
 static void


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