]> git.sesse.net Git - movit/blobdiff - ycbcr_input.frag
Fix a bug where combined fp16 weights would be horribly wrong.
[movit] / ycbcr_input.frag
index 13e44b071398b986bb2a9037f27fed2016a65645..c57c6d184441445d57b1d0892f83dfc059383eec 100644 (file)
@@ -1,6 +1,8 @@
-uniform sampler2D PREFIX(tex_y);
-uniform sampler2D PREFIX(tex_cb);
-uniform sampler2D PREFIX(tex_cr);
+// Implicit uniforms:
+// uniform sampler2D PREFIX(tex_y);
+// uniform sampler2D PREFIX(tex_cbcr);  // If CB_CR_SAME_TEXTURE.
+// uniform sampler2D PREFIX(tex_cb);    // If not CB_CR_SAME_TEXTURE.
+// uniform sampler2D PREFIX(tex_cr);    // If not CB_CR_SAME_TEXTURE.
 
 vec4 FUNCNAME(vec2 tc) {
        // OpenGL's origin is bottom-left, but most graphics software assumes
@@ -9,12 +11,20 @@ vec4 FUNCNAME(vec2 tc) {
        tc.y = 1.0 - tc.y;
 
        vec3 ycbcr;
-       ycbcr.x = texture2D(PREFIX(tex_y), tc).x;
-       ycbcr.y = texture2D(PREFIX(tex_cb), tc + PREFIX(chroma_offset)).x;
-       ycbcr.z = texture2D(PREFIX(tex_cr), tc + PREFIX(chroma_offset)).x;
+       ycbcr.x = tex2D(PREFIX(tex_y), tc).x;
+#if CB_CR_SAME_TEXTURE
+#if CB_CR_OFFSETS_EQUAL
+       ycbcr.yz = tex2D(PREFIX(tex_cbcr), tc + PREFIX(cb_offset)).xy;
+#else
+       ycbcr.y = tex2D(PREFIX(tex_cbcr), tc + PREFIX(cb_offset)).x;
+       ycbcr.z = tex2D(PREFIX(tex_cbcr), tc + PREFIX(cr_offset)).x;
+#endif
+#else
+       ycbcr.y = tex2D(PREFIX(tex_cb), tc + PREFIX(cb_offset)).x;
+       ycbcr.z = tex2D(PREFIX(tex_cr), tc + PREFIX(cr_offset)).x;
+#endif
 
        ycbcr -= PREFIX(offset);
-       ycbcr *= PREFIX(scale);
 
        vec4 rgba;
        rgba.rgb = PREFIX(inv_ycbcr_matrix) * ycbcr;