gl/gbm: Initialize window handle (= gbm surface) like other window systems
authorCarlos Rafael Giani <dv@pseudoterminal.org>
Sun, 4 Mar 2018 15:41:14 +0000 (16:41 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 22 Mar 2018 08:15:10 +0000 (10:15 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=793997

gst-libs/gst/gl/egl/gstglcontext_egl.c
gst-libs/gst/gl/gbm/gstglwindow_gbm_egl.c
gst-libs/gst/gl/gbm/gstglwindow_gbm_egl.h

index 868e766..a9b41ad 100644 (file)
@@ -51,6 +51,9 @@
 #if GST_GL_HAVE_WINDOW_DISPMANX
 #include "../dispmanx/gstglwindow_dispmanx_egl.h"
 #endif
+#if GST_GL_HAVE_WINDOW_GBM
+#include "../gbm/gstglwindow_gbm_egl.h"
+#endif
 
 #define GST_CAT_DEFAULT gst_gl_context_debug
 
@@ -521,6 +524,12 @@ gst_gl_context_egl_create_context (GstGLContext * context,
           context->window);
     }
 #endif
+#if GST_GL_HAVE_WINDOW_GBM
+    if (GST_IS_GL_WINDOW_GBM_EGL (context->window)) {
+      gst_gl_window_gbm_egl_create_window ((GstGLWindowGBMEGL *)
+          context->window);
+    }
+#endif
   }
 
   if (window)
index 6cd4c33..04d1eec 100644 (file)
@@ -83,16 +83,6 @@ gst_gl_window_gbm_egl_init (GstGLWindowGBMEGL * window_gbm)
 static guintptr
 gst_gl_window_gbm_egl_get_window_handle (GstGLWindow * window)
 {
-  GstGLWindowGBMEGL *window_egl = GST_GL_WINDOW_GBM_EGL (window);
-
-  /* This function is called in here, and not in the open()
-   * vmethod. The reason for this is explained inside the
-   * gst_gl_window_gbm_init_surface() function. */
-  if (window_egl->gbm_surf == NULL) {
-    if (!gst_gl_window_gbm_init_surface (window_egl))
-      return 0;
-  }
-
   return (guintptr) GST_GL_WINDOW_GBM_EGL (window)->gbm_surf;
 }
 
@@ -293,7 +283,11 @@ gst_gl_window_gbm_init_surface (GstGLWindowGBMEGL * window_egl)
    * contains some function pointers that are set to NULL and
    * shouldn't be. This is because Mesa's eglInitialize() loads
    * the DRI2 driver and the relevant functions aren't available
-   * until then. */
+   * until then.
+   *
+   * Therefore, this function is called instead inside
+   * gst_gl_window_gbm_egl_create_window(), which in turn is
+   * called inside gst_gl_context_egl_create_context(). */
 
   GstGLWindow *window = GST_GL_WINDOW (window_egl);
   GstGLDisplayGBM *display = (GstGLDisplayGBM *) window->display;
@@ -355,3 +349,10 @@ gst_gl_window_gbm_egl_new (GstGLDisplay * display)
 
   return window_egl;
 }
+
+
+gboolean
+gst_gl_window_gbm_egl_create_window (GstGLWindowGBMEGL * window_egl)
+{
+  return gst_gl_window_gbm_init_surface (window_egl);
+}
index ba2a03f..3d132a2 100644 (file)
@@ -63,6 +63,7 @@ struct _GstGLWindowGBMEGLClass {
 GType gst_gl_window_gbm_egl_get_type (void);
 
 GstGLWindowGBMEGL * gst_gl_window_gbm_egl_new (GstGLDisplay * display);
+gboolean gst_gl_window_gbm_egl_create_window (GstGLWindowGBMEGL * window_egl);
 
 G_END_DECLS