egl: add Wayland extended platform support
authorRémi Denis-Courmont <remi@remlab.net>
Wed, 27 Aug 2014 17:11:24 +0000 (20:11 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Thu, 16 Oct 2014 17:23:39 +0000 (20:23 +0300)
This enables OpenGL/OpenGL ES through Wayland.

configure.ac
modules/video_output/Makefile.am
modules/video_output/egl.c

index a1810b2..6fab05b 100644 (file)
@@ -3205,8 +3205,19 @@ AS_IF([test "${enable_wayland}" != "no"], [
       AC_MSG_ERROR([${WAYLAND_CLIENT_PKG_ERRORS}.])
     ])
   ])
+
+  AS_IF([test "${have_egl}" = "yes"], [
+    PKG_CHECK_MODULES([WAYLAND_EGL], [wayland-egl], [
+      have_wayland_egl="yes"
+    ], [
+      AS_IF([test -n "${enable_wayland}"], [
+        AC_MSG_ERROR([${WAYLAND_EGL_PKG_ERRORS}.])
+      ])
+    ])
+  ])
 ])
 AM_CONDITIONAL([HAVE_WAYLAND], [test "${have_wayland}" = "yes"])
+AM_CONDITIONAL([HAVE_WAYLAND_EGL], [test "${have_wayland_egl}" = "yes"])
 
 
 dnl
index c5db372..326a5a5 100644 (file)
@@ -145,6 +145,14 @@ if HAVE_WAYLAND
 vout_LTLIBRARIES += libwl_shell_surface_plugin.la
 endif
 
+libegl_wl_plugin_la_SOURCES = video_output/egl.c
+libegl_wl_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_PLATFORM_WAYLAND=1
+libegl_wl_plugin_la_CFLAGS = $(AM_CFLAGS) $(EGL_CFLAGS) $(WAYLAND_EGL_CFLAGS)
+libegl_wl_plugin_la_LIBADD = $(EGL_LIBS) $(WAYLAND_EGL_LIBS)
+if HAVE_EGL
+vout_LTLIBRARIES += libegl_wl_plugin.la
+endif
+
 
 ### Win32 ###
 libdirect2d_plugin_la_SOURCES = video_output/msw/direct2d.c \
index 81eaed3..adbc94e 100644 (file)
@@ -3,7 +3,7 @@
  * @brief EGL OpenGL extension module
  */
 /*****************************************************************************
- * Copyright © 2010-2011 Rémi Denis-Courmont
+ * Copyright © 2010-2014 Rémi Denis-Courmont
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU Lesser General Public License as published by
@@ -36,6 +36,9 @@
 #ifdef USE_PLATFORM_X11
 # include <vlc_xlib.h>
 #endif
+#ifdef USE_PLATFORM_WAYLAND
+# include <wayland-egl.h>
+#endif
 
 typedef struct vlc_gl_sys_t
 {
@@ -45,6 +48,10 @@ typedef struct vlc_gl_sys_t
 #if defined (USE_PLATFORM_X11)
     Display *x11;
 #endif
+#if defined (USE_PLATFORM_WAYLAND)
+    struct wl_egl_window *window;
+    unsigned width, height;
+#endif
 } vlc_gl_sys_t;
 
 static int MakeCurrent (vlc_gl_t *gl)
@@ -65,6 +72,21 @@ static void ReleaseCurrent (vlc_gl_t *gl)
                     EGL_NO_CONTEXT);
 }
 
+#ifdef USE_PLATFORM_WAYLAND
+static void Resize (vlc_gl_t *gl, unsigned width, unsigned height)
+{
+    vlc_gl_sys_t *sys = gl->sys;
+
+    wl_egl_window_resize(sys->window, width, height,
+                         (sys->width - width) / 2,
+                         (sys->height - height) / 2);
+    sys->width = width;
+    sys->height = height;
+}
+#else
+# define Resize (NULL)
+#endif
+
 static void SwapBuffers (vlc_gl_t *gl)
 {
     vlc_gl_sys_t *sys = gl->sys;
@@ -161,6 +183,10 @@ static void Close (vlc_object_t *obj)
 #ifdef USE_PLATFORM_X11
     if (sys->x11 != NULL)
         XCloseDisplay(sys->x11);
+#endif
+#ifdef USE_PLATFORM_WAYLAND
+    if (sys->window != NULL)
+        wl_egl_window_destroy(sys->window);
 #endif
     free (sys);
 }
@@ -222,6 +248,28 @@ static int Open (vlc_object_t *obj, const struct gl_api *api)
     }
 # endif
 
+#elif defined (USE_PLATFORM_WAYLAND)
+    sys->window = NULL;
+
+    if (wnd->type != VOUT_WINDOW_TYPE_WAYLAND)
+        goto error;
+
+# ifdef EGL_EXT_platform_wayland
+    if (!CheckClientExt("EGL_EXT_platform_wayland"))
+        goto error;
+
+    /* Resize() should be called with the proper size before Swap() */
+    window = wl_egl_window_create(wnd->handle.wl, 1, 1);
+    if (window == NULL)
+        goto error;
+    sys->window = window;
+
+    sys->display = GetDisplayEXT(EGL_PLATFORM_WAYLAND_EXT, wnd->display.wl,
+                                 NULL);
+    createSurface = CreateWindowSurfaceEXT;
+
+# endif
+
 #elif defined (USE_PLATFORM_WIN32)
     if (wnd->type != VOUT_WINDOW_TYPE_HWND)
         goto error;
@@ -308,7 +356,7 @@ static int Open (vlc_object_t *obj, const struct gl_api *api)
     /* Initialize OpenGL callbacks */
     gl->makeCurrent = MakeCurrent;
     gl->releaseCurrent = ReleaseCurrent;
-    gl->resize = NULL;
+    gl->resize = Resize;
     gl->swap = SwapBuffers;
     gl->getProcAddress = GetSymbol;
     gl->lock = NULL;