mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-16 11:15:31 +00:00
[491/906] glES2.0: properly fails if driver/kernel inconsistency
This commit is contained in:
parent
2394987226
commit
052c23c3c5
5 changed files with 80 additions and 42 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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 (); */
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue