From: Matthew Waters Date: Sat, 18 Jul 2015 07:19:18 +0000 (+1000) Subject: glcontext: fix get_current_gl_api on x11/nvidia drivers X-Git-Tag: 1.19.3~507^2~8304 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d5996de5d7b2153f70edda60e993406137ee19b8;p=platform%2Fupstream%2Fgstreamer.git glcontext: fix get_current_gl_api on x11/nvidia drivers They require to get_proc_address some functions through the platform specific {glX,egl}GetProcAddress rather than the default GL library symbol lookup. --- diff --git a/ext/gtk/gtkgstglwidget.c b/ext/gtk/gtkgstglwidget.c index a17dd6b..c2cc46b 100644 --- a/ext/gtk/gtkgstglwidget.c +++ b/ext/gtk/gtkgstglwidget.c @@ -477,7 +477,7 @@ _get_gl_context (GtkGstGLWidget * gst_widget) #if GST_GL_HAVE_WINDOW_X11 && defined (GDK_WINDOWING_X11) if (GST_IS_GL_DISPLAY_X11 (priv->display)) { platform = GST_GL_PLATFORM_GLX; - gl_api = gst_gl_context_get_current_gl_api (NULL, NULL); + gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL); gl_handle = gst_gl_context_get_current_gl_context (platform); if (gl_handle) priv->other_context = @@ -488,7 +488,7 @@ _get_gl_context (GtkGstGLWidget * gst_widget) #if GST_GL_HAVE_WINDOW_WAYLAND && defined (GDK_WINDOWING_WAYLAND) if (GST_IS_GL_DISPLAY_WAYLAND (priv->display)) { platform = GST_GL_PLATFORM_EGL; - gl_api = gst_gl_context_get_current_gl_api (NULL, NULL); + gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL); gl_handle = gst_gl_context_get_current_gl_context (platform); if (gl_handle) priv->other_context = diff --git a/ext/qt/qtitem.cc b/ext/qt/qtitem.cc index fab2c5d..7686a73 100644 --- a/ext/qt/qtitem.cc +++ b/ext/qt/qtitem.cc @@ -262,7 +262,7 @@ QtGLVideoItem::onSceneGraphInitialized () #if GST_GL_HAVE_WINDOW_X11 && defined (HAVE_QT_X11) if (GST_IS_GL_DISPLAY_X11 (this->priv->display)) { platform = GST_GL_PLATFORM_GLX; - gl_api = gst_gl_context_get_current_gl_api (NULL, NULL); + gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL); gl_handle = gst_gl_context_get_current_gl_context (platform); if (gl_handle) this->priv->other_context = @@ -273,7 +273,7 @@ QtGLVideoItem::onSceneGraphInitialized () #if GST_GL_HAVE_WINDOW_WAYLAND if (GST_IS_GL_DISPLAY_WAYLAND (this->priv->display)) { platform = GST_GL_PLATFORM_EGL; - gl_api = gst_gl_context_get_current_gl_api (NULL, NULL); + gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL); gl_handle = gst_gl_context_get_current_gl_context (platform); if (gl_handle) this->priv->other_context = diff --git a/gst-libs/gst/gl/cocoa/gstglcaopengllayer.m b/gst-libs/gst/gl/cocoa/gstglcaopengllayer.m index 8ba1e1b..9362bca 100644 --- a/gst-libs/gst/gl/cocoa/gstglcaopengllayer.m +++ b/gst-libs/gst/gl/cocoa/gstglcaopengllayer.m @@ -117,7 +117,7 @@ _context_ready (gpointer data) display = gst_gl_context_get_display (GST_GL_CONTEXT (self->gst_gl_context)); self->draw_context = gst_gl_context_new_wrapped (display, (guintptr) self->gl_context, GST_GL_PLATFORM_CGL, - gst_gl_context_get_current_gl_api (NULL, NULL)); + gst_gl_context_get_current_gl_api (GST_GL_PLATFORM_CGL, NULL, NULL)); gst_object_unref (display); if (!self->draw_context) { diff --git a/gst-libs/gst/gl/gstglcontext.c b/gst-libs/gst/gl/gstglcontext.c index a8e4af0..d4a286f 100644 --- a/gst-libs/gst/gl/gstglcontext.c +++ b/gst-libs/gst/gl/gstglcontext.c @@ -411,7 +411,7 @@ gst_gl_context_new_wrapped (GstGLDisplay * display, guintptr handle, if (context_type == GST_GL_PLATFORM_CGL) { context_class->get_current_context = gst_gl_context_cocoa_get_current_context; - context_class->get_proc_address = _default_get_proc_address; + context_class->get_proc_address = gst_gl_context_default_get_proc_address; } #endif #if GST_GL_HAVE_PLATFORM_WGL @@ -424,7 +424,7 @@ gst_gl_context_new_wrapped (GstGLDisplay * display, guintptr handle, if (context_type == GST_GL_PLATFORM_EAGL) { context_class->get_current_context = gst_gl_context_eagl_get_current_context; - context_class->get_proc_address = _default_get_proc_address; + context_class->get_proc_address = gst_gl_context_default_get_proc_address; } #endif @@ -507,6 +507,7 @@ gst_gl_context_get_proc_address_with_platform (GstGLPlatform context_type, /** * gst_gl_context_get_current_gl_api: + * @platform: the #GstGLPlatform to retreive the API for * @major: (out): (allow-none): the major version * @minor: (out): (allow-none): the minor version * @@ -519,7 +520,8 @@ gst_gl_context_get_proc_address_with_platform (GstGLPlatform context_type, * Since: 1.6 */ GstGLAPI -gst_gl_context_get_current_gl_api (guint * major, guint * minor) +gst_gl_context_get_current_gl_api (GstGLPlatform platform, guint * major, + guint * minor) { const GLubyte *(*GetString) (GLenum name); #if GST_GL_HAVE_OPENGL @@ -533,10 +535,13 @@ gst_gl_context_get_current_gl_api (guint * major, guint * minor) while (ret != GST_GL_API_NONE) { /* FIXME: attempt to delve into the platform specific GetProcAddress */ - GetString = gst_gl_context_default_get_proc_address (ret, "glGetString"); + GetString = + gst_gl_context_get_proc_address_with_platform (platform, ret, + "glGetString"); #if GST_GL_HAVE_OPENGL GetIntegerv = - gst_gl_context_default_get_proc_address (ret, "glGetIntegerv"); + gst_gl_context_get_proc_address_with_platform (platform, ret, + "glGetIntegerv"); #endif if (!GetString) { goto next; diff --git a/gst-libs/gst/gl/gstglcontext.h b/gst-libs/gst/gl/gstglcontext.h index ee8953e..16b9d11 100644 --- a/gst-libs/gst/gl/gstglcontext.h +++ b/gst-libs/gst/gl/gstglcontext.h @@ -146,7 +146,7 @@ gboolean gst_gl_context_check_gl_version (GstGLContext * context, GstGLAPI gboolean gst_gl_context_check_feature (GstGLContext *context, const gchar *feature); guintptr gst_gl_context_get_current_gl_context (GstGLPlatform platform); -GstGLAPI gst_gl_context_get_current_gl_api (guint *major, guint *minor); +GstGLAPI gst_gl_context_get_current_gl_api (GstGLPlatform platform, guint *major, guint *minor); gboolean gst_gl_context_fill_info (GstGLContext * context, GError ** error); diff --git a/tests/check/libs/gstglcontext.c b/tests/check/libs/gstglcontext.c index d83d41d..907d081 100644 --- a/tests/check/libs/gstglcontext.c +++ b/tests/check/libs/gstglcontext.c @@ -401,7 +401,9 @@ static void _fill_context_info (GstGLContext * context, struct context_info *info) { info->handle = gst_gl_context_get_current_gl_context (info->platform); - info->api = gst_gl_context_get_current_gl_api (&info->major, &info->minor); + info->api = + gst_gl_context_get_current_gl_api (info->platform, &info->major, + &info->minor); } GST_START_TEST (test_current_context)