[vlc-devel] [PATCH 2/2] opengl: move fragment shader creation to renderer
Romain Vimont
rom1v at videolabs.io
Mon Mar 23 15:55:41 CET 2020
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
More information about the vlc-devel
mailing list