[vlc-devel] [PATCH 10/17] opengl: move callbacks to sampler

Romain Vimont rom1v at videolabs.io
Thu Apr 2 14:24:23 CEST 2020


The sampler is responsible to fetch its location and initialize its
textures and uniforms.
---
 .../video_output/opengl/fragment_shaders.c    | 42 +++++++++----------
 modules/video_output/opengl/renderer.c        | 10 ++---
 modules/video_output/opengl/renderer.h        | 27 ------------
 modules/video_output/opengl/sampler.h         | 27 ++++++++++++
 4 files changed, 52 insertions(+), 54 deletions(-)

diff --git a/modules/video_output/opengl/fragment_shaders.c b/modules/video_output/opengl/fragment_shaders.c
index afcc52c865..2a196a609c 100644
--- a/modules/video_output/opengl/fragment_shaders.c
+++ b/modules/video_output/opengl/fragment_shaders.c
@@ -205,11 +205,10 @@ renderer_yuv_base_init(struct vlc_gl_renderer *renderer, vlc_fourcc_t chroma,
 }
 
 static int
-renderer_base_fetch_locations(struct vlc_gl_renderer *renderer, GLuint program)
+sampler_base_fetch_locations(struct vlc_gl_sampler *sampler, GLuint program)
 {
-    struct vlc_gl_interop *interop = renderer->interop;
-    struct vlc_gl_sampler *sampler = renderer->sampler;
-    const opengl_vtable_t *vt = renderer->vt;
+    struct vlc_gl_interop *interop = sampler->interop;
+    const opengl_vtable_t *vt = sampler->vt;
 
     if (sampler->yuv_color)
     {
@@ -251,14 +250,13 @@ renderer_base_fetch_locations(struct vlc_gl_renderer *renderer, GLuint program)
 }
 
 static void
-renderer_base_prepare_shader(const struct vlc_gl_renderer *renderer,
-                             const GLsizei *tex_width,
-                             const GLsizei *tex_height, float alpha)
+sampler_base_prepare_shader(const struct vlc_gl_sampler *sampler,
+                            const GLsizei *tex_width,
+                            const GLsizei *tex_height, float alpha)
 {
     (void) tex_width; (void) tex_height;
-    const struct vlc_gl_interop *interop = renderer->interop;
-    struct vlc_gl_sampler *sampler = renderer->sampler;
-    const opengl_vtable_t *vt = renderer->vt;
+    const struct vlc_gl_interop *interop = sampler->interop;
+    const opengl_vtable_t *vt = sampler->vt;
 
     if (sampler->yuv_color)
         vt->UniformMatrix4fv(sampler->uloc.ConvMatrix, 1, GL_FALSE,
@@ -311,23 +309,21 @@ renderer_base_prepare_shader(const struct vlc_gl_renderer *renderer,
 }
 
 static int
-renderer_xyz12_fetch_locations(struct vlc_gl_renderer *renderer, GLuint program)
+sampler_xyz12_fetch_locations(struct vlc_gl_sampler *sampler, GLuint program)
 {
-    const opengl_vtable_t *vt = renderer->vt;
-    struct vlc_gl_sampler *sampler = renderer->sampler;
+    const opengl_vtable_t *vt = sampler->vt;
 
     sampler->uloc.Texture[0] = vt->GetUniformLocation(program, "Texture0");
     return sampler->uloc.Texture[0] != -1 ? VLC_SUCCESS : VLC_EGENERIC;
 }
 
 static void
-renderer_xyz12_prepare_shader(const struct vlc_gl_renderer *renderer,
-                              const GLsizei *tex_width,
-                              const GLsizei *tex_height, float alpha)
+sampler_xyz12_prepare_shader(const struct vlc_gl_sampler *sampler,
+                             const GLsizei *tex_width,
+                             const GLsizei *tex_height, float alpha)
 {
     (void) tex_width; (void) tex_height; (void) alpha;
-    const opengl_vtable_t *vt = renderer->vt;
-    struct vlc_gl_sampler *sampler = renderer->sampler;
+    const opengl_vtable_t *vt = sampler->vt;
 
     vt->Uniform1i(sampler->uloc.Texture[0], 0);
 }
@@ -335,8 +331,10 @@ renderer_xyz12_prepare_shader(const struct vlc_gl_renderer *renderer,
 static char *
 xyz12_shader_init(struct vlc_gl_renderer *renderer)
 {
-    renderer->pf_fetch_locations = renderer_xyz12_fetch_locations;
-    renderer->pf_prepare_shader = renderer_xyz12_prepare_shader;
+    struct vlc_gl_sampler *sampler = renderer->sampler;
+
+    sampler->pf_fetch_locations = sampler_xyz12_fetch_locations;
+    sampler->pf_prepare_shader = sampler_xyz12_prepare_shader;
 
     /* Shader for XYZ to RGB correction
      * 3 steps :
@@ -645,8 +643,8 @@ opengl_fragment_shader_init(struct vlc_gl_renderer *renderer, GLenum tex_target,
     if (vlc_memstream_close(&ms) != 0)
         return NULL;
 
-    renderer->pf_fetch_locations = renderer_base_fetch_locations;
-    renderer->pf_prepare_shader = renderer_base_prepare_shader;
+    sampler->pf_fetch_locations = sampler_base_fetch_locations;
+    sampler->pf_prepare_shader = sampler_base_prepare_shader;
 
     return ms.ptr;
 }
diff --git a/modules/video_output/opengl/renderer.c b/modules/video_output/opengl/renderer.c
index c8d1d3170d..81655b92ea 100644
--- a/modules/video_output/opengl/renderer.c
+++ b/modules/video_output/opengl/renderer.c
@@ -327,8 +327,8 @@ opengl_link_program(struct vlc_gl_renderer *renderer)
     assert(interop->tex_target != 0 &&
            interop->tex_count > 0 &&
            interop->ops->update_textures != NULL &&
-           renderer->pf_fetch_locations != NULL &&
-           renderer->pf_prepare_shader != NULL);
+           sampler->pf_fetch_locations != NULL &&
+           sampler->pf_prepare_shader != NULL);
 
     GLuint program_id =
         vlc_gl_BuildProgram(VLC_OBJECT(renderer->gl), vt,
@@ -375,7 +375,7 @@ opengl_link_program(struct vlc_gl_renderer *renderer)
 #undef GET_ULOC
 #undef GET_ALOC
 #undef GET_SAMPLER_ULOC
-    int ret = renderer->pf_fetch_locations(renderer, program_id);
+    int ret = sampler->pf_fetch_locations(sampler, program_id);
     assert(ret == VLC_SUCCESS);
     if (ret != VLC_SUCCESS)
     {
@@ -846,8 +846,8 @@ static void DrawWithShaders(struct vlc_gl_renderer *renderer)
     const struct vlc_gl_interop *interop = renderer->interop;
     struct vlc_gl_sampler *sampler = renderer->sampler;
     const opengl_vtable_t *vt = renderer->vt;
-    renderer->pf_prepare_shader(renderer, sampler->tex_width,
-                                sampler->tex_height, 1.0f);
+    sampler->pf_prepare_shader(sampler, sampler->tex_width,
+                               sampler->tex_height, 1.0f);
 
     for (unsigned j = 0; j < interop->tex_count; j++) {
         assert(sampler->textures[j] != 0);
diff --git a/modules/video_output/opengl/renderer.h b/modules/video_output/opengl/renderer.h
index 5150834603..a75db93d05 100644
--- a/modules/video_output/opengl/renderer.h
+++ b/modules/video_output/opengl/renderer.h
@@ -96,33 +96,6 @@ struct vlc_gl_renderer
     float f_fovy; /* to avoid recalculating them when needed.      */
     float f_z;    /* Position of the camera on the shpere radius vector */
     float f_sar;
-
-    /**
-     * Callback to fetch locations of uniform or attributes variables
-     *
-     * This function pointer cannot be NULL. This callback is called one time
-     * after init.
-     *
-     * \param renderer OpenGL renderer
-     * \param program linked program that will be used by this renderer
-     * \return VLC_SUCCESS or a VLC error
-     */
-    int (*pf_fetch_locations)(struct vlc_gl_renderer *renderer, GLuint program);
-
-    /**
-     * Callback to prepare the fragment shader
-     *
-     * This function pointer cannot be NULL. This callback can be used to
-     * specify values of uniform variables.
-     *
-     * \param renderer OpenGL renderer
-     * \param tex_width array of tex width (one per plane)
-     * \param tex_height array of tex height (one per plane)
-     * \param alpha alpha value, used only for RGBA fragment shader
-     */
-    void (*pf_prepare_shader)(const struct vlc_gl_renderer *renderer,
-                              const GLsizei *tex_width, const GLsizei *tex_height,
-                              float alpha);
 };
 
 /**
diff --git a/modules/video_output/opengl/sampler.h b/modules/video_output/opengl/sampler.h
index 1211f29953..c021ce8edf 100644
--- a/modules/video_output/opengl/sampler.h
+++ b/modules/video_output/opengl/sampler.h
@@ -90,6 +90,33 @@ struct vlc_gl_sampler {
     } last_source;
 
     struct vlc_gl_interop *interop;
+
+    /**
+     * Callback to fetch locations of uniform or attributes variables
+     *
+     * This function pointer cannot be NULL. This callback is called one time
+     * after init.
+     *
+     * \param sampler the sampler
+     * \param program linked program that will be used by this sampler
+     * \return VLC_SUCCESS or a VLC error
+     */
+    int (*pf_fetch_locations)(struct vlc_gl_sampler *sampler, GLuint program);
+
+    /**
+     * Callback to prepare the fragment shader
+     *
+     * This function pointer cannot be NULL. This callback can be used to
+     * specify values of uniform variables.
+     *
+     * \param sampler the sampler
+     * \param tex_width array of tex width (one per plane)
+     * \param tex_height array of tex height (one per plane)
+     * \param alpha alpha value, used only for RGBA fragment shader
+     */
+    void (*pf_prepare_shader)(const struct vlc_gl_sampler *sampler,
+                              const GLsizei *tex_width, const GLsizei *tex_height,
+                              float alpha);
 };
 
 /**
-- 
2.26.0



More information about the vlc-devel mailing list