[491/906] glES2.0: properly fails if driver/kernel inconsistency
authorJulien Isorce <julien.isorce@gmail.com>
Fri, 13 Apr 2012 10:38:11 +0000 (12:38 +0200)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:31:23 +0000 (19:31 +0000)
gst-libs/gst/gl/gstgldisplay.c
gst-libs/gst/gl/gstglshader.c
gst-libs/gst/gl/gstglwindow_x11ES2.c

index 5ccccb8..e5b6bff 100644 (file)
@@ -566,7 +566,7 @@ gst_gl_display_set_error (GstGLDisplay * display, const char *format, ...)
 gpointer
 gst_gl_display_thread_create_context (GstGLDisplay * display)
 {
-  GLenum err = 0;
+  GLenum err = GLEW_OK;
 
   gst_gl_display_lock (display);
   display->gl_window = gst_gl_window_new (display->external_gl_context);
@@ -589,17 +589,17 @@ gst_gl_display_thread_create_context (GstGLDisplay * display)
         glewGetErrorString (err));
 #endif
   } else {
+#ifndef OPENGL_ES2
     //OpenGL > 1.2.0 and Glew > 1.4.0
-    GString *opengl_version =
-        g_string_truncate (g_string_new ((gchar *) glGetString (GL_VERSION)),
-        3);
+    GString *opengl_version = NULL;
     gint opengl_version_major = 0;
     gint opengl_version_minor = 0;
+#endif
 
-    sscanf (opengl_version->str, "%d.%d", &opengl_version_major,
-        &opengl_version_minor);
+    GLenum gl_err = GL_NO_ERROR;
+    if (glGetString (GL_VERSION))
+      GST_INFO ("GL_VERSION: %s", glGetString (GL_VERSION));
 
-    GST_INFO ("GL_VERSION: %s", glGetString (GL_VERSION));
 #ifndef OPENGL_ES2
     GST_INFO ("GLEW_VERSION: %s", glewGetString (GLEW_VERSION));
 #endif
@@ -609,20 +609,38 @@ gst_gl_display_thread_create_context (GstGLDisplay * display)
     else
       GST_INFO ("Your driver does not support GLSL (OpenGL Shading Language)");
 
-    GST_INFO ("GL_VENDOR: %s", glGetString (GL_VENDOR));
-    GST_INFO ("GL_RENDERER: %s", glGetString (GL_RENDERER));
+    if (glGetString (GL_VENDOR))
+      GST_INFO ("GL_VENDOR: %s", glGetString (GL_VENDOR));
 
-    g_string_free (opengl_version, TRUE);
+    if (glGetString (GL_RENDERER))
+      GST_INFO ("GL_RENDERER: %s", glGetString (GL_RENDERER));
 
+
+    gl_err = glGetError ();
+    if (gl_err != GL_NO_ERROR) {
+      gst_gl_display_set_error (display, "glGetString error: 0x%x", gl_err);
+    }
 #ifndef OPENGL_ES2
-    if ((opengl_version_major < 1) ||
-        (GLEW_VERSION_MAJOR < 1) ||
-        (opengl_version_major < 2 && opengl_version_major >= 1
-            && opengl_version_minor < 2) || (GLEW_VERSION_MAJOR < 2
-            && GLEW_VERSION_MAJOR >= 1 && GLEW_VERSION_MINOR < 4)) {
-      //turn off the pipeline, the old drivers are not yet supported
-      gst_gl_display_set_error (display,
-          "Required OpenGL >= 1.2.0 and Glew >= 1.4.0");
+    if (glGetString (GL_VERSION) && gl_err == GL_NO_ERROR) {
+
+      opengl_version =
+          g_string_truncate (g_string_new ((gchar *) glGetString (GL_VERSION)),
+          3);
+
+      sscanf (opengl_version->str, "%d.%d", &opengl_version_major,
+          &opengl_version_minor);
+
+      g_string_free (opengl_version, TRUE);
+
+      if ((opengl_version_major < 1) ||
+          (GLEW_VERSION_MAJOR < 1) ||
+          (opengl_version_major < 2 && opengl_version_major >= 1
+              && opengl_version_minor < 2) || (GLEW_VERSION_MAJOR < 2
+              && GLEW_VERSION_MAJOR >= 1 && GLEW_VERSION_MINOR < 4)) {
+        //turn off the pipeline, the old drivers are not yet supported
+        gst_gl_display_set_error (display,
+            "Required OpenGL >= 1.2.0 and Glew >= 1.4.0");
+      }
     }
 #else
     if (!GL_ES_VERSION_2_0) {
@@ -3360,10 +3378,10 @@ gst_gl_display_thread_do_download_draw_rgb (GstGLDisplay * display)
   }
 
 #ifndef OPENGL_ES2
-  glDisable (GL_TEXTURE_RECTANGLE_ARB);
-#else
   glReadBuffer (GL_NONE);
 #endif
+
+  glDisable (GL_TEXTURE_RECTANGLE_ARB);
 }
 
 
index 8c991b4..b4489c2 100644 (file)
@@ -61,7 +61,8 @@ gst_gl_shader_finalize (GObject * object)
 {
   GstGLShader *shader;
   GstGLShaderPrivate *priv;
-/*  GLint status = GL_FALSE; */
+  /*  GLint status = GL_FALSE; */
+  /* GLenum err = 0; */
 
   shader = GST_GL_SHADER (object);
   priv = shader->priv;
@@ -76,8 +77,10 @@ gst_gl_shader_finalize (GObject * object)
 
   /* delete program */
   if (priv->program_handle) {
+    g_debug ("finalizing program shader %ud", priv->program_handle);
+
     glDeleteObjectARB (priv->program_handle);
-    glGetError ();
+    /* err = glGetError (); */
     /* g_debug ("error: 0x%x", err);  */
     /* glGetObjectParameterivARB(priv->program_handle, GL_OBJECT_DELETE_STATUS_ARB, &status); */
     /* g_debug ("program deletion status:%s", status == GL_TRUE ? "true" : "false" ); */
@@ -258,6 +261,8 @@ gst_gl_shader_init (GstGLShader * self)
 
   g_log_set_handler ("GstGLShader", G_LOG_LEVEL_DEBUG,
       gst_gl_shader_log_handler, NULL);
+
+  g_debug ("shader initialized %ud", priv->program_handle);
 }
 
 GstGLShader *
@@ -390,6 +395,8 @@ gst_gl_shader_release (GstGLShader * shader)
     return;
 
   if (priv->vertex_handle) {    // not needed but nvidia doesn't care to respect the spec
+    g_debug ("finalizing vertex shader %ud", priv->vertex_handle);
+
     glDeleteObjectARB (priv->vertex_handle);
 
     /* err = glGetError (); */
@@ -399,6 +406,8 @@ gst_gl_shader_release (GstGLShader * shader)
   }
 
   if (priv->fragment_handle) {
+    g_debug ("finalizing fragment shader %ud", priv->fragment_handle);
+
     glDeleteObjectARB (priv->fragment_handle);
 
     /* err = glGetError (); */
index dbde73d..9430875 100644 (file)
@@ -91,7 +91,8 @@ G_DEFINE_TYPE (GstGLWindow, gst_gl_window, G_TYPE_OBJECT);
 
 gboolean _gst_gl_window_debug = FALSE;
 
-void gst_gl_window_init_platform ()
+void
+gst_gl_window_init_platform ()
 {
 }
 
@@ -398,9 +399,12 @@ gst_gl_window_new (gulong external_gl_context)
         (gulong) priv->gl_display, (gulong) priv->gl_surface,
         (gulong) priv->gl_display, EGLErrorString ());
 
+  g_debug ("about to create gl context\n");
+
   priv->gl_context =
       eglCreateContext (priv->gl_display, config,
       (EGLContext) (guint) external_gl_context, context_attrib);
+
   if (priv->gl_context != EGL_NO_CONTEXT)
     g_debug ("gl context created: %ld\n", (gulong) priv->gl_context);
   else
@@ -669,13 +673,13 @@ gst_gl_window_run_loop (GstGLWindow * window)
           if (priv->running) {
 #if SIZEOF_VOID_P == 8
             GstGLWindowCB custom_cb =
-                (GstGLWindowCB) (((event.xclient.data.
-                        l[0] & 0xffffffff) << 32) | (event.xclient.data.
-                    l[1] & 0xffffffff));
+                (GstGLWindowCB) (((event.xclient.
+                        data.l[0] & 0xffffffff) << 32) | (event.xclient.
+                    data.l[1] & 0xffffffff));
             gpointer custom_data =
-                (gpointer) (((event.xclient.data.
-                        l[2] & 0xffffffff) << 32) | (event.xclient.data.
-                    l[3] & 0xffffffff));
+                (gpointer) (((event.xclient.
+                        data.l[2] & 0xffffffff) << 32) | (event.xclient.
+                    data.l[3] & 0xffffffff));
 #else
             GstGLWindowCB custom_cb = (GstGLWindowCB) event.xclient.data.l[0];
             gpointer custom_data = (gpointer) event.xclient.data.l[1];
@@ -711,13 +715,13 @@ gst_gl_window_run_loop (GstGLWindow * window)
             && event.xclient.message_type == wm_quit_loop) {
 #if SIZEOF_VOID_P == 8
           GstGLWindowCB destroy_cb =
-              (GstGLWindowCB) (((event.xclient.data.
-                      l[0] & 0xffffffff) << 32) | (event.xclient.data.
-                  l[1] & 0xffffffff));
+              (GstGLWindowCB) (((event.xclient.
+                      data.l[0] & 0xffffffff) << 32) | (event.xclient.
+                  data.l[1] & 0xffffffff));
           gpointer destroy_data =
-              (gpointer) (((event.xclient.data.
-                      l[2] & 0xffffffff) << 32) | (event.xclient.data.
-                  l[3] & 0xffffffff));
+              (gpointer) (((event.xclient.
+                      data.l[2] & 0xffffffff) << 32) | (event.xclient.
+                  data.l[3] & 0xffffffff));
 #else
           GstGLWindowCB destroy_cb = (GstGLWindowCB) event.xclient.data.l[0];
           gpointer destroy_data = (gpointer) event.xclient.data.l[1];
@@ -733,13 +737,13 @@ gst_gl_window_run_loop (GstGLWindow * window)
           while (XCheckTypedEvent (priv->device, ClientMessage, &pending_event)) {
 #if SIZEOF_VOID_P == 8
             GstGLWindowCB custom_cb =
-                (GstGLWindowCB) (((event.xclient.data.
-                        l[0] & 0xffffffff) << 32) | (event.xclient.data.
-                    l[1] & 0xffffffff));
+                (GstGLWindowCB) (((event.xclient.
+                        data.l[0] & 0xffffffff) << 32) | (event.xclient.
+                    data.l[1] & 0xffffffff));
             gpointer custom_data =
-                (gpointer) (((event.xclient.data.
-                        l[2] & 0xffffffff) << 32) | (event.xclient.data.
-                    l[3] & 0xffffffff));
+                (gpointer) (((event.xclient.
+                        data.l[2] & 0xffffffff) << 32) | (event.xclient.
+                    data.l[3] & 0xffffffff));
 #else
             GstGLWindowCB custom_cb = (GstGLWindowCB) event.xclient.data.l[0];
             gpointer custom_data = (gpointer) event.xclient.data.l[1];