[vlc-devel] [PATCH] opengl: simplify shader templates

Marvin Scholz epirat07 at gmail.com
Tue Mar 31 11:29:27 CEST 2020


Instead of globally storing the glsl version and prevision header,
just conditionally insert them directly in the templates, which
makes the shaders easier to understand as one has not to jump around
in the code to find the different variable that are replaced into
the shader for the different cases.

This is the same way that it is already done for the sub_renderer
shaders.
---
 modules/video_output/opengl/renderer.c | 29 +++++++++++++-------------
 modules/video_output/opengl/renderer.h |  6 ------
 2 files changed, 15 insertions(+), 20 deletions(-)

diff --git a/modules/video_output/opengl/renderer.c b/modules/video_output/opengl/renderer.c
index ae4179be4a..f796485004 100644
--- a/modules/video_output/opengl/renderer.c
+++ b/modules/video_output/opengl/renderer.c
@@ -249,7 +249,11 @@ BuildVertexShader(const struct vlc_gl_renderer *renderer)
 {
     /* Basic vertex shader */
     static const char *template =
-        "#version %u\n"
+#if defined(USE_OPENGL_ES2)
+        "#version 100\n"
+#else
+        "#version 120\n"
+#endif
         "attribute vec2 PicCoordsIn;\n"
         "varying vec2 PicCoords;\n"
         "attribute vec3 VertexPosition;\n"
@@ -263,8 +267,8 @@ BuildVertexShader(const struct vlc_gl_renderer *renderer)
         "               * vec4(VertexPosition, 1.0);\n"
         "}";
 
-    char *code;
-    if (asprintf(&code, template, renderer->glsl_version) < 0)
+    char *code = strdup(template);
+    if (code == NULL)
         return NULL;
 
     if (renderer->b_dump_shaders)
@@ -285,9 +289,14 @@ BuildFragmentShader(struct vlc_gl_renderer *renderer)
         return NULL;
 
     static const char *template =
-        "#version %u\n"
+#if defined(USE_OPENGL_ES2)
+        "#version 100\n"
         "%s" /* extensions */
-        "%s" /* precision header */
+        "precision highp float;\n"
+#else
+        "#version 120\n"
+        "%s" /* extensions */
+#endif
         "%s" /* vlc_texture definition */
         "varying vec2 PicCoords;\n"
         "void main() {\n"
@@ -300,8 +309,7 @@ BuildFragmentShader(struct vlc_gl_renderer *renderer)
                            : "";
 
     char *code;
-    int ret = asprintf(&code, template, renderer->glsl_version, extensions,
-                       renderer->glsl_precision_header, vlc_texture);
+    int ret = asprintf(&code, template, extensions, vlc_texture);
     free(vlc_texture);
     if (ret < 0)
         return NULL;
@@ -451,13 +459,6 @@ vlc_gl_renderer_New(vlc_gl_t *gl, const struct vlc_gl_api *api,
     renderer->api = api;
     renderer->vt = vt;
     renderer->b_dump_shaders = b_dump_shaders;
-#if defined(USE_OPENGL_ES2)
-    renderer->glsl_version = 100;
-    renderer->glsl_precision_header = "precision highp float;\n";
-#else
-    renderer->glsl_version = 120;
-    renderer->glsl_precision_header = "";
-#endif
 
 #ifdef HAVE_LIBPLACEBO
     // Create the main libplacebo context
diff --git a/modules/video_output/opengl/renderer.h b/modules/video_output/opengl/renderer.h
index 8151045eb4..a4144e61f9 100644
--- a/modules/video_output/opengl/renderer.h
+++ b/modules/video_output/opengl/renderer.h
@@ -52,12 +52,6 @@ struct vlc_gl_renderer
     /* True to dump shaders, set by the caller */
     bool b_dump_shaders;
 
-    /* GLSL version, set by the caller. 100 for GLSL ES, 120 for desktop GLSL */
-    unsigned glsl_version;
-    /* Precision header, set by the caller. In OpenGLES, the fragment language
-     * has no default precision qualifier for floating point types. */
-    const char *glsl_precision_header;
-
     GLuint program_id;
 
     struct {
-- 
2.24.1 (Apple Git-126)



More information about the vlc-devel mailing list