From badaaaec345fc7fd08dce0ad3dfb8b0330061f1d Mon Sep 17 00:00:00 2001 From: Julien Isorce Date: Fri, 13 Apr 2012 12:38:11 +0200 Subject: [PATCH] [491/906] glES2.0: properly fails if driver/kernel inconsistency --- gst-libs/gst/gl/gstgldisplay.c | 58 +++++++++++++++++++++++------------- gst-libs/gst/gl/gstglshader.c | 13 ++++++-- gst-libs/gst/gl/gstglwindow_x11ES2.c | 42 ++++++++++++++------------ 3 files changed, 72 insertions(+), 41 deletions(-) diff --git a/gst-libs/gst/gl/gstgldisplay.c b/gst-libs/gst/gl/gstgldisplay.c index 5ccccb8..e5b6bff 100644 --- a/gst-libs/gst/gl/gstgldisplay.c +++ b/gst-libs/gst/gl/gstgldisplay.c @@ -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); } diff --git a/gst-libs/gst/gl/gstglshader.c b/gst-libs/gst/gl/gstglshader.c index 8c991b4..b4489c2 100644 --- a/gst-libs/gst/gl/gstglshader.c +++ b/gst-libs/gst/gl/gstglshader.c @@ -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 (); */ diff --git a/gst-libs/gst/gl/gstglwindow_x11ES2.c b/gst-libs/gst/gl/gstglwindow_x11ES2.c index dbde73d..9430875 100644 --- a/gst-libs/gst/gl/gstglwindow_x11ES2.c +++ b/gst-libs/gst/gl/gstglwindow_x11ES2.c @@ -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]; -- 2.7.4