[vlc-devel] [PATCH 37/41] opengl: move sampler ownership to vgl

Romain Vimont rom1v at videolabs.io
Fri Feb 7 17:42:23 CET 2020


The sampler were owned by the renderer.

Move it to vgl, so that the renderer never have to handle an interop
instance directly.
---
 modules/video_output/opengl/renderer.c    | 13 ++-----------
 modules/video_output/opengl/renderer.h    |  4 ++--
 modules/video_output/opengl/vout_helper.c | 17 ++++++++++++++++-
 3 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/modules/video_output/opengl/renderer.c b/modules/video_output/opengl/renderer.c
index 80d6236172..81f4a18a82 100644
--- a/modules/video_output/opengl/renderer.c
+++ b/modules/video_output/opengl/renderer.c
@@ -314,8 +314,6 @@ vlc_gl_renderer_Delete(struct vlc_gl_renderer *renderer)
     vt->DeleteBuffers(1, &renderer->index_buffer_object);
     vt->DeleteBuffers(1, &renderer->texture_buffer_object);
 
-    vlc_gl_sampler_Delete(renderer->sampler);
-
     if (renderer->program_id != 0)
         vt->DeleteProgram(renderer->program_id);
 
@@ -326,21 +324,14 @@ static int SetupCoords(struct vlc_gl_renderer *renderer);
 
 struct vlc_gl_renderer *
 vlc_gl_renderer_New(vlc_gl_t *gl, const struct vlc_gl_api *api,
-                    struct vlc_gl_interop *interop, bool b_dump_shaders)
+                    struct vlc_gl_sampler *sampler, bool b_dump_shaders)
 {
     const opengl_vtable_t *vt = &api->vt;
-    const video_format_t *fmt = &interop->fmt;
-
-    struct vlc_gl_sampler *sampler = vlc_gl_sampler_New(interop);
-    if (!sampler)
-        return NULL;
+    const video_format_t *fmt = sampler->fmt;
 
     struct vlc_gl_renderer *renderer = calloc(1, sizeof(*renderer));
     if (!renderer)
-    {
-        free(sampler);
         return NULL;
-    }
 
     renderer->sampler = sampler;
 
diff --git a/modules/video_output/opengl/renderer.h b/modules/video_output/opengl/renderer.h
index 23017a5428..d17e5299dd 100644
--- a/modules/video_output/opengl/renderer.h
+++ b/modules/video_output/opengl/renderer.h
@@ -102,12 +102,12 @@ struct vlc_gl_renderer
  *
  * \param gl the GL context
  * \param api the OpenGL API
- * \param interop the interop
+ * \param sampler the OpenGL sampler
  * \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 struct vlc_gl_api *api,
-                    struct vlc_gl_interop *interop, bool dump_shaders);
+                    struct vlc_gl_sampler *sampler, bool dump_shaders);
 
 /**
  * Delete a renderer
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index 62affc0c16..bec73b20ed 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -44,6 +44,7 @@
 #include "vout_helper.h"
 #include "internal.h"
 #include "renderer.h"
+#include "sampler.h"
 #include "sub_renderer.h"
 
 struct vout_display_opengl_t {
@@ -52,6 +53,7 @@ struct vout_display_opengl_t {
     struct vlc_gl_api api;
 
     struct vlc_gl_interop *interop;
+    struct vlc_gl_sampler *sampler;
     struct vlc_gl_renderer *renderer;
 
     struct vlc_gl_interop *sub_interop;
@@ -151,12 +153,22 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
         return NULL;
     }
 
+    vgl->sampler = vlc_gl_sampler_New(vgl->interop);
+    if (!vgl->sampler)
+    {
+        msg_Err(gl, "Could not create sampler");
+        vlc_gl_interop_Delete(vgl->interop);
+        free(vgl);
+        return NULL;
+    }
+
     struct vlc_gl_renderer *renderer = vgl->renderer =
-        vlc_gl_renderer_New(gl, &vgl->api, vgl->interop, b_dump_shaders);
+        vlc_gl_renderer_New(gl, &vgl->api, vgl->sampler, b_dump_shaders);
     if (!vgl->renderer)
     {
         msg_Warn(gl, "Could not create renderer for %4.4s",
                  (const char *) &fmt->i_chroma);
+        vlc_gl_sampler_Delete(vgl->sampler);
         vlc_gl_interop_Delete(vgl->interop);
         free(vgl);
         return NULL;
@@ -169,6 +181,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
     {
         msg_Err(gl, "Could not create sub interop");
         vlc_gl_renderer_Delete(vgl->renderer);
+        vlc_gl_sampler_Delete(vgl->sampler);
         vlc_gl_interop_Delete(vgl->interop);
         free(vgl);
         return NULL;
@@ -181,6 +194,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
         msg_Err(gl, "Could not create sub renderer");
         vlc_gl_interop_Delete(vgl->sub_interop);
         vlc_gl_renderer_Delete(vgl->renderer);
+        vlc_gl_sampler_Delete(vgl->sampler);
         vlc_gl_interop_Delete(vgl->interop);
         free(vgl);
         return NULL;
@@ -218,6 +232,7 @@ void vout_display_opengl_Delete(vout_display_opengl_t *vgl)
     vlc_gl_interop_Delete(vgl->sub_interop);
 
     vlc_gl_renderer_Delete(vgl->renderer);
+    vlc_gl_sampler_Delete(vgl->sampler);
     vlc_gl_interop_Delete(vgl->interop);
 
     GL_ASSERT_NOERROR();
-- 
2.25.0



More information about the vlc-devel mailing list