[vlc-devel] [PATCH 20/41] opengl: extract sampler creation and destruction

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


Extract sampler creation and destruction to separate functions.
---
 modules/video_output/Makefile.am       |   1 +
 modules/video_output/opengl/renderer.c |  57 +-------------
 modules/video_output/opengl/sampler.c  | 105 +++++++++++++++++++++++++
 modules/video_output/opengl/sampler.h  |  17 ++++
 4 files changed, 125 insertions(+), 55 deletions(-)
 create mode 100644 modules/video_output/opengl/sampler.c

diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am
index bd4aede1c7..e2bcd97747 100644
--- a/modules/video_output/Makefile.am
+++ b/modules/video_output/Makefile.am
@@ -15,6 +15,7 @@ OPENGL_COMMONSOURCES = video_output/opengl/vout_helper.c \
 	video_output/opengl/interop.c video_output/opengl/interop_sw.c \
 	video_output/opengl/renderer.c \
 	video_output/opengl/renderer.h \
+	video_output/opengl/sampler.c \
 	video_output/opengl/sampler.h \
 	video_output/opengl/sub_renderer.c \
 	video_output/opengl/sub_renderer.h
diff --git a/modules/video_output/opengl/renderer.c b/modules/video_output/opengl/renderer.c
index 4f67eaf94a..712640e100 100644
--- a/modules/video_output/opengl/renderer.c
+++ b/modules/video_output/opengl/renderer.c
@@ -404,27 +404,17 @@ error:
 void
 vlc_gl_renderer_Delete(struct vlc_gl_renderer *renderer)
 {
-    struct vlc_gl_interop *interop = renderer->interop;
-    struct vlc_gl_sampler *sampler = renderer->sampler;
     const opengl_vtable_t *vt = renderer->vt;
 
     vt->DeleteBuffers(1, &renderer->vertex_buffer_object);
     vt->DeleteBuffers(1, &renderer->index_buffer_object);
     vt->DeleteBuffers(1, &renderer->texture_buffer_object);
 
-    if (!interop->handle_texs_gen)
-        vt->DeleteTextures(interop->tex_count, sampler->textures);
+    vlc_gl_sampler_Delete(renderer->sampler);
 
     if (renderer->program_id != 0)
         vt->DeleteProgram(renderer->program_id);
 
-#ifdef HAVE_LIBPLACEBO
-    FREENULL(sampler->uloc.pl_vars);
-    if (sampler->pl_ctx)
-        pl_context_destroy(&sampler->pl_ctx);
-#endif
-
-    free(renderer->sampler);
     free(renderer);
 }
 
@@ -437,12 +427,10 @@ vlc_gl_renderer_New(vlc_gl_t *gl, const struct vlc_gl_api *api,
     const opengl_vtable_t *vt = &api->vt;
     const video_format_t *fmt = &interop->fmt;
 
-    struct vlc_gl_sampler *sampler = calloc(1, sizeof(*sampler));
+    struct vlc_gl_sampler *sampler = vlc_gl_sampler_New(interop);
     if (!sampler)
         return NULL;
 
-    sampler->interop = interop;
-
     struct vlc_gl_renderer *renderer = calloc(1, sizeof(*renderer));
     if (!renderer)
     {
@@ -465,20 +453,6 @@ vlc_gl_renderer_New(vlc_gl_t *gl, const struct vlc_gl_api *api,
     renderer->glsl_precision_header = "";
 #endif
 
-#ifdef HAVE_LIBPLACEBO
-    // Create the main libplacebo context
-    sampler->pl_ctx = vlc_placebo_Create(VLC_OBJECT(gl));
-    if (sampler->pl_ctx) {
-#   if PL_API_VER >= 20
-        sampler->pl_sh = pl_shader_alloc(sampler->pl_ctx, NULL);
-#   elif PL_API_VER >= 6
-        sampler->pl_sh = pl_shader_alloc(sampler->pl_ctx, NULL, 0);
-#   else
-        sampler->pl_sh = pl_shader_alloc(sampler->pl_ctx, NULL, 0, 0);
-#   endif
-    }
-#endif
-
     int ret = opengl_link_program(renderer);
     if (ret != VLC_SUCCESS)
     {
@@ -497,33 +471,6 @@ vlc_gl_renderer_New(vlc_gl_t *gl, const struct vlc_gl_api *api,
     /* The orientation is handled by the orientation matrix */
     renderer->fmt.orientation = fmt->orientation;
 
-    /* Texture size */
-    for (unsigned j = 0; j < interop->tex_count; j++) {
-        const GLsizei w = renderer->fmt.i_visible_width  * interop->texs[j].w.num
-                        / interop->texs[j].w.den;
-        const GLsizei h = renderer->fmt.i_visible_height * interop->texs[j].h.num
-                        / interop->texs[j].h.den;
-        if (api->supports_npot) {
-            sampler->tex_width[j]  = w;
-            sampler->tex_height[j] = h;
-        } else {
-            sampler->tex_width[j]  = vlc_align_pot(w);
-            sampler->tex_height[j] = vlc_align_pot(h);
-        }
-    }
-
-    if (!interop->handle_texs_gen)
-    {
-        ret = vlc_gl_interop_GenerateTextures(interop, sampler->tex_width,
-                                              sampler->tex_height,
-                                              sampler->textures);
-        if (ret != VLC_SUCCESS)
-        {
-            vlc_gl_renderer_Delete(renderer);
-            return NULL;
-        }
-    }
-
     /* */
     vt->Disable(GL_BLEND);
     vt->Disable(GL_DEPTH_TEST);
diff --git a/modules/video_output/opengl/sampler.c b/modules/video_output/opengl/sampler.c
new file mode 100644
index 0000000000..d5d4dada58
--- /dev/null
+++ b/modules/video_output/opengl/sampler.c
@@ -0,0 +1,105 @@
+/*****************************************************************************
+ * sampler.c
+ *****************************************************************************
+ * Copyright (C) 2020 VLC authors and VideoLAN
+ *
+ * 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
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "sampler.h"
+
+#include <vlc_common.h>
+#include <vlc_es.h>
+#include <vlc_opengl.h>
+
+#include "gl_api.h"
+#include "gl_common.h"
+#include "gl_util.h"
+#include "interop.h"
+
+struct vlc_gl_sampler *
+vlc_gl_sampler_New(struct vlc_gl_interop *interop)
+{
+    struct vlc_gl_sampler *sampler = calloc(1, sizeof(*sampler));
+    if (!sampler)
+        return NULL;
+
+    sampler->interop = interop;
+
+#ifdef HAVE_LIBPLACEBO
+    // Create the main libplacebo context
+    sampler->pl_ctx = vlc_placebo_Create(VLC_OBJECT(interop->gl));
+    if (sampler->pl_ctx) {
+#   if PL_API_VER >= 20
+        sampler->pl_sh = pl_shader_alloc(sampler->pl_ctx, NULL);
+#   elif PL_API_VER >= 6
+        sampler->pl_sh = pl_shader_alloc(sampler->pl_ctx, NULL, 0);
+#   else
+        sampler->pl_sh = pl_shader_alloc(sampler->pl_ctx, NULL, 0, 0);
+#   endif
+    }
+#endif
+
+    /* Texture size */
+    for (unsigned j = 0; j < interop->tex_count; j++) {
+        const GLsizei w = interop->fmt.i_visible_width  * interop->texs[j].w.num
+                        / interop->texs[j].w.den;
+        const GLsizei h = interop->fmt.i_visible_height * interop->texs[j].h.num
+                        / interop->texs[j].h.den;
+        if (interop->api->supports_npot) {
+            sampler->tex_width[j]  = w;
+            sampler->tex_height[j] = h;
+        } else {
+            sampler->tex_width[j]  = vlc_align_pot(w);
+            sampler->tex_height[j] = vlc_align_pot(h);
+        }
+    }
+
+    if (!interop->handle_texs_gen)
+    {
+        int ret = vlc_gl_interop_GenerateTextures(interop, sampler->tex_width,
+                                                  sampler->tex_height,
+                                                  sampler->textures);
+        if (ret != VLC_SUCCESS)
+        {
+            free(sampler);
+            return NULL;
+        }
+    }
+
+    return sampler;
+}
+
+void
+vlc_gl_sampler_Delete(struct vlc_gl_sampler *sampler)
+{
+    struct vlc_gl_interop *interop = sampler->interop;
+    const opengl_vtable_t *vt = interop->vt;
+
+    if (!interop->handle_texs_gen)
+        vt->DeleteTextures(interop->tex_count, sampler->textures);
+
+#ifdef HAVE_LIBPLACEBO
+    FREENULL(sampler->uloc.pl_vars);
+    if (sampler->pl_ctx)
+        pl_context_destroy(&sampler->pl_ctx);
+#endif
+
+    free(sampler);
+}
diff --git a/modules/video_output/opengl/sampler.h b/modules/video_output/opengl/sampler.h
index 88cf7b4b2f..907b517110 100644
--- a/modules/video_output/opengl/sampler.h
+++ b/modules/video_output/opengl/sampler.h
@@ -30,6 +30,7 @@
 #include <vlc_picture.h>
 
 #include "gl_common.h"
+#include "../placebo_utils.h"
 
 /**
  * The purpose of a sampler is to provide pixel values of a VLC input picture,
@@ -89,4 +90,20 @@ struct vlc_gl_sampler {
     struct vlc_gl_interop *interop;
 };
 
+/**
+ * Create a new sampler
+ *
+ * \param interop the interop
+ */
+struct vlc_gl_sampler *
+vlc_gl_sampler_New(struct vlc_gl_interop *interop);
+
+/**
+ * Delete a sampler
+ *
+ * \param sampler the sampler
+ */
+void
+vlc_gl_sampler_Delete(struct vlc_gl_sampler *sampler);
+
 #endif
-- 
2.25.0



More information about the vlc-devel mailing list