[vlc-devel] [PATCH] video_output: refactor vlc_gl_api into opengl providers

Thomas Guillem thomas at gllm.fr
Mon Sep 21 14:49:12 CEST 2020



On Mon, Sep 21, 2020, at 12:58, Alexandre Janniaux wrote:
> This is part 4/ of the RFC OpenGL filter refactor implementation aiming
> at reworking the OpenGL providers to be the sole linker to OpenGL
> libraries.
> 
> Currently, OpenGL providers are linking the provider libraries like EGL,
> GLX, or CoreVideo but OpenGL is already sometimes needed to those kind
> of modules. But in the general case, OpenGL / OpenGL ES must be linked
> to the clinets modules, using the VLC OpenGL vtable because they need to
> load it themselves and it's not always done in a dynamic way through
> GetProcAddress mechanisms.
> 
> Instead, link OpenGL / OpenGL ES to the provider modules bringing the
> OpenGL features themselves. In particular, on Apple systems, it avoid
> the need to link OpenGL framework to every OpenGL users, thus needing
> special handling in buildsystem, and on other systems exposing both
> OpenGL and OpenGL ES, it prepares to have different targets for both
> variants in the future too.
> 
> It also prepares defining tools for automatically testing shaders even
> though they would be generated dynamically during runtime, and defining
> layers for debugging purpose.
> 
> This is also fixing the current issues on Windows where the functions
> are dynamically loaded through WGL, but not found instead of being
> dynamically linked like the Windows environment expects.
> 
> The last pain point for independence stem from the OpenGL headers
> themselves which are different between OpenGL and OpenGL ES. Note that
> this patchset doesn't do the necessary refactor to avoid using `gl`
> pointer in OpenGL code that would only use the `api` field, so there are
> multiple places in which some modules actually have access to different
> api pointer, though it's the same. Given the complexity for testing this
> code, and the fact it fixes the Windows GL provider too, I evaluated
> that merging it first was an acceptable tradeoff and it is left for a
> future refactor.
> 
> Tested on iOS, MacOSX (macosx.m), Windows and Linux.
> ---
>  include/vlc_opengl.h                      |  2 ++
>  modules/video_output/Makefile.am          | 26 ++++++++++++++++-------
>  modules/video_output/caopengllayer.m      | 25 ++++++++++++++++------
>  modules/video_output/ios.m                |  6 ++++++
>  modules/video_output/macosx.m             | 11 ++++++++++
>  modules/video_output/opengl/Makefile.am   | 16 ++++++--------
>  modules/video_output/opengl/egl.c         | 19 +++++++++++++++++
>  modules/video_output/opengl/vout_helper.c | 18 ++++++----------
>  modules/video_output/wayland/Makefile.am  |  3 ++-
>  modules/video_output/win32/wgl.c          | 11 ++++++++--
>  modules/video_output/xcb/Makefile.am      |  3 ++-
>  11 files changed, 102 insertions(+), 38 deletions(-)
> 
> diff --git a/include/vlc_opengl.h b/include/vlc_opengl.h
> index 79e165e72b..05b5c5b242 100644
> --- a/include/vlc_opengl.h
> +++ b/include/vlc_opengl.h
> @@ -53,6 +53,8 @@ struct vlc_gl_t
>      void*(*get_proc_address)(vlc_gl_t *, const char *);
>      void (*destroy)(vlc_gl_t *);
>  
> +    const struct vlc_gl_api *api;
> +
>      enum {
>          VLC_GL_EXT_DEFAULT,
>          VLC_GL_EXT_EGL,
> diff --git a/modules/video_output/Makefile.am 
> b/modules/video_output/Makefile.am
> index c42fdc474a..4ebbcd8d87 100644
> --- a/modules/video_output/Makefile.am
> +++ b/modules/video_output/Makefile.am
> @@ -27,13 +27,17 @@ libglinterop_cvpx_plugin_la_LDFLAGS = $(AM_LDFLAGS) 
> -rpath '$(voutdir)' \
>  	-Wl,-framework,Foundation,-framework,CoreVideo
>  
>  if HAVE_OSX
> -libvout_macosx_plugin_la_SOURCES = video_output/macosx.m
> +libvout_macosx_plugin_la_SOURCES = video_output/macosx.m \
> +	video_output/opengl/gl_api.c \
> +	video_output/opengl/gl_api.h
>  libvout_macosx_plugin_la_CFLAGS = $(AM_CFLAGS) -DHAVE_GL_CORE_SYMBOLS
>  libvout_macosx_plugin_la_LIBADD = libvlc_opengl.la
>  libvout_macosx_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)' \
>  	-Wl,-framework,OpenGL,-framework,Cocoa
>  
> -libcaopengllayer_plugin_la_SOURCES = video_output/caopengllayer.m
> +libcaopengllayer_plugin_la_SOURCES = video_output/caopengllayer.m \
> +	video_output/opengl/gl_api.c \
> +	video_output/opengl/gl_api.h
>  libcaopengllayer_plugin_la_CFLAGS = $(AM_CFLAGS)  -DHAVE_GL_CORE_SYMBOLS
>  libcaopengllayer_plugin_la_LIBADD = libvlc_opengl.la
>  libcaopengllayer_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)' \
> @@ -47,7 +51,9 @@ if HAVE_IOS
>  libglinterop_cvpx_plugin_la_CFLAGS = $(AM_CFLAGS) -DUSE_OPENGL_ES2
>  endif
>  
> -libvout_ios_plugin_la_SOURCES = video_output/ios.m
> +libvout_ios_plugin_la_SOURCES = video_output/ios.m \
> +	video_output/opengl/gl_api.c \
> +	video_output/opengl/gl_api.h
>  libvout_ios_plugin_la_CFLAGS = $(AM_CFLAGS) $(OPENGL_COMMONCFLAGS) 
> -DUSE_OPENGL_ES2
>  libvout_ios_plugin_la_LIBADD = libvlc_opengles.la
>  libvout_ios_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)' \
> @@ -143,13 +149,15 @@ libglwin32_plugin_la_SOURCES = \
>  	video_output/win32/events.c video_output/win32/events.h \
>  	video_output/win32/sensors.cpp \
>  	video_output/win32/win32touch.c video_output/win32/win32touch.h
> -libwgl_plugin_la_SOURCES = video_output/win32/wgl.c
> +libwgl_plugin_la_SOURCES = video_output/win32/wgl.c \
> +	video_output/opengl/gl_api.c \
> +	video_output/opengl/gl_api.h
>  
>  libglwin32_plugin_la_LIBADD = libchroma_copy.la -lopengl32 -lgdi32 
> $(LIBCOM) -luuid libvlc_opengl.la
>  libwgl_plugin_la_LIBADD = -lopengl32 -lgdi32 libvlc_opengl.la
>  
> -libglwin32_plugin_la_CFLAGS = $(AM_CFLAGS) $(OPENGL_COMMONCFLAGS) 
> -DHAVE_GL_CORE_SYMBOLS
> -libwgl_plugin_la_CFLAGS = $(AM_CFLAGS) $(OPENGL_COMMONCFLAGS)
> +libglwin32_plugin_la_CFLAGS = $(AM_CFLAGS) $(OPENGL_COMMONCFLAGS)
> +libwgl_plugin_la_CFLAGS = $(AM_CFLAGS) $(OPENGL_COMMONCFLAGS) 
> -DHAVE_GL_CORE_SYMBOLS
>  
>  libglwin32_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)'
>  libwgl_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)'
> @@ -173,7 +181,8 @@ if HAVE_WIN32_DESKTOP
>  vout_LTLIBRARIES += libwinhibit_plugin.la
>  endif
>  
> -libegl_win32_plugin_la_SOURCES = video_output/opengl/egl.c
> +libegl_win32_plugin_la_SOURCES = video_output/opengl/egl.c \
> +	video_output/opengl/gl_api.h video_output/opengl/gl_api.c
>  libegl_win32_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_PLATFORM_WIN32=1
>  libegl_win32_plugin_la_CFLAGS = $(AM_CFLAGS) $(EGL_CFLAGS)
>  libegl_win32_plugin_la_LIBADD = $(EGL_LIBS)
> @@ -208,7 +217,8 @@ endif
>  
>  ### Android ###
>  
> -libegl_android_plugin_la_SOURCES = video_output/opengl/egl.c
> +libegl_android_plugin_la_SOURCES = video_output/opengl/egl.c \
> +	video_output/opengl/gl_api.h video_output/opengl/gl_api.c
>  libegl_android_plugin_la_CFLAGS = $(AM_CFLAGS) $(EGL_CFLAGS) 
> -DUSE_PLATFORM_ANDROID=1
>  libegl_android_plugin_la_LIBADD = $(EGL_LIBS)
>  
> diff --git a/modules/video_output/caopengllayer.m 
> b/modules/video_output/caopengllayer.m
> index 587817d153..5b17ae9e5e 100644
> --- a/modules/video_output/caopengllayer.m
> +++ b/modules/video_output/caopengllayer.m
> @@ -43,6 +43,7 @@
>  #include "opengl/filter_draw.h"
>  #include "opengl/renderer.h"
>  #include "opengl/vout_helper.h"
> +#include "opengl/gl_api.h"
>  
>  #define OSX_SIERRA_AND_HIGHER (NSAppKitVersionNumber >= 1485)
>  
> @@ -94,6 +95,7 @@ struct vout_display_sys_t {
>      VLCCAOpenGLLayer *cgLayer;
>  
>      vlc_gl_t *gl;
> +    struct vlc_gl_api api;
>      vout_display_opengl_t *vgl;
>  
>      vout_display_place_t place;
> @@ -199,12 +201,23 @@ static int Open (vout_display_t *vd, const 
> vout_display_cfg_t *cfg,
>          glsys->cgLayer = sys->cgLayer;
>  
>          const vlc_fourcc_t *subpicture_chromas;
> -        if (!OpenglLock(sys->gl)) {
> -            sys->vgl = vout_display_opengl_New(fmt, 
> &subpicture_chromas,
> -                                               sys->gl, 
> &cfg->viewpoint, context);
> -            OpenglUnlock(sys->gl);
> -        } else
> -            sys->vgl = NULL;
> +        sys->vgl = NULL;
> +
> +        if (OpenglLock(sys->gl) != VLC_SUCCESS)
> +            goto bailout;
> +
> +        if (vlc_gl_api_Init(&sys->api, sys->gl) != VLC_SUCCESS)
> +        {
> +            msg_Err(vd, "Error while initializing opengl api.");
> +            goto bailout;
> +        }
> +        sys->gl->api = &sys->api;
> +
> +        sys->vgl = vout_display_opengl_New(fmt, &subpicture_chromas,
> +                                           sys->gl, &cfg->viewpoint,
> +                                           context);
> +        OpenglUnlock(sys->gl);
> +
>          if (!sys->vgl) {
>              msg_Err(vd, "Error while initializing opengl display.");
>              goto bailout;
> diff --git a/modules/video_output/ios.m b/modules/video_output/ios.m
> index 07c8355d45..fd6be2face 100644
> --- a/modules/video_output/ios.m
> +++ b/modules/video_output/ios.m
> @@ -48,6 +48,7 @@
>  #import "opengl/filter_draw.h"
>  #import "opengl/renderer.h"
>  #import "opengl/vout_helper.h"
> +#import "opengl/gl_api.h"
>  
>  /**
>   * Forward declarations
> @@ -124,6 +125,7 @@ struct vout_display_sys_t
>      VLCOpenGLES2VideoView *glESView;
>  
>      vlc_gl_t *gl;
> +    struct vlc_gl_api api;
>  
>      vout_window_t *embed;
>  };
> @@ -209,6 +211,10 @@ static int Open(vout_display_t *vd, const 
> vout_display_cfg_t *cfg,
>          if (vlc_gl_MakeCurrent(sys->gl) != VLC_SUCCESS)
>              goto bailout;
>  
> +        if (vlc_gl_api_Init(&sys->api, sys->gl) != VLC_SUCCESS)
> +            goto bailout;
> +        sys->gl->api = &sys->api;

So, you are creating a vlc_gl_api_t using a vlc_gl_t, and then storing it in the vlc_gl_t. This seems weird.
What about a function like vlc_gl_InitApi(vlc_gl_t *gl) that fetch the api and store it in gl->api. Then you could remove the api pointer in all modules (since they already have a gl pointer).


> +
>          vout_display_opengl_t *vgl = vout_display_opengl_New(fmt, 
> &subpicture_chromas,
>                                                               sys->gl, 
> &cfg->viewpoint,
>                                                               context);
> diff --git a/modules/video_output/macosx.m 
> b/modules/video_output/macosx.m
> index 9ce48deaaf..26ccbf3995 100644
> --- a/modules/video_output/macosx.m
> +++ b/modules/video_output/macosx.m
> @@ -49,6 +49,7 @@
>  #include "opengl/filter_draw.h"
>  #include "opengl/renderer.h"
>  #include "opengl/vout_helper.h"
> +#include "opengl/gl_api.h"
>  
>  /**
>   * Forward declarations
> @@ -110,6 +111,7 @@ struct vout_display_sys_t
>  
>      vout_window_t *embed;
>      vlc_gl_t *gl;
> +    struct vlc_gl_api api;
>      vout_display_opengl_t *vgl;
>  
>      picture_t *current;
> @@ -240,6 +242,15 @@ static int Open (vout_display_t *vd, const 
> vout_display_cfg_t *cfg,
>              msg_Err(vd, "Can't attach gl context");
>              goto error;
>          }
> +
> +        if (vlc_gl_api_Init(&sys->api, sys->gl) != VLC_SUCCESS)
> +        {
> +            msg_Err(vd, "Can't init OpenGL API");
> +            vlc_gl_ReleaseCurrent(sys->gl);
> +            goto error;
> +        }
> +        sys->gl->api = &sys->api;
> +
>          sys->vgl = vout_display_opengl_New (fmt, &subpicture_chromas, 
> sys->gl,
>                                              &cfg->viewpoint, context);
>          vlc_gl_ReleaseCurrent(sys->gl);
> diff --git a/modules/video_output/opengl/Makefile.am 
> b/modules/video_output/opengl/Makefile.am
> index 9e08ec09fc..5eef38951e 100644
> --- a/modules/video_output/opengl/Makefile.am
> +++ b/modules/video_output/opengl/Makefile.am
> @@ -7,8 +7,6 @@ OPENGL_COMMONSOURCES = 
> video_output/opengl/vout_helper.c \
>         video_output/opengl/filter_priv.h \
>         video_output/opengl/filters.c \
>         video_output/opengl/filters.h \
> -       video_output/opengl/gl_api.c \
> -       video_output/opengl/gl_api.h \
>         video_output/opengl/gl_common.h \
>         video_output/opengl/gl_util.c \
>         video_output/opengl/gl_util.h \
> @@ -54,20 +52,20 @@ endif
>  
>  ### OpenGL ###
>  libgles2_plugin_la_SOURCES = video_output/opengl/display.c
> -libgles2_plugin_la_CFLAGS = $(AM_CFLAGS) $(GLES2_CFLAGS) -DUSE_OPENGL_ES2
> -libgles2_plugin_la_LIBADD = $(GLES2_LIBS) libvlc_opengles.la
> +libgles2_plugin_la_CFLAGS = $(AM_CFLAGS) -DUSE_OPENGL_ES2
> +libgles2_plugin_la_LIBADD = libvlc_opengles.la
>  libgles2_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)'
>  if HAVE_GLES2
>  vout_LTLIBRARIES += libgles2_plugin.la
>  endif
>  
>  libgl_plugin_la_SOURCES = video_output/opengl/display.c
> -libgl_plugin_la_CFLAGS = $(AM_CFLAGS) $(GL_CFLAGS) $(OPENGL_COMMONCFLAGS)
> +libgl_plugin_la_CFLAGS = $(AM_CFLAGS) $(OPENGL_COMMONCFLAGS)
>  libgl_plugin_la_LIBADD = libvlc_opengl.la
> -if HAVE_WIN32
> -libgl_plugin_la_CFLAGS += -DHAVE_GL_CORE_SYMBOLS
> -libgl_plugin_la_LIBADD += $(GL_LIBS)
> -endif
> +#if HAVE_WIN32
> +#libgl_plugin_la_CFLAGS += -DHAVE_GL_CORE_SYMBOLS
> +#libgl_plugin_la_LIBADD += $(GL_LIBS)
> +#endif
>  
>  if HAVE_GL
>  vout_LTLIBRARIES += libgl_plugin.la
> diff --git a/modules/video_output/opengl/egl.c 
> b/modules/video_output/opengl/egl.c
> index ba589cbae7..920aca55bc 100644
> --- a/modules/video_output/opengl/egl.c
> +++ b/modules/video_output/opengl/egl.c
> @@ -43,6 +43,8 @@
>  # include "../android/utils.h"
>  #endif
>  
> +#include "gl_api.h"
> +
>  typedef struct vlc_gl_sys_t
>  {
>      EGLDisplay display;
> @@ -56,6 +58,10 @@ typedef struct vlc_gl_sys_t
>  #endif
>      PFNEGLCREATEIMAGEKHRPROC    eglCreateImageKHR;
>      PFNEGLDESTROYIMAGEKHRPROC   eglDestroyImageKHR;
> +
> +    /* OpenGL API for clients */
> +    struct vlc_gl_api api;
> +
>  } vlc_gl_sys_t;
>  
>  static int MakeCurrent (vlc_gl_t *gl)
> @@ -375,6 +381,11 @@ static int Open(vlc_gl_t *gl, const struct gl_api *api,
>      }
>      sys->context = ctx;
>  
> +    EGLDisplay prev_display = eglGetCurrentDisplay();
> +    EGLSurface prev_dsurface = eglGetCurrentSurface(EGL_DRAW);
> +    EGLSurface prev_rsurface = eglGetCurrentSurface(EGL_READ);
> +    EGLSurface prev_context = eglGetCurrentContext();
> +
>      /* Initialize OpenGL callbacks */
>      gl->ext = VLC_GL_EXT_EGL;
>      gl->make_current = MakeCurrent;
> @@ -382,6 +393,7 @@ static int Open(vlc_gl_t *gl, const struct gl_api *api,
>      gl->resize = Resize;
>      gl->swap = SwapBuffers;
>      gl->get_proc_address = GetSymbol;
> +    gl->api = &sys->api;
>      gl->destroy = Close;
>      gl->egl.queryString = QueryString;
>  
> @@ -392,6 +404,13 @@ static int Open(vlc_gl_t *gl, const struct gl_api *api,
>          gl->egl.createImageKHR = CreateImageKHR;
>          gl->egl.destroyImageKHR = DestroyImageKHR;
>      }
> +    eglMakeCurrent(sys->display, sys->surface, sys->surface, sys->context);
> +    int ret = vlc_gl_api_Init(&sys->api, gl);
> +    eglMakeCurrent(prev_display, prev_rsurface, prev_dsurface, prev_context);
> +
> +    if (ret != VLC_SUCCESS)
> +        goto error;
> +
>  
>      return VLC_SUCCESS;
>  
> diff --git a/modules/video_output/opengl/vout_helper.c 
> b/modules/video_output/opengl/vout_helper.c
> index ad3eba280b..7e82d91f7f 100644
> --- a/modules/video_output/opengl/vout_helper.c
> +++ b/modules/video_output/opengl/vout_helper.c
> @@ -110,11 +110,7 @@ vout_display_opengl_t 
> *vout_display_opengl_New(video_format_t *fmt,
>  
>      vgl->gl = gl;
>  
> -    int ret = vlc_gl_api_Init(&vgl->api, gl);
> -    if (ret != VLC_SUCCESS)
> -        goto free_vgl;
> -
> -    const struct vlc_gl_api *api = &vgl->api;
> +    const struct vlc_gl_api *api = gl->api;
>      const opengl_vtable_t *vt = &api->vt;
>  
>  #if !defined(USE_OPENGL_ES2)
> @@ -164,7 +160,7 @@ vout_display_opengl_t 
> *vout_display_opengl_New(video_format_t *fmt,
>       * forward SetViewpoint() */
>      vgl->renderer = renderer_filter->sys;
>  
> -    ret = vlc_gl_filters_InitFramebuffers(vgl->filters);
> +    int ret = vlc_gl_filters_InitFramebuffers(vgl->filters);
>      if (ret != VLC_SUCCESS)
>      {
>          msg_Err(gl, "Could not init filters framebuffers");
> @@ -219,7 +215,7 @@ free_vgl:
>  
>  void vout_display_opengl_Delete(vout_display_opengl_t *vgl)
>  {
> -    const opengl_vtable_t *vt = &vgl->api.vt;
> +    const opengl_vtable_t *vt = &vgl->gl->api->vt;
>  
>      GL_ASSERT_NOERROR(vt);
>  
> @@ -259,19 +255,19 @@ void 
> vout_display_opengl_Viewport(vout_display_opengl_t *vgl, int x, int y,
>  int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
>                                  picture_t *picture, subpicture_t 
> *subpicture)
>  {
> -    GL_ASSERT_NOERROR(&vgl->api.vt);
> +    GL_ASSERT_NOERROR(&vgl->gl->api->vt);
>  
>      int ret = vlc_gl_filters_UpdatePicture(vgl->filters, picture);
>      if (ret != VLC_SUCCESS)
>          return ret;
>  
>      ret = vlc_gl_sub_renderer_Prepare(vgl->sub_renderer, subpicture);
> -    GL_ASSERT_NOERROR(&vgl->api.vt);
> +    GL_ASSERT_NOERROR(&vgl->gl->api->vt);
>      return ret;
>  }
>  int vout_display_opengl_Display(vout_display_opengl_t *vgl)
>  {
> -    GL_ASSERT_NOERROR(&vgl->api.vt);
> +    GL_ASSERT_NOERROR(&vgl->gl->api->vt);
>  
>      /* Why drawing here and not in Render()? Because this way, the
>         OpenGL providers can call vout_display_opengl_Display to force redraw.
> @@ -288,7 +284,7 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl)
>      /* Display */
>      vlc_gl_Swap(vgl->gl);
>  
> -    GL_ASSERT_NOERROR(&vgl->api.vt);
> +    GL_ASSERT_NOERROR(&vgl->gl->api->vt);
>  
>      return VLC_SUCCESS;
>  }
> diff --git a/modules/video_output/wayland/Makefile.am 
> b/modules/video_output/wayland/Makefile.am
> index 65dc2ad299..60d5f9bdc9 100644
> --- a/modules/video_output/wayland/Makefile.am
> +++ b/modules/video_output/wayland/Makefile.am
> @@ -68,7 +68,8 @@ video_output/wayland/xdg-decoration-protocol.c: \
>  		video_output/Makefile.am
>  	$(AM_V_GEN)$(WAYLAND_SCANNER) private-code $< $@
>  
> -libegl_wl_plugin_la_SOURCES = video_output/opengl/egl.c
> +libegl_wl_plugin_la_SOURCES = video_output/opengl/egl.c \
> +	video_output/opengl/gl_api.h video_output/opengl/gl_api.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)
> diff --git a/modules/video_output/win32/wgl.c b/modules/video_output/win32/wgl.c
> index ec02c2dc6e..56c70883e9 100644
> --- a/modules/video_output/win32/wgl.c
> +++ b/modules/video_output/win32/wgl.c
> @@ -29,6 +29,7 @@
>  #include <vlc_opengl.h>
>  
>  #include "../opengl/vout_helper.h"
> +#include "../opengl/gl_api.h"
>  #include <GL/glew.h>
>  #include <GL/wglew.h>
>  
> @@ -70,6 +71,8 @@ struct vout_display_sys_t
>          PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT;
>          PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB;
>      } exts;
> +
> +    struct vlc_gl_api api;
>  };
>  
>  static void          Swap(vlc_gl_t *);
> @@ -227,8 +230,6 @@ static int Open(vlc_gl_t *gl, unsigned width, 
> unsigned height)
>      if (!sys->exts.GetExtensionsStringEXT)
>          LOAD_EXT(GetExtensionsStringARB, 
> PFNWGLGETEXTENSIONSSTRINGARBPROC);
>  
> -    wglMakeCurrent(sys->hGLDC, NULL);
> -
>      gl->ext = VLC_GL_EXT_WGL;
>      gl->make_current = MakeCurrent;
>      gl->release_current = ReleaseCurrent;
> @@ -236,6 +237,12 @@ static int Open(vlc_gl_t *gl, unsigned width, 
> unsigned height)
>      gl->swap = Swap;
>      gl->get_proc_address = OurGetProcAddress;
>      gl->destroy = Close;
> +    gl->api = &sys->api;
> +
> +    if (vlc_gl_api_Init(&sys->api, gl) != VLC_SUCCESS)
> +        goto error;
> +
> +    wglMakeCurrent(sys->hGLDC, NULL);
>  
>      if (sys->exts.GetExtensionsStringEXT || 
> sys->exts.GetExtensionsStringARB)
>          gl->wgl.getExtensionsString = GetExtensionsString;
> diff --git a/modules/video_output/xcb/Makefile.am 
> b/modules/video_output/xcb/Makefile.am
> index f946e07ce7..beb7d0684c 100644
> --- a/modules/video_output/xcb/Makefile.am
> +++ b/modules/video_output/xcb/Makefile.am
> @@ -40,7 +40,8 @@ libvk_x11_plugin_la_CFLAGS = $(AM_CFLAGS) \
>  	-DVK_USE_PLATFORM_XCB_KHR -DPLATFORM_NAME=X11
>  libvk_x11_plugin_la_LIBADD = $(VULKAN_COMMONLIBS) $(XCB_LIBS)
>  
> -libegl_x11_plugin_la_SOURCES = video_output/opengl/egl.c
> +libegl_x11_plugin_la_SOURCES = video_output/opengl/egl.c \
> +	video_output/opengl/gl_api.h video_output/opengl/gl_api.c
>  libegl_x11_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_PLATFORM_X11=1
>  libegl_x11_plugin_la_CFLAGS = $(AM_CFLAGS) $(EGL_CFLAGS)
>  libegl_x11_plugin_la_LIBADD = $(EGL_LIBS) $(X_LIBS) $(X_PRE_LIBS) -lX11
> -- 
> 2.28.0
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list