[491/906] glES2.0: properly fails if driver/kernel inconsistency

This commit is contained in:
Julien Isorce 2012-04-13 12:38:11 +02:00 committed by Matthew Waters
parent 2394987226
commit 052c23c3c5
5 changed files with 80 additions and 42 deletions

View 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);
}

View 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 (); */

View 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];

View file

@ -42,7 +42,8 @@ gst_gl_effects_squeeze_callback (gint width, gint height, guint texture,
gst_gl_shader_compile (shader, &error);
if (error) {
gst_gl_display_set_error (effects->display,
GstGLFilter *filter = GST_GL_FILTER (effects);
gst_gl_display_set_error (filter->display,
"Failed to initialize squeeze shader, %s", error->message);
g_error_free (error);
error = NULL;

View file

@ -427,6 +427,12 @@ gst_glimage_sink_change_state (GstElement * element, GstStateChange transition)
if (!ok) {
GST_ELEMENT_ERROR (glimage_sink, RESOURCE, NOT_FOUND,
(GST_GL_DISPLAY_ERR_MSG (glimage_sink->display)), (NULL));
if (glimage_sink->display) {
g_object_unref (glimage_sink->display);
glimage_sink->display = NULL;
}
return GST_STATE_CHANGE_FAILURE;
}
}