[vlc-devel] [PATCH 02/10] opengl: store fragment shader in sampler
Romain Vimont
rom1v at videolabs.io
Wed May 20 19:40:54 CEST 2020
On Wed, May 20, 2020 at 06:53:16PM +0300, Rémi Denis-Courmont wrote:
> 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?
Oops, "return VLC_EGENERIC;". Good catch.
>
> >
> > #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/
>
>
>
> _______________________________________________
> 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