From 380f9188027257fc9cf1d815f10abdfb50207af2 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Sun, 16 Jun 2013 20:37:06 +1000 Subject: [PATCH] [711/906] wayland: support choosing Desktop GL as the api --- .../gst/gl/wayland/gstglwindow_wayland_egl.c | 46 +++++++++++++++++-- .../gst/gl/wayland/gstglwindow_wayland_egl.h | 2 + gst-libs/gst/gl/x11/gstglwindow_x11_egl.c | 12 +++-- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c index 036e265ab6..f9d776ec05 100644 --- a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c +++ b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c @@ -285,6 +285,7 @@ gst_gl_window_wayland_egl_class_init (GstGLWindowWaylandEGLClass * klass) static void gst_gl_window_wayland_egl_init (GstGLWindowWaylandEGL * window) { + window->gl_api = GST_GL_API_NONE; } /* Must be called in the gl thread */ @@ -408,10 +409,45 @@ gst_gl_window_wayland_egl_create_context (GstGLWindow * window, goto failure; } - if (!eglBindAPI (EGL_OPENGL_ES_API)) { - g_set_error (error, GST_GL_WINDOW_ERROR, GST_GL_WINDOW_ERROR_FAILED, - "Failed to bind OpenGL|ES API: %s", WlEGLErrorString ()); - goto failure; + if (gl_api & GST_GL_API_OPENGL) { + /* egl + opengl only available with EGL 1.4+ */ + if (majorVersion == 1 && minorVersion <= 3) { + if ((gl_api & ~GST_GL_API_OPENGL) == GST_GL_API_NONE) { + g_set_error (error, GST_GL_WINDOW_ERROR, GST_GL_WINDOW_ERROR_OLD_LIBS, + "EGL version (%i.%i) too old for OpenGL support, (needed at least 1.4)", + majorVersion, minorVersion); + goto failure; + } else { + GST_WARNING + ("EGL version (%i.%i) too old for OpenGL support, (needed at least 1.4)", + majorVersion, minorVersion); + if (gl_api & GST_GL_API_GLES2) { + goto try_gles2; + } else { + g_set_error (error, GST_GL_WINDOW_ERROR, + GST_GL_WINDOW_ERROR_WRONG_CONFIG, + "Failed to choose a suitable OpenGL API"); + goto failure; + } + } + } + + if (!eglBindAPI (EGL_OPENGL_API)) { + g_set_error (error, GST_GL_WINDOW_ERROR, GST_GL_WINDOW_ERROR_FAILED, + "Failed to bind OpenGL|ES API: %s", WlEGLErrorString ()); + goto failure; + } + + window_egl->gl_api = GST_GL_API_OPENGL; + } else if (gl_api & GST_GL_API_GLES2) { + try_gles2: + if (!eglBindAPI (EGL_OPENGL_ES_API)) { + g_set_error (error, GST_GL_WINDOW_ERROR, GST_GL_WINDOW_ERROR_FAILED, + "Failed to bind OpenGL|ES API: %s", WlEGLErrorString ()); + goto failure; + } + + window_egl->gl_api = GST_GL_API_GLES2; } if (eglChooseConfig (window_egl->egl_display, config_attrib, @@ -503,7 +539,7 @@ gst_gl_window_wayland_egl_get_gl_context (GstGLWindow * window) static GstGLAPI gst_gl_window_wayland_egl_get_gl_api (GstGLWindow * window) { - return GST_GL_API_GLES2; + return GST_GL_WINDOW_WAYLAND_EGL (window)->gl_api; } static void diff --git a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h index 27bd75bda3..d7a3105b19 100644 --- a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h +++ b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h @@ -86,6 +86,8 @@ struct _GstGLWindowWaylandEGL { GMainContext *main_context; GMainLoop *loop; + GstGLAPI gl_api; + gpointer _reserved[GST_PADDING]; }; diff --git a/gst-libs/gst/gl/x11/gstglwindow_x11_egl.c b/gst-libs/gst/gl/x11/gstglwindow_x11_egl.c index be655ba2db..e8af67107e 100644 --- a/gst-libs/gst/gl/x11/gstglwindow_x11_egl.c +++ b/gst-libs/gst/gl/x11/gstglwindow_x11_egl.c @@ -186,10 +186,14 @@ gst_gl_window_x11_egl_create_context (GstGLWindowX11 * window_x11, GST_WARNING ("EGL version (%i.%i) too old for OpenGL support, (needed at least 1.4)", majorVersion, minorVersion); - if (gl_api & GST_GL_API_GLES2) + if (gl_api & GST_GL_API_GLES2) { goto try_gles2; - else + } else { + g_set_error (error, GST_GL_WINDOW_ERROR, + GST_GL_WINDOW_ERROR_WRONG_CONFIG, + "Failed to choose a suitable OpenGL API"); goto failure; + } } } @@ -301,8 +305,8 @@ gst_gl_window_x11_egl_get_gl_api (GstGLWindow * window) { GstGLWindowX11EGL *window_egl = GST_GL_WINDOW_X11_EGL (window); - return window_egl-> - gl_api ? window_egl->gl_api : GST_GL_API_GLES2 | GST_GL_API_OPENGL; + return window_egl->gl_api ? window_egl-> + gl_api : GST_GL_API_GLES2 | GST_GL_API_OPENGL; } static gpointer