[vlc-devel] [PATCH 02/10] opengl: store fragment shader in sampler

Rémi Denis-Courmont remi at remlab.net
Wed May 20 17:53:16 CEST 2020


Le keskiviikkona 20. toukokuuta 2020, 17.08.13 EEST Romain Vimont a écrit :
> The function opengl_fragment_shader_init() both initializes the sampler
> and creates the fragment shader.
> 
> To be able to move its initialization outside the renderer, store it in
> the sampler instead of returning it.
> 
> This will also allow to provide the "extensions" part of the fragment
> shader as a separate string.
> ---
>  .../video_output/opengl/fragment_shaders.c    | 24 ++++++++++++-------
>  modules/video_output/opengl/internal.h        |  2 +-
>  modules/video_output/opengl/renderer.c        |  9 ++++---
>  modules/video_output/opengl/sampler.c         |  4 ++++
>  modules/video_output/opengl/sampler.h         | 12 ++++++++++
>  5 files changed, 36 insertions(+), 15 deletions(-)
> 
> diff --git a/modules/video_output/opengl/fragment_shaders.c
> b/modules/video_output/opengl/fragment_shaders.c index
> a779d7df5d10..a85b6e409101 100644
> --- a/modules/video_output/opengl/fragment_shaders.c
> +++ b/modules/video_output/opengl/fragment_shaders.c
> @@ -392,7 +392,7 @@ sampler_xyz12_prepare_shader(const struct vlc_gl_sampler
> *sampler) sampler->var.OrientationMatrix);
>  }
> 
> -static char *
> +static int
>  xyz12_shader_init(struct vlc_gl_sampler *sampler)
>  {
>      sampler->pf_fetch_locations = sampler_xyz12_fetch_locations;
> @@ -433,7 +433,11 @@ xyz12_shader_init(struct vlc_gl_sampler *sampler)
>          " return v_out;"
>          "}\n";
> 
> -    return strdup(template);
> +    sampler->shader.body = strdup(template);
> +    if (!sampler->shader.body)
> +        return VLC_ENOMEM;
> +
> +    return VLC_SUCCESS;
>  }
> 
>  static int
> @@ -495,7 +499,7 @@ opengl_init_swizzle(const struct vlc_gl_interop
> *interop, return VLC_SUCCESS;
>  }
> 
> -char *
> +int
>  opengl_fragment_shader_init(struct vlc_gl_sampler *sampler, GLenum
> tex_target, vlc_fourcc_t chroma, video_color_space_t yuv_space) {
> @@ -507,7 +511,7 @@ opengl_fragment_shader_init(struct vlc_gl_sampler
> *sampler, GLenum tex_target,
> 
>      const vlc_chroma_description_t *desc =
> vlc_fourcc_GetChromaDescription(chroma); if (desc == NULL)
> -        return NULL;
> +        return VLC_EGENERIC;
> 
>      if (chroma == VLC_CODEC_XYZ12)
>          return xyz12_shader_init(sampler);
> @@ -516,10 +520,10 @@ opengl_fragment_shader_init(struct vlc_gl_sampler
> *sampler, GLenum tex_target, {
>          ret = sampler_yuv_base_init(sampler, chroma, desc, yuv_space);
>          if (ret != VLC_SUCCESS)
> -            return NULL;
> +            return ret;
>          ret = opengl_init_swizzle(interop, swizzle_per_tex, chroma, desc);
>          if (ret != VLC_SUCCESS)
> -            return NULL;
> +            return ret;
>      }
> 
>      const char *glsl_sampler, *lookup;
> @@ -543,7 +547,7 @@ opengl_fragment_shader_init(struct vlc_gl_sampler
> *sampler, GLenum tex_target,
> 
>      struct vlc_memstream ms;
>      if (vlc_memstream_open(&ms) != 0)
> -        return NULL;
> +        return ret;

Why this and how?

> 
>  #define ADD(x) vlc_memstream_puts(&ms, x)
>  #define ADDF(x, ...) vlc_memstream_printf(&ms, x, ##__VA_ARGS__)
> @@ -701,10 +705,12 @@ opengl_fragment_shader_init(struct vlc_gl_sampler
> *sampler, GLenum tex_target, #undef ADDF
> 
>      if (vlc_memstream_close(&ms) != 0)
> -        return NULL;
> +        return VLC_EGENERIC;
> +
> +    sampler->shader.body = ms.ptr;
> 
>      sampler->pf_fetch_locations = sampler_base_fetch_locations;
>      sampler->pf_prepare_shader = sampler_base_prepare_shader;
> 
> -    return ms.ptr;
> +    return VLC_SUCCESS;
>  }
> diff --git a/modules/video_output/opengl/internal.h
> b/modules/video_output/opengl/internal.h index a6e4101663b8..14946de3f9c5
> 100644
> --- a/modules/video_output/opengl/internal.h
> +++ b/modules/video_output/opengl/internal.h
> @@ -28,7 +28,7 @@ int
>  opengl_interop_init_impl(struct vlc_gl_interop *interop, GLenum tex_target,
> vlc_fourcc_t chroma, video_color_space_t yuv_space);
> 
> -char *
> +int
>  opengl_fragment_shader_init(struct vlc_gl_sampler *sampler,
>                              GLenum, vlc_fourcc_t, video_color_space_t);
>  int
> diff --git a/modules/video_output/opengl/renderer.c
> b/modules/video_output/opengl/renderer.c index 3083988ef435..095245f6e51f
> 100644
> --- a/modules/video_output/opengl/renderer.c
> +++ b/modules/video_output/opengl/renderer.c
> @@ -270,11 +270,11 @@ BuildFragmentShader(struct vlc_gl_renderer *renderer)
>  {
>      struct vlc_gl_sampler *sampler = renderer->sampler;
>      const struct vlc_gl_interop *interop = sampler->interop;
> -    char *vlc_texture =
> +    int ret =
>          opengl_fragment_shader_init(sampler, interop->tex_target,
>                                      interop->sw_fmt.i_chroma,
>                                      interop->sw_fmt.space);
> -    if (!vlc_texture)
> +    if (ret != VLC_SUCCESS)
>          return NULL;
> 
>      static const char *template =
> @@ -293,9 +293,8 @@ BuildFragmentShader(struct vlc_gl_renderer *renderer)
> 
>                             : "";
> 
>      char *code;
> -    int ret = asprintf(&code, template, renderer->glsl_version, extensions,
> -                       renderer->glsl_precision_header, vlc_texture); -   
> free(vlc_texture);
> +    ret = asprintf(&code, template, renderer->glsl_version, extensions,
> +                   renderer->glsl_precision_header, sampler->shader.body);
>      if (ret < 0)
>          return NULL;
> 
> diff --git a/modules/video_output/opengl/sampler.c
> b/modules/video_output/opengl/sampler.c index 12d6f7bdc994..42f9851de94b
> 100644
> --- a/modules/video_output/opengl/sampler.c
> +++ b/modules/video_output/opengl/sampler.c
> @@ -55,6 +55,8 @@ vlc_gl_sampler_New(struct vlc_gl_interop *interop)
>      sampler->gl = interop->gl;
>      sampler->vt = interop->vt;
> 
> +    sampler->shader.body = NULL;
> +
>  #ifdef HAVE_LIBPLACEBO
>      // Create the main libplacebo context
>      sampler->pl_ctx = vlc_placebo_Create(VLC_OBJECT(interop->gl));
> @@ -123,5 +125,7 @@ vlc_gl_sampler_Delete(struct vlc_gl_sampler *sampler)
>          pl_context_destroy(&sampler->pl_ctx);
>  #endif
> 
> +    free(sampler->shader.body);
> +
>      free(sampler);
>  }
> diff --git a/modules/video_output/opengl/sampler.h
> b/modules/video_output/opengl/sampler.h index b5b296872b65..9b0614403ff8
> 100644
> --- a/modules/video_output/opengl/sampler.h
> +++ b/modules/video_output/opengl/sampler.h
> @@ -90,6 +90,18 @@ struct vlc_gl_sampler {
> 
>      struct vlc_gl_interop *interop;
> 
> +    struct {
> +        /* Piece of code necessary to declare and implement the GLSL
> function +         * vlc_texture(vec2 coords).
> +         *
> +         * It must be injected in the fragment shader before calling this
> +         * function.
> +         *
> +         * It may not be NULL.
> +         */
> +        char *body;
> +    } shader;
> +
>      /**
>       * Callback to fetch locations of uniform or attributes variables
>       *


-- 
レミ・デニ-クールモン
http://www.remlab.net/





More information about the vlc-devel mailing list