[vlc-devel] [PATCH 03/41] opengl: pass vlc_gl_api instead of virtual table

Romain Vimont rom1v at videolabs.io
Fri Feb 7 17:41:49 CET 2020


Pass the whole structure (which will have new fields soon) to interop
and renderers, instead of the virtual table only.
---
 modules/video_output/opengl/interop.c      |  7 ++++---
 modules/video_output/opengl/interop.h      |  5 +++--
 modules/video_output/opengl/renderer.c     |  9 ++++++---
 modules/video_output/opengl/renderer.h     | 11 +++++++----
 modules/video_output/opengl/sub_renderer.c | 10 +++++++---
 modules/video_output/opengl/sub_renderer.h |  5 +++--
 modules/video_output/opengl/vout_helper.c  |  5 +++--
 7 files changed, 33 insertions(+), 19 deletions(-)

diff --git a/modules/video_output/opengl/interop.c b/modules/video_output/opengl/interop.c
index 9f39681a60..69d73f8f9a 100644
--- a/modules/video_output/opengl/interop.c
+++ b/modules/video_output/opengl/interop.c
@@ -30,11 +30,11 @@
 #include "vout_helper.h"
 
 struct vlc_gl_interop *
-vlc_gl_interop_New(struct vlc_gl_t *gl, const opengl_vtable_t *vt,
+vlc_gl_interop_New(struct vlc_gl_t *gl, const struct vlc_gl_api *api,
                    vlc_video_context *context, const video_format_t *fmt,
                    bool subpics)
 {
-    const char *glexts = (const char *) vt->GetString(GL_EXTENSIONS);
+    const char *glexts = (const char *) api->vt.GetString(GL_EXTENSIONS);
     assert(glexts);
     if (!glexts)
     {
@@ -60,7 +60,8 @@ vlc_gl_interop_New(struct vlc_gl_t *gl, const opengl_vtable_t *vt,
     interop->fmt.p_palette = NULL;
 
     interop->gl = gl;
-    interop->vt = vt;
+    interop->api = api;
+    interop->vt = &api->vt;
 
     int ret;
     if (subpics)
diff --git a/modules/video_output/opengl/interop.h b/modules/video_output/opengl/interop.h
index ab054ee11a..96b34de970 100644
--- a/modules/video_output/opengl/interop.h
+++ b/modules/video_output/opengl/interop.h
@@ -109,7 +109,8 @@ struct vlc_gl_interop {
     module_t *module;
 
     vlc_gl_t *gl;
-    const opengl_vtable_t *vt;
+    const struct vlc_gl_api *api;
+    const opengl_vtable_t *vt; /* for convenience, same as &api->vt */
     GLenum tex_target;
 
     /* True if the current API is OpenGL ES, set by the caller */
@@ -157,7 +158,7 @@ struct vlc_gl_interop {
 };
 
 struct vlc_gl_interop *
-vlc_gl_interop_New(struct vlc_gl_t *gl, const opengl_vtable_t *vt,
+vlc_gl_interop_New(struct vlc_gl_t *gl, const struct vlc_gl_api *api,
                    vlc_video_context *context, const video_format_t *fmt,
                    bool subpics);
 
diff --git a/modules/video_output/opengl/renderer.c b/modules/video_output/opengl/renderer.c
index 416530ffea..69332defb1 100644
--- a/modules/video_output/opengl/renderer.c
+++ b/modules/video_output/opengl/renderer.c
@@ -310,7 +310,7 @@ vlc_gl_renderer_Delete(struct vlc_gl_renderer *renderer)
 
     vlc_gl_interop_Delete(interop);
     if (renderer->program_id != 0)
-        renderer->vt->DeleteProgram(renderer->program_id);
+        vt->DeleteProgram(renderer->program_id);
 
 #ifdef HAVE_LIBPLACEBO
     FREENULL(renderer->uloc.pl_vars);
@@ -322,16 +322,18 @@ vlc_gl_renderer_Delete(struct vlc_gl_renderer *renderer)
 }
 
 struct vlc_gl_renderer *
-vlc_gl_renderer_New(vlc_gl_t *gl, const opengl_vtable_t *vt,
+vlc_gl_renderer_New(vlc_gl_t *gl, const struct vlc_gl_api *api,
                     vlc_video_context *context, const video_format_t *fmt,
                     bool supports_npot, bool b_dump_shaders)
 {
+    const opengl_vtable_t *vt = &api->vt;
+
     struct vlc_gl_renderer *renderer = calloc(1, sizeof(*renderer));
     if (!renderer)
         return NULL;
 
     struct vlc_gl_interop *interop =
-        vlc_gl_interop_New(gl, vt, context, fmt, false);
+        vlc_gl_interop_New(gl, api, context, fmt, false);
     if (!interop)
     {
         free(renderer);
@@ -341,6 +343,7 @@ vlc_gl_renderer_New(vlc_gl_t *gl, const opengl_vtable_t *vt,
     renderer->interop = interop;
 
     renderer->gl = gl;
+    renderer->api = api;
     renderer->vt = vt;
     renderer->b_dump_shaders = b_dump_shaders;
 #if defined(USE_OPENGL_ES2)
diff --git a/modules/video_output/opengl/renderer.h b/modules/video_output/opengl/renderer.h
index a8da814761..e161e7eb52 100644
--- a/modules/video_output/opengl/renderer.h
+++ b/modules/video_output/opengl/renderer.h
@@ -25,6 +25,8 @@
 #include <vlc_codec.h>
 #include <vlc_opengl.h>
 #include <vlc_plugin.h>
+
+#include "gl_api.h"
 #include "gl_common.h"
 #include "interop.h"
 
@@ -43,8 +45,9 @@ struct vlc_gl_renderer
     /* libplacebo context, created by the caller (optional) */
     struct pl_context *pl_ctx;
 
-    /* Function pointers to OpenGL functions, set by the caller */
-    const opengl_vtable_t *vt;
+    /* Set by the caller */
+    const struct vlc_gl_api *api;
+    const opengl_vtable_t *vt; /* for convenience, same as &api->vt */
 
     /* True to dump shaders, set by the caller */
     bool b_dump_shaders;
@@ -152,7 +155,7 @@ struct vlc_gl_renderer
  * Create a new renderer
  *
  * \param gl the GL context
- * \param vt the OpenGL functions vtable
+ * \param api the OpenGL API
  * \param context the video context
  * \param fmt the video format
  * \param supports_npot indicate if the implementation supports non-power-of-2
@@ -160,7 +163,7 @@ struct vlc_gl_renderer
  * \param dump_shaders indicate if the shaders must be dumped in logs
  */
 struct vlc_gl_renderer *
-vlc_gl_renderer_New(vlc_gl_t *gl, const opengl_vtable_t *vt,
+vlc_gl_renderer_New(vlc_gl_t *gl, const struct vlc_gl_api *api,
                     vlc_video_context *context, const video_format_t *fmt,
                     bool supports_npot, bool dump_shaders);
 
diff --git a/modules/video_output/opengl/sub_renderer.c b/modules/video_output/opengl/sub_renderer.c
index d235b5681b..a3c72ba171 100644
--- a/modules/video_output/opengl/sub_renderer.c
+++ b/modules/video_output/opengl/sub_renderer.c
@@ -60,7 +60,8 @@ typedef struct {
 struct vlc_gl_sub_renderer
 {
     vlc_gl_t *gl;
-    const opengl_vtable_t *vt;
+    const struct vlc_gl_api *api;
+    const opengl_vtable_t *vt; /* for convenience, same as &api->vt */
 
     struct vlc_gl_interop *interop;
 
@@ -112,16 +113,18 @@ FetchLocations(struct vlc_gl_sub_renderer *sr)
 }
 
 struct vlc_gl_sub_renderer *
-vlc_gl_sub_renderer_New(vlc_gl_t *gl, const opengl_vtable_t *vt,
+vlc_gl_sub_renderer_New(vlc_gl_t *gl, const struct vlc_gl_api *api,
                         bool supports_npot)
 {
+    const opengl_vtable_t *vt = &api->vt;
+
     struct vlc_gl_sub_renderer *sr = malloc(sizeof(*sr));
     if (!sr)
         return NULL;
 
     video_format_t fmt;
     video_format_Init(&fmt, VLC_CODEC_RGB32);
-    sr->interop = vlc_gl_interop_New(gl, vt, NULL, &fmt, true);
+    sr->interop = vlc_gl_interop_New(gl, api, NULL, &fmt, true);
     if (!sr->interop)
         goto error_1;
 
@@ -129,6 +132,7 @@ vlc_gl_sub_renderer_New(vlc_gl_t *gl, const opengl_vtable_t *vt,
     assert(!sr->interop->handle_texs_gen);
 
     sr->gl = gl;
+    sr->api = api;
     sr->vt = vt;
     sr->supports_npot = supports_npot;
     sr->region_count = 0;
diff --git a/modules/video_output/opengl/sub_renderer.h b/modules/video_output/opengl/sub_renderer.h
index 48c0ebea59..cfd1bc79d2 100644
--- a/modules/video_output/opengl/sub_renderer.h
+++ b/modules/video_output/opengl/sub_renderer.h
@@ -28,6 +28,7 @@
 #include <vlc_common.h>
 #include <vlc_opengl.h>
 
+#include "gl_api.h"
 #include "gl_common.h"
 
 /**
@@ -39,12 +40,12 @@ struct vlc_gl_sub_renderer;
  * Create a new subpictures renderer
  *
  * \param gl the GL context
- * \param vt the OpenGL functions vtable
+ * \param api the OpenGL API
  * \param supports_npot indicate if the implementation supports non-power-of-2
  *                      texture size
  */
 struct vlc_gl_sub_renderer *
-vlc_gl_sub_renderer_New(vlc_gl_t *gl, const opengl_vtable_t *vt,
+vlc_gl_sub_renderer_New(vlc_gl_t *gl, const struct vlc_gl_api *api,
                         bool supports_npot);
 
 /**
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index b4ea0b565a..2f42a2d142 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -152,7 +152,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
     bool b_dump_shaders = var_InheritInteger(gl, "verbose") >= 4;
 
     struct vlc_gl_renderer *renderer = vgl->renderer =
-        vlc_gl_renderer_New(gl, vt, context, fmt, supports_npot,
+        vlc_gl_renderer_New(gl, &vgl->api, context, fmt, supports_npot,
                             b_dump_shaders);
     if (!vgl->renderer)
     {
@@ -164,7 +164,8 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
 
     GL_ASSERT_NOERROR();
 
-    vgl->sub_renderer = vlc_gl_sub_renderer_New(gl, vt, supports_npot);
+    vgl->sub_renderer = vlc_gl_sub_renderer_New(gl, &vgl->api,
+                                                supports_npot);
     if (!vgl->sub_renderer)
     {
         msg_Err(gl, "Could not create sub renderer");
-- 
2.25.0



More information about the vlc-devel mailing list