[630/906] display: add gl api checking
authorMatthew Waters <ystreet00@gmail.com>
Sat, 8 Dec 2012 22:32:48 +0000 (09:32 +1100)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:31:26 +0000 (19:31 +0000)
i.e. check for cases where the window wants a different API than
what the library was compiled with

gst-libs/gst/gl/Makefile.am
gst-libs/gst/gl/gstglapi.c [new file with mode: 0644]
gst-libs/gst/gl/gstglapi.h
gst-libs/gst/gl/gstgldisplay.c
gst-libs/gst/gl/gstglfeature.c
gst-libs/gst/gl/gstglfeature.h

index 946d7c1..93c1dc2 100644 (file)
@@ -13,7 +13,8 @@ libgstgl_@GST_API_VERSION@_la_SOURCES = \
         gstglshadervariables.c \
         gstgldownload.c \
         gstglupload.c \
-        gstglwindow.c
+        gstglwindow.c \
+        gstglapi.c
 
 libgstgl_@GST_API_VERSION@_la_LIBADD = \
        $(GST_PLUGINS_BASE_LIBS) \
diff --git a/gst-libs/gst/gl/gstglapi.c b/gst-libs/gst/gl/gstglapi.c
new file mode 100644 (file)
index 0000000..86ff505
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * GStreamer
+ * Copyright (C) 2012 Matthew Waters <ystreet00@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gstglapi.h"
+
+#define GST_GL_EXT_BEGIN(name, min_gl, maj_gl, in_gles, ext_suf, ext_name)
+#define GST_GL_EXT_FUNCTION(ret, name, args) \
+  NULL,
+#define GST_GL_EXT_END()
+
+#if HAVE_OPENGL
+static GstGLFuncs gst_gl = {
+#include "glprototypes/opengl.h"
+  {NULL,},
+#include "glprototypes/gles1opengl.h"
+  {NULL,},
+#include "glprototypes/gles2opengl.h"
+  {NULL,},
+#include "glprototypes/gles1gles2opengl.h"
+  {NULL,},
+};
+
+const GstGLFuncs *
+gst_gl_get_opengl_vtable (void)
+{
+  return &gst_gl;
+}
+#endif
+
+#if HAVE_GLES2
+static GstGLES2Funcs gst_gles2 = {
+#include "glprototypes/gles1gles2.h"
+  {NULL,},
+#include "glprototypes/gles1gles2opengl.h"
+  {NULL,},
+#include "glprototypes/gles2.h"
+  {NULL,},
+#include "glprototypes/gles2opengl.h"
+  {NULL,},
+};
+
+const GstGLES2Funcs *
+gst_gl_get_gles2_vtable (void)
+{
+  return &gst_gles2;
+}
+#endif
+
+#undef GST_GL_EXT_BEGIN
+#undef GST_GL_EXT_FUNCTION
+#undef GST_GL_EXT_END
+
+gchar *
+gst_gl_api_string (GstGLAPI api)
+{
+  GString *str = NULL;
+
+  if (api == GST_GL_API_NONE) {
+    str = g_string_new ("none");
+    return str->str;
+  } else if (api == GST_GL_API_ANY) {
+    str = g_string_new ("any");
+    return str->str;
+  }
+
+  if (api & GST_GL_API_OPENGL) {
+    str = g_string_new ("opengl");
+  }
+  if (api & GST_GL_API_OPENGL3) {
+    if (str) {
+      g_string_append (str, " opengl3");
+    } else {
+      str = g_string_new ("opengl3");
+    }
+  }
+  if (api & GST_GL_API_GLES) {
+    if (str) {
+      g_string_append (str, " gles1");
+    } else {
+      str = g_string_new ("gles1");
+    }
+  }
+  if (api & GST_GL_API_GLES2) {
+    if (str) {
+      g_string_append (str, " gles2");
+    } else {
+      str = g_string_new ("gles2");
+    }
+  }
+  if (api & GST_GL_API_GLES3) {
+    if (str) {
+      g_string_append (str, " gles3");
+    } else {
+      str = g_string_new ("gles3");
+    }
+  }
+
+  return str->str;
+}
index 2e86037..30efa44 100644 (file)
@@ -109,6 +109,8 @@ const GstGLES2Funcs *gst_gl_get_gles2_vtable (void);
 #undef GST_GL_EXT_FUNCTION
 #undef GST_GL_EXT_END
 
+gchar * gst_gl_api_string (GstGLAPI api);
+
 G_END_DECLS
 
 #endif /* __GST_GL_API_H__ */
index 673a3b5..fb01dfd 100644 (file)
@@ -444,18 +444,40 @@ _create_context_opengl (GstGLDisplay * display, gint * gl_major, gint * gl_minor
 }
 #endif
 
+GstGLAPI
+_compiled_api (void)
+{
+  GstGLAPI ret = GST_GL_API_NONE;
+
+#if HAVE_OPENGL
+  ret |= GST_GL_API_OPENGL;
+#endif
+#if HAVE_GLES2
+  ret |= GST_GL_API_GLES2;
+#endif
+
+  return ret;
+}
+
 gpointer
 gst_gl_display_thread_create_context (GstGLDisplay * display)
 {
   gint gl_major = 0, gl_minor = 0;
   gboolean ret = FALSE;
+  GError *error = NULL;
+  GstGLAPI compiled_api;
+  gchar *api_string;
+  gchar *compiled_api_s;
 
   gst_gl_display_lock (display);
+
+  compiled_api = _compiled_api ();
+
   display->gl_window =
-      gst_gl_window_new (GST_GL_API_ANY, display->external_gl_context);
+      gst_gl_window_new (compiled_api, display->external_gl_context, &error);
 
-  if (!display->gl_window) {
-    gst_gl_display_set_error (display, "Failed to create gl window");
+  if (!display->gl_window || error) {
+    gst_gl_display_set_error (display, error ? error->message : "Failed to create gl window");
     g_cond_signal (display->cond_create_context);
     gst_gl_display_unlock (display);
     return NULL;
@@ -464,9 +486,22 @@ gst_gl_display_thread_create_context (GstGLDisplay * display)
   GST_INFO ("gl window created");
 
   display->gl_api = gst_gl_window_get_gl_api (display->gl_window);
-
   g_assert (display->gl_api != GST_GL_API_NONE && display->gl_api != GST_GL_API_ANY);
 
+  api_string = gst_gl_api_string (display->gl_api);
+  GST_INFO ("available GL APIs: %s", api_string);
+
+  compiled_api_s = gst_gl_api_string (compiled_api);
+  GST_INFO ("compiled api support: %s", compiled_api_s);
+
+  if ((compiled_api & display->gl_api) == GST_GL_API_NONE)
+    gst_gl_display_set_error (display, "failed to create_context, window "
+        "could not provide correct api. compiled api supports:%s, window "
+        "supports:%s", compiled_api_s, api_string);
+
+  g_free (api_string);
+  g_free (compiled_api_s);
+
   /* gl api specific code */
 #if HAVE_OPENGL
   if (!ret && USING_OPENGL(display))
@@ -474,11 +509,11 @@ gst_gl_display_thread_create_context (GstGLDisplay * display)
 #endif
 #if HAVE_GLES2
   if (!ret && USING_GLES2(display))
-   ret =  _create_context_gles2 (display, &gl_major, &gl_minor);
+    ret = _create_context_gles2 (display, &gl_major, &gl_minor);
 #endif
 
   if (!ret || !gl_major)
-    gst_gl_display_set_error (display, "failed to create context");
+    gst_gl_display_set_error (display, "failed to create context, unknown reason");
 
   /* setup callbacks */
   gst_gl_window_set_resize_callback (display->gl_window,
index 292097c..8a8b858 100644 (file)
@@ -124,50 +124,6 @@ static const GstGLFeatureData cogl_feature_ext_functions_data_gles2[] = {
 #undef GST_GL_EXT_FUNCTION
 #undef GST_GL_EXT_END
 
-#define GST_GL_EXT_BEGIN(name, min_gl_major, min_gl_minor, gles_availability, \
-                       namespaces, extension_names)
-#define GST_GL_EXT_FUNCTION(ret, name, args) \
-  NULL,
-#define GST_GL_EXT_END()
-
-#if HAVE_OPENGL
-static GstGLFuncs gst_gl = {
-#include "glprototypes/opengl.h"
-  {NULL,},
-#include "glprototypes/gles1opengl.h"
-  {NULL,},
-#include "glprototypes/gles2opengl.h"
-  {NULL,},
-#include "glprototypes/gles1gles2opengl.h"
-  {NULL,},
-};
-
-const GstGLFuncs *
-gst_gl_get_opengl_vtable (void)
-{
-  return &gst_gl;
-}
-#endif
-
-#if HAVE_GLES2
-static GstGLES2Funcs gst_gles2 = {
-#include "glprototypes/gles1gles2.h"
-  {NULL,},
-#include "glprototypes/gles1gles2opengl.h"
-  {NULL,},
-#include "glprototypes/gles2.h"
-  {NULL,},
-#include "glprototypes/gles2opengl.h"
-  {NULL,},
-};
-
-const GstGLES2Funcs *
-gst_gl_get_gles2_vtable (void)
-{
-  return &gst_gles2;
-}
-#endif
-
 gboolean
 _gst_gl_feature_check (GstGLDisplay * display,
     const char *driver_prefix,
index 0795f8c..f1a8e55 100644 (file)
@@ -51,7 +51,7 @@ struct _GstGLFeatureData
      without needing an extension. Set to 255,255 if it's only
      provided in an extension */
   int min_gl_major, min_gl_minor;
-  /* Flags specifying which versions of GLES the feature is available
+  /* Flags specifying which versions of GL the feature is available
      in core in */
   GstGLApi gl_availability;
   /* \0 separated list of namespaces to try. Eg "EXT\0ARB\0" */