[vlc-commits] gl: move xyz12 fragment into opengl_fragment_shader_init

Thomas Guillem git at videolan.org
Wed Aug 30 13:54:00 CEST 2017


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Thu Aug 24 17:23:29 2017 +0200| [6e516161288ab30e529e594e438daa8fa4ef7cba] | committer: Thomas Guillem

gl: move xyz12 fragment into opengl_fragment_shader_init

Refs #18575

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6e516161288ab30e529e594e438daa8fa4ef7cba
---

 modules/video_output/opengl/converters.c | 216 ++++++++++++++++---------------
 1 file changed, 110 insertions(+), 106 deletions(-)

diff --git a/modules/video_output/opengl/converters.c b/modules/video_output/opengl/converters.c
index 20bc9a5cac..23fb862ada 100644
--- a/modules/video_output/opengl/converters.c
+++ b/modules/video_output/opengl/converters.c
@@ -357,6 +357,74 @@ tc_base_prepare_shader(const opengl_tex_converter_t *tc,
 #endif
 }
 
+static int
+tc_xyz12_fetch_locations(opengl_tex_converter_t *tc, GLuint program)
+{
+    tc->uloc.Texture[0] = tc->vt->GetUniformLocation(program, "Texture0");
+    return tc->uloc.Texture[0] != -1 ? VLC_SUCCESS : VLC_EGENERIC;
+}
+
+static void
+tc_xyz12_prepare_shader(const opengl_tex_converter_t *tc,
+                        const GLsizei *tex_width, const GLsizei *tex_height,
+                        float alpha)
+{
+    (void) tex_width; (void) tex_height; (void) alpha;
+    tc->vt->Uniform1i(tc->uloc.Texture[0], 0);
+}
+
+static GLuint
+xyz12_shader_init(opengl_tex_converter_t *tc)
+{
+    tc->tex_count = 1;
+    tc->tex_target = GL_TEXTURE_2D;
+    tc->texs[0] = (struct opengl_tex_cfg) {
+        { 1, 1 }, { 1, 1 }, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT
+    };
+
+    tc->pf_fetch_locations = tc_xyz12_fetch_locations;
+    tc->pf_prepare_shader = tc_xyz12_prepare_shader;
+
+    /* Shader for XYZ to RGB correction
+     * 3 steps :
+     *  - XYZ gamma correction
+     *  - XYZ to RGB matrix conversion
+     *  - reverse RGB gamma correction
+     */
+    static const char *code =
+        "#version " GLSL_VERSION "\n"
+        PRECISION
+        "uniform sampler2D Texture0;"
+        "uniform vec4 xyz_gamma = vec4(2.6);"
+        "uniform vec4 rgb_gamma = vec4(1.0/2.2);"
+        /* WARN: matrix Is filled column by column (not row !) */
+        "uniform mat4 matrix_xyz_rgb = mat4("
+        "    3.240454 , -0.9692660, 0.0556434, 0.0,"
+        "   -1.5371385,  1.8760108, -0.2040259, 0.0,"
+        "    -0.4985314, 0.0415560, 1.0572252,  0.0,"
+        "    0.0,      0.0,         0.0,        1.0 "
+        " );"
+
+        "varying vec2 TexCoord0;"
+        "void main()"
+        "{ "
+        " vec4 v_in, v_out;"
+        " v_in  = texture2D(Texture0, TexCoord0);"
+        " v_in = pow(v_in, xyz_gamma);"
+        " v_out = matrix_xyz_rgb * v_in ;"
+        " v_out = pow(v_out, rgb_gamma) ;"
+        " v_out = clamp(v_out, 0.0, 1.0) ;"
+        " gl_FragColor = v_out;"
+        "}";
+
+    GLuint fragment_shader = tc->vt->CreateShader(GL_FRAGMENT_SHADER);
+    if (fragment_shader == 0)
+        return 0;
+    tc->vt->ShaderSource(fragment_shader, 1, &code, NULL);
+    tc->vt->CompileShader(fragment_shader);
+    return fragment_shader;
+}
+
 GLuint
 opengl_fragment_shader_init(opengl_tex_converter_t *tc, GLenum tex_target,
                             vlc_fourcc_t chroma, video_color_space_t yuv_space)
@@ -365,6 +433,10 @@ opengl_fragment_shader_init(opengl_tex_converter_t *tc, GLenum tex_target,
     const bool is_yuv = vlc_fourcc_IsYUV(chroma);
     bool yuv_swap_uv = false;
     int ret;
+
+    if (chroma == VLC_CODEC_XYZ12)
+        return xyz12_shader_init(tc);
+
     if (is_yuv)
         ret = tc_yuv_base_init(tc, tex_target, chroma, yuv_space,
                                &yuv_swap_uv, swizzle_per_tex);
@@ -979,74 +1051,6 @@ tc_common_release(const opengl_tex_converter_t *tc)
 }
 
 static int
-tc_xyz12_fetch_locations(opengl_tex_converter_t *tc, GLuint program)
-{
-    tc->uloc.Texture[0] = tc->vt->GetUniformLocation(program, "Texture0");
-    return tc->uloc.Texture[0] != -1 ? VLC_SUCCESS : VLC_EGENERIC;
-}
-
-static void
-tc_xyz12_prepare_shader(const opengl_tex_converter_t *tc,
-                        const GLsizei *tex_width, const GLsizei *tex_height,
-                        float alpha)
-{
-    (void) tex_width; (void) tex_height; (void) alpha;
-    tc->vt->Uniform1i(tc->uloc.Texture[0], 0);
-}
-
-static GLuint
-xyz12_shader_init(opengl_tex_converter_t *tc)
-{
-    tc->tex_count = 1;
-    tc->tex_target = GL_TEXTURE_2D;
-    tc->texs[0] = (struct opengl_tex_cfg) {
-        { 1, 1 }, { 1, 1 }, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT
-    };
-
-    tc->pf_fetch_locations = tc_xyz12_fetch_locations;
-    tc->pf_prepare_shader = tc_xyz12_prepare_shader;
-
-    /* Shader for XYZ to RGB correction
-     * 3 steps :
-     *  - XYZ gamma correction
-     *  - XYZ to RGB matrix conversion
-     *  - reverse RGB gamma correction
-     */
-    static const char *code =
-        "#version " GLSL_VERSION "\n"
-        PRECISION
-        "uniform sampler2D Texture0;"
-        "uniform vec4 xyz_gamma = vec4(2.6);"
-        "uniform vec4 rgb_gamma = vec4(1.0/2.2);"
-        /* WARN: matrix Is filled column by column (not row !) */
-        "uniform mat4 matrix_xyz_rgb = mat4("
-        "    3.240454 , -0.9692660, 0.0556434, 0.0,"
-        "   -1.5371385,  1.8760108, -0.2040259, 0.0,"
-        "    -0.4985314, 0.0415560, 1.0572252,  0.0,"
-        "    0.0,      0.0,         0.0,        1.0 "
-        " );"
-
-        "varying vec2 TexCoord0;"
-        "void main()"
-        "{ "
-        " vec4 v_in, v_out;"
-        " v_in  = texture2D(Texture0, TexCoord0);"
-        " v_in = pow(v_in, xyz_gamma);"
-        " v_out = matrix_xyz_rgb * v_in ;"
-        " v_out = pow(v_out, rgb_gamma) ;"
-        " v_out = clamp(v_out, 0.0, 1.0) ;"
-        " gl_FragColor = v_out;"
-        "}";
-
-    GLuint fragment_shader = tc->vt->CreateShader(GL_FRAGMENT_SHADER);
-    if (fragment_shader == 0)
-        return 0;
-    tc->vt->ShaderSource(fragment_shader, 1, &code, NULL);
-    tc->vt->CompileShader(fragment_shader);
-    return fragment_shader;
-}
-
-static int
 generic_init(opengl_tex_converter_t *tc, bool allow_dr)
 {
     const vlc_chroma_description_t *desc =
@@ -1056,55 +1060,55 @@ generic_init(opengl_tex_converter_t *tc, bool allow_dr)
         return VLC_EGENERIC;
 
     GLuint fragment_shader = 0;
-    if (tc->fmt.i_chroma == VLC_CODEC_XYZ12)
-        fragment_shader = xyz12_shader_init(tc);
-    else
+    video_color_space_t space;
+    const vlc_fourcc_t *list;
+
+    if (vlc_fourcc_IsYUV(tc->fmt.i_chroma))
     {
-        video_color_space_t space;
-        const vlc_fourcc_t *(*get_fallback)(vlc_fourcc_t i_fourcc);
+        GLint max_texture_units = 0;
+        tc->vt->GetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &max_texture_units);
+        if (max_texture_units < 3)
+            return VLC_EGENERIC;
 
-        if (vlc_fourcc_IsYUV(tc->fmt.i_chroma))
-        {
-            GLint max_texture_units = 0;
-            tc->vt->GetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &max_texture_units);
-            if (max_texture_units < 3)
-                return VLC_EGENERIC;
+        list = vlc_fourcc_GetYUVFallback(tc->fmt.i_chroma);
+        space = tc->fmt.space;
+    }
+    else if (tc->fmt.i_chroma == VLC_CODEC_XYZ12)
+    {
+        static const vlc_fourcc_t xyz12_list[] = { VLC_CODEC_XYZ12, 0 };
+        list = xyz12_list;
+        space = COLOR_SPACE_UNDEF;
+    }
+    else
+    {
+        list = vlc_fourcc_GetRGBFallback(tc->fmt.i_chroma);
+        space = COLOR_SPACE_UNDEF;
+    }
 
-            get_fallback = vlc_fourcc_GetYUVFallback;
-            space = tc->fmt.space;
-        }
-        else
+    while (*list)
+    {
+        fragment_shader =
+            opengl_fragment_shader_init(tc, GL_TEXTURE_2D, *list, space);
+        if (fragment_shader != 0)
         {
-            get_fallback = vlc_fourcc_GetRGBFallback;
-            space = COLOR_SPACE_UNDEF;
-        }
+            tc->fmt.i_chroma = *list;
 
-        const vlc_fourcc_t *list = get_fallback(tc->fmt.i_chroma);
-        while (*list)
-        {
-            fragment_shader =
-                opengl_fragment_shader_init(tc, GL_TEXTURE_2D, *list, space);
-            if (fragment_shader != 0)
+            if (tc->fmt.i_chroma == VLC_CODEC_RGB32)
             {
-                tc->fmt.i_chroma = *list;
-
-                if (tc->fmt.i_chroma == VLC_CODEC_RGB32)
-                {
 #if defined(WORDS_BIGENDIAN)
-                    tc->fmt.i_rmask  = 0xff000000;
-                    tc->fmt.i_gmask  = 0x00ff0000;
-                    tc->fmt.i_bmask  = 0x0000ff00;
+                tc->fmt.i_rmask  = 0xff000000;
+                tc->fmt.i_gmask  = 0x00ff0000;
+                tc->fmt.i_bmask  = 0x0000ff00;
 #else
-                    tc->fmt.i_rmask  = 0x000000ff;
-                    tc->fmt.i_gmask  = 0x0000ff00;
-                    tc->fmt.i_bmask  = 0x00ff0000;
+                tc->fmt.i_rmask  = 0x000000ff;
+                tc->fmt.i_gmask  = 0x0000ff00;
+                tc->fmt.i_bmask  = 0x00ff0000;
 #endif
-                    video_format_FixRgb(&tc->fmt);
-                }
-                break;
+                video_format_FixRgb(&tc->fmt);
             }
-            list++;
+            break;
         }
+        list++;
     }
     if (fragment_shader == 0)
         return VLC_EGENERIC;



More information about the vlc-commits mailing list