[711/906] wayland: support choosing Desktop GL as the api
authorMatthew Waters <ystreet00@gmail.com>
Sun, 16 Jun 2013 10:37:06 +0000 (20:37 +1000)
committerMatthew Waters <ystreet00@gmail.com>
Sat, 15 Mar 2014 17:36:56 +0000 (18:36 +0100)
gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c
gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h
gst-libs/gst/gl/x11/gstglwindow_x11_egl.c

index 036e265..f9d776e 100644 (file)
@@ -285,6 +285,7 @@ gst_gl_window_wayland_egl_class_init (GstGLWindowWaylandEGLClass * klass)
 static void
 gst_gl_window_wayland_egl_init (GstGLWindowWaylandEGL * window)
 {
+  window->gl_api = GST_GL_API_NONE;
 }
 
 /* Must be called in the gl thread */
@@ -408,10 +409,45 @@ gst_gl_window_wayland_egl_create_context (GstGLWindow * window,
     goto failure;
   }
 
-  if (!eglBindAPI (EGL_OPENGL_ES_API)) {
-    g_set_error (error, GST_GL_WINDOW_ERROR, GST_GL_WINDOW_ERROR_FAILED,
-        "Failed to bind OpenGL|ES API: %s", WlEGLErrorString ());
-    goto failure;
+  if (gl_api & GST_GL_API_OPENGL) {
+    /* egl + opengl only available with EGL 1.4+ */
+    if (majorVersion == 1 && minorVersion <= 3) {
+      if ((gl_api & ~GST_GL_API_OPENGL) == GST_GL_API_NONE) {
+        g_set_error (error, GST_GL_WINDOW_ERROR, GST_GL_WINDOW_ERROR_OLD_LIBS,
+            "EGL version (%i.%i) too old for OpenGL support, (needed at least 1.4)",
+            majorVersion, minorVersion);
+        goto failure;
+      } else {
+        GST_WARNING
+            ("EGL version (%i.%i) too old for OpenGL support, (needed at least 1.4)",
+            majorVersion, minorVersion);
+        if (gl_api & GST_GL_API_GLES2) {
+          goto try_gles2;
+        } else {
+          g_set_error (error, GST_GL_WINDOW_ERROR,
+              GST_GL_WINDOW_ERROR_WRONG_CONFIG,
+              "Failed to choose a suitable OpenGL API");
+          goto failure;
+        }
+      }
+    }
+
+    if (!eglBindAPI (EGL_OPENGL_API)) {
+      g_set_error (error, GST_GL_WINDOW_ERROR, GST_GL_WINDOW_ERROR_FAILED,
+          "Failed to bind OpenGL|ES API: %s", WlEGLErrorString ());
+      goto failure;
+    }
+
+    window_egl->gl_api = GST_GL_API_OPENGL;
+  } else if (gl_api & GST_GL_API_GLES2) {
+  try_gles2:
+    if (!eglBindAPI (EGL_OPENGL_ES_API)) {
+      g_set_error (error, GST_GL_WINDOW_ERROR, GST_GL_WINDOW_ERROR_FAILED,
+          "Failed to bind OpenGL|ES API: %s", WlEGLErrorString ());
+      goto failure;
+    }
+
+    window_egl->gl_api = GST_GL_API_GLES2;
   }
 
   if (eglChooseConfig (window_egl->egl_display, config_attrib,
@@ -503,7 +539,7 @@ gst_gl_window_wayland_egl_get_gl_context (GstGLWindow * window)
 static GstGLAPI
 gst_gl_window_wayland_egl_get_gl_api (GstGLWindow * window)
 {
-  return GST_GL_API_GLES2;
+  return GST_GL_WINDOW_WAYLAND_EGL (window)->gl_api;
 }
 
 static void
index 27bd75b..d7a3105 100644 (file)
@@ -86,6 +86,8 @@ struct _GstGLWindowWaylandEGL {
   GMainContext *main_context;
   GMainLoop *loop;
 
+  GstGLAPI gl_api;
+
   gpointer _reserved[GST_PADDING];
 };
 
index be655ba..e8af671 100644 (file)
@@ -186,10 +186,14 @@ gst_gl_window_x11_egl_create_context (GstGLWindowX11 * window_x11,
         GST_WARNING
             ("EGL version (%i.%i) too old for OpenGL support, (needed at least 1.4)",
             majorVersion, minorVersion);
-        if (gl_api & GST_GL_API_GLES2)
+        if (gl_api & GST_GL_API_GLES2) {
           goto try_gles2;
-        else
+        } else {
+          g_set_error (error, GST_GL_WINDOW_ERROR,
+              GST_GL_WINDOW_ERROR_WRONG_CONFIG,
+              "Failed to choose a suitable OpenGL API");
           goto failure;
+        }
       }
     }
 
@@ -301,8 +305,8 @@ gst_gl_window_x11_egl_get_gl_api (GstGLWindow * window)
 {
   GstGLWindowX11EGL *window_egl = GST_GL_WINDOW_X11_EGL (window);
 
-  return window_egl->
-      gl_api ? window_egl->gl_api : GST_GL_API_GLES2 | GST_GL_API_OPENGL;
+  return window_egl->gl_api ? window_egl->
+      gl_api : GST_GL_API_GLES2 | GST_GL_API_OPENGL;
 }
 
 static gpointer