[vlc-devel] [PATCH v2 04/29] opengl: make fragment shader local
Romain Vimont
rom1v at videolabs.io
Thu Feb 6 14:17:33 CET 2020
Since vlc_gl_interop has been introduced, the fragment shader is built
by vout_helper instead of the converter module.
Therefore, there is no need to keep it exposed in the
opengl_tex_converter_t instance.
---
modules/video_output/opengl/converter.h | 4 ---
modules/video_output/opengl/vout_helper.c | 42 ++++++++++-------------
2 files changed, 19 insertions(+), 27 deletions(-)
diff --git a/modules/video_output/opengl/converter.h b/modules/video_output/opengl/converter.h
index 2d3ec4287b..11a2ab61c2 100644
--- a/modules/video_output/opengl/converter.h
+++ b/modules/video_output/opengl/converter.h
@@ -59,10 +59,6 @@ struct opengl_tex_converter_t
* has no default precision qualifier for floating point types. */
const char *glsl_precision_header;
- /* Fragment shader, must be set from the module open function. It will be
- * deleted by the caller. */
- GLuint fshader;
-
/* The following is used and filled by the opengl_fragment_shader_init
* function. */
struct {
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index a6b5caf0b5..70fda639b4 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -394,7 +394,23 @@ opengl_link_program(struct prgm *prgm)
struct vlc_gl_interop *interop = tc->interop;
GLuint vertex_shader = BuildVertexShader(tc, interop->tex_count);
- GLuint shaders[] = { tc->fshader, vertex_shader };
+ if (!vertex_shader)
+ return VLC_EGENERIC;
+
+ GLuint fragment_shader =
+ opengl_fragment_shader_init(tc, interop->tex_target,
+ interop->sw_fmt.i_chroma,
+ interop->sw_fmt.space);
+ if (!fragment_shader)
+ return VLC_EGENERIC;
+
+ assert(interop->tex_target != 0 &&
+ interop->tex_count > 0 &&
+ interop->ops->update_textures != NULL &&
+ tc->pf_fetch_locations != NULL &&
+ tc->pf_prepare_shader != NULL);
+
+ GLuint shaders[] = { fragment_shader, vertex_shader };
/* Check shaders messages */
for (unsigned i = 0; i < 2; i++) {
@@ -415,12 +431,12 @@ opengl_link_program(struct prgm *prgm)
}
prgm->id = tc->vt->CreateProgram();
- tc->vt->AttachShader(prgm->id, tc->fshader);
+ tc->vt->AttachShader(prgm->id, fragment_shader);
tc->vt->AttachShader(prgm->id, vertex_shader);
tc->vt->LinkProgram(prgm->id);
tc->vt->DeleteShader(vertex_shader);
- tc->vt->DeleteShader(tc->fshader);
+ tc->vt->DeleteShader(fragment_shader);
/* Check program messages */
int infoLength = 0;
@@ -623,26 +639,6 @@ opengl_init_program(vout_display_opengl_t *vgl, vlc_video_context *context,
return VLC_EGENERIC;
}
- GLuint fragment_shader =
- opengl_fragment_shader_init(tc, interop->tex_target,
- interop->sw_fmt.i_chroma,
- interop->sw_fmt.space);
- if (!fragment_shader)
- {
- vlc_object_delete(interop);
- free(tc);
- return VLC_EGENERIC;
- }
-
- tc->fshader = fragment_shader;
-
- assert(tc->fshader != 0 &&
- interop->tex_target != 0 &&
- interop->tex_count > 0 &&
- interop->ops->update_textures != NULL &&
- tc->pf_fetch_locations != NULL &&
- tc->pf_prepare_shader != NULL);
-
prgm->tc = tc;
ret = opengl_link_program(prgm);
--
2.25.0
More information about the vlc-devel
mailing list