libs: egl: utils: use eglGetPlatformDisplay()

eglGetDisplay() is currently broken in Mesa for Wayland.  Also using
eglGetDisplay() is rather fragile, and it is recommended to use
eglGetPlatformDisplay() when possible.

In order to do that, this patch uses the helper in GstGL. If
gstreamer-vaapi is not compiled with GstGL support, eglGetDisplay()
will be used.

https://bugzilla.gnome.org/show_bug.cgi?id=790493
This commit is contained in:
Víctor Manuel Jáquez Leal 2017-12-01 15:04:35 +01:00
parent aed4088967
commit 7e05160aaa
4 changed files with 60 additions and 7 deletions

View file

@ -476,6 +476,7 @@ libgstvaapi_egl_la_CFLAGS = \
$(GMODULE_CFLAGS) \
$(GST_BASE_CFLAGS) \
$(GST_VIDEO_CFLAGS) \
$(GST_GL_CFLAGS) \
$(LIBVA_CFLAGS) \
$(LIBVA_WAYLAND_CFLAGS) \
$(EGL_CFLAGS) \
@ -487,6 +488,7 @@ libgstvaapi_egl_la_LIBADD = \
$(GST_LIBS) \
$(GST_BASE_LIBS) \
$(GST_VIDEO_LIBS) \
$(GST_GL_LIBS) \
$(EGL_LIBS) \
$(NULL)

View file

@ -100,6 +100,7 @@ gst_vaapi_display_egl_bind_display (GstVaapiDisplay * base_display,
GstVaapiDisplay *native_display = NULL;
GstVaapiDisplayEGL *display = GST_VAAPI_DISPLAY_EGL (base_display);
EglDisplay *egl_display;
guint gl_platform = EGL_PLATFORM_UNKNOWN;
const InitParams *params = (InitParams *) native_params;
if (params->display) {
@ -118,7 +119,19 @@ gst_vaapi_display_egl_bind_display (GstVaapiDisplay * base_display,
gst_vaapi_display_replace (&display->display, native_display);
egl_display = egl_display_new (GST_VAAPI_DISPLAY_NATIVE (display->display));
switch (GST_VAAPI_DISPLAY_GET_CLASS_TYPE (display->display)) {
case GST_VAAPI_DISPLAY_TYPE_X11:
gl_platform = EGL_PLATFORM_X11;
break;
case GST_VAAPI_DISPLAY_TYPE_WAYLAND:
gl_platform = EGL_PLATFORM_WAYLAND;
break;
default:
break;
}
egl_display = egl_display_new (GST_VAAPI_DISPLAY_NATIVE (display->display),
gl_platform);
if (!egl_display)
return FALSE;

View file

@ -22,6 +22,9 @@
#include "sysdeps.h"
#include "gstvaapiutils_egl.h"
#if USE_GST_GL_HELPERS
# include <gst/gl/egl/gstgldisplay_egl.h>
#endif
#define DEBUG 1
#include "gstvaapidebug.h"
@ -534,6 +537,31 @@ egl_display_run (EglDisplay * display, EglContextRunFunc func, gpointer args)
return TRUE;
}
static gpointer
egl_get_display_from_native (guintptr native_display, guint gl_platform)
{
#if USE_GST_GL_HELPERS
EGLDisplay ret;
GstGLDisplayType display_type = GST_GL_DISPLAY_TYPE_ANY;
switch (gl_platform) {
case EGL_PLATFORM_X11:
display_type = GST_GL_DISPLAY_TYPE_X11;
break;
case EGL_PLATFORM_WAYLAND:
display_type = GST_GL_DISPLAY_TYPE_WAYLAND;
break;
default:
break;
}
ret = gst_gl_display_egl_get_from_native (display_type, native_display);
if (ret != EGL_NO_DISPLAY)
return ret;
#endif
return eglGetDisplay ((EGLNativeDisplayType) native_display);
}
static gpointer
egl_display_thread (gpointer data)
{
@ -543,7 +571,9 @@ egl_display_thread (gpointer data)
gchar **gl_apis, **gl_api;
if (!display->base.is_wrapped) {
gl_display = display->base.handle.p = eglGetDisplay (gl_display);
gl_display = display->base.handle.p =
egl_get_display_from_native (display->base.handle.u,
display->gl_platform);
if (!gl_display)
goto error;
if (!eglInitialize (gl_display, &major_version, &minor_version))
@ -643,7 +673,7 @@ egl_display_finalize (EglDisplay * display)
}
static EglDisplay *
egl_display_new_full (gpointer handle, gboolean is_wrapped)
egl_display_new_full (gpointer handle, gboolean is_wrapped, guint platform)
{
EglDisplay *display;
@ -653,6 +683,7 @@ egl_display_new_full (gpointer handle, gboolean is_wrapped)
display->base.handle.p = handle;
display->base.is_wrapped = is_wrapped;
display->gl_platform = platform;
if (!egl_display_init (display))
goto error;
return display;
@ -666,11 +697,11 @@ error:
}
EglDisplay *
egl_display_new (gpointer native_display)
egl_display_new (gpointer native_display, guint platform)
{
g_return_val_if_fail (native_display != NULL, NULL);
return egl_display_new_full (native_display, FALSE);
return egl_display_new_full (native_display, FALSE, platform);
}
EglDisplay *
@ -678,7 +709,7 @@ egl_display_new_wrapped (EGLDisplay gl_display)
{
g_return_val_if_fail (gl_display != EGL_NO_DISPLAY, NULL);
return egl_display_new_full (gl_display, TRUE);
return egl_display_new_full (gl_display, TRUE, EGL_PLATFORM_UNKNOWN);
}
/* ------------------------------------------------------------------------- */

View file

@ -51,6 +51,12 @@ typedef struct egl_window_s EglWindow;
#define GL_PROTO_END() ;
#include "egl_vtable.h"
enum {
EGL_PLATFORM_UNKNOWN,
EGL_PLATFORM_X11,
EGL_PLATFORM_WAYLAND,
};
union egl_handle_s
{
gpointer p;
@ -109,6 +115,7 @@ struct egl_display_s
gchar *gl_version_string;
gchar *gl_apis_string;
guint gl_apis; /* EGL_*_BIT mask */
guint gl_platform;
GMutex mutex;
GThread *gl_thread;
@ -187,7 +194,7 @@ struct egl_window_s
G_GNUC_INTERNAL
EglDisplay *
egl_display_new (gpointer native_display);
egl_display_new (gpointer native_display, guint gl_platform);
G_GNUC_INTERNAL
EglDisplay *