[vlc-devel] [PATCH 2/2] opengl: move fragment shader creation to renderer

Alexandre Janniaux ajanni at videolabs.io
Mon Mar 23 21:14:11 CET 2020


Hi,

Why not keep such function in fragment_shader.c, especially
if part of it has to be moved back afterwards?

Regards,
--
Alexandre Janniaux
Videolabs

On Mon, Mar 23, 2020 at 03:55:41PM +0100, Romain Vimont wrote:
> Make the renderer create the fragment shader, using the vlc_texture()
> function generated by fragment_shader.c.
> ---
>  .../video_output/opengl/fragment_shaders.c    | 31 +------------
>  modules/video_output/opengl/renderer.c        | 46 +++++++++++++++++--
>  2 files changed, 44 insertions(+), 33 deletions(-)
>
> diff --git a/modules/video_output/opengl/fragment_shaders.c b/modules/video_output/opengl/fragment_shaders.c
> index 4c7b0ae2fa..9bc7e9b6bd 100644
> --- a/modules/video_output/opengl/fragment_shaders.c
> +++ b/modules/video_output/opengl/fragment_shaders.c
> @@ -336,8 +336,6 @@ xyz12_shader_init(struct vlc_gl_renderer *renderer)
>       *  - reverse RGB gamma correction
>       */
>      static const char *template =
> -        "#version %u\n"
> -        "%s"
>          "uniform sampler2D Texture0;"
>          "uniform vec4 xyz_gamma = vec4(2.6);"
>          "uniform vec4 rgb_gamma = vec4(1.0/2.2);"
> @@ -349,7 +347,6 @@ xyz12_shader_init(struct vlc_gl_renderer *renderer)
>          "    0.0,      0.0,         0.0,        1.0 "
>          " );"
>
> -        "varying vec2 PicCoords;"
>          "vec4 vlc_texture(vec2 pic_coords)\n"
>          "{ "
>          " vec4 v_in, v_out;"
> @@ -359,17 +356,9 @@ xyz12_shader_init(struct vlc_gl_renderer *renderer)
>          " v_out = pow(v_out, rgb_gamma) ;"
>          " v_out = clamp(v_out, 0.0, 1.0) ;"
>          " return v_out;"
> -        "}\n"
> -        "void main() {\n"
> -        " gl_FragColor = vlc_texture(PicCoords);\n"
>          "}\n";
>
> -    char *code;
> -    if (asprintf(&code, template, renderer->glsl_version,
> -                 renderer->glsl_precision_header) < 0)
> -        return NULL;
> -
> -    return code;
> +    return strdup(template);
>  }
>
>  static int
> @@ -484,15 +473,7 @@ opengl_fragment_shader_init(struct vlc_gl_renderer *renderer, GLenum tex_target,
>  #define ADD(x) vlc_memstream_puts(&ms, x)
>  #define ADDF(x, ...) vlc_memstream_printf(&ms, x, ##__VA_ARGS__)
>
> -    ADDF("#version %u\n", renderer->glsl_version);
> -
> -    if (tex_target == GL_TEXTURE_EXTERNAL_OES)
> -        ADDF("#extension GL_OES_EGL_image_external : require\n");
> -
> -    ADDF("%s", renderer->glsl_precision_header);
> -
> -    ADD("varying vec2 PicCoords;\n"
> -        "uniform mat4 TransformMatrix;\n"
> +    ADD("uniform mat4 TransformMatrix;\n"
>          "uniform mat4 OrientationMatrix;\n");
>      for (unsigned i = 0; i < interop->tex_count; ++i)
>          ADDF("uniform %s Texture%u;\n"
> @@ -642,20 +623,12 @@ opengl_fragment_shader_init(struct vlc_gl_renderer *renderer, GLenum tex_target,
>      ADD(" return result * FillColor;\n"
>          "}\n");
>
> -    ADD("void main() {\n"
> -        " gl_FragColor = vlc_texture(PicCoords);\n"
> -        "}\n");
> -
>  #undef ADD
>  #undef ADDF
>
>      if (vlc_memstream_close(&ms) != 0)
>          return NULL;
>
> -    if (renderer->b_dump_shaders)
> -        msg_Dbg(renderer->gl, "\n=== Fragment shader for fourcc: %4.4s, colorspace: %d ===\n%s\n",
> -                (const char *)&chroma, yuv_space, ms.ptr);
> -
>      renderer->pf_fetch_locations = renderer_base_fetch_locations;
>      renderer->pf_prepare_shader = renderer_base_prepare_shader;
>
> diff --git a/modules/video_output/opengl/renderer.c b/modules/video_output/opengl/renderer.c
> index 3aaf3b59b9..ae4179be4a 100644
> --- a/modules/video_output/opengl/renderer.c
> +++ b/modules/video_output/opengl/renderer.c
> @@ -273,6 +273,47 @@ BuildVertexShader(const struct vlc_gl_renderer *renderer)
>      return code;
>  }
>
> +static char *
> +BuildFragmentShader(struct vlc_gl_renderer *renderer)
> +{
> +    struct vlc_gl_interop *interop = renderer->interop;
> +    char *vlc_texture =
> +        opengl_fragment_shader_init(renderer, interop->tex_target,
> +                                    interop->sw_fmt.i_chroma,
> +                                    interop->sw_fmt.space);
> +    if (!vlc_texture)
> +        return NULL;
> +
> +    static const char *template =
> +        "#version %u\n"
> +        "%s" /* extensions */
> +        "%s" /* precision header */
> +        "%s" /* vlc_texture definition */
> +        "varying vec2 PicCoords;\n"
> +        "void main() {\n"
> +        " gl_FragColor = vlc_texture(PicCoords);\n"
> +        "}\n";
> +
> +    /* TODO move extensions back to fragment_shaders.c */
> +    const char *extensions = interop->tex_target == GL_TEXTURE_EXTERNAL_OES
> +                           ? "#extension GL_OES_EGL_image_external : require\n"
> +                           : "";
> +
> +    char *code;
> +    int ret = asprintf(&code, template, renderer->glsl_version, extensions,
> +                       renderer->glsl_precision_header, vlc_texture);
> +    free(vlc_texture);
> +    if (ret < 0)
> +        return NULL;
> +
> +    if (renderer->b_dump_shaders)
> +        msg_Dbg(renderer->gl, "\n=== Fragment shader for fourcc: %4.4s, colorspace: %d ===\n%s\n",
> +                              (const char *) &interop->sw_fmt.i_chroma,
> +                              interop->sw_fmt.space, code);
> +
> +    return code;
> +}
> +
>  static int
>  opengl_link_program(struct vlc_gl_renderer *renderer)
>  {
> @@ -283,10 +324,7 @@ opengl_link_program(struct vlc_gl_renderer *renderer)
>      if (!vertex_shader)
>          return VLC_EGENERIC;
>
> -    char *fragment_shader =
> -        opengl_fragment_shader_init(renderer, interop->tex_target,
> -                                    interop->sw_fmt.i_chroma,
> -                                    interop->sw_fmt.space);
> +    char *fragment_shader = BuildFragmentShader(renderer);
>      if (!fragment_shader)
>      {
>          free(vertex_shader);
> --
> 2.26.0.rc2
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list