]> git.sesse.net Git - movit/blobdiff - footer.frag
Fix an issue where a (cached) shader program could be used from multiple
[movit] / footer.frag
index c140b46f6cf0e920dc6fb2d35686b4e861bfaa83..339ef7bbb335887fd36f4d209f03d3dfb6247618 100644 (file)
@@ -1,14 +1,64 @@
+// GLSL is pickier than the C++ preprocessor in if-testing for undefined
+// tokens; do some fixups here to keep it happy.
+
+#ifndef YCBCR_OUTPUT_PLANAR
+#define YCBCR_OUTPUT_PLANAR 0
+#endif
+
+#ifndef YCBCR_OUTPUT_SPLIT_Y_AND_CBCR
+#define YCBCR_OUTPUT_SPLIT_Y_AND_CBCR 0
+#endif
+
+#ifndef YCBCR_ALSO_OUTPUT_RGBA
+#define YCBCR_ALSO_OUTPUT_RGBA 0
+#endif
+
+#ifndef SQUARE_ROOT_TRANSFORMATION
+#define SQUARE_ROOT_TRANSFORMATION 0
+#endif
+
+#if YCBCR_OUTPUT_PLANAR
+out vec4 Y;
+out vec4 Cb;
+out vec4 Cr;
+#elif YCBCR_OUTPUT_SPLIT_Y_AND_CBCR
+out vec4 Y;
+out vec4 Chroma;
+#else
+out vec4 FragColor;
+#endif
+
+#if YCBCR_ALSO_OUTPUT_RGBA
+out vec4 RGBA;
+#endif
+
 void main()
 {
-       vec4 color = INPUT(tc);
+#if YCBCR_ALSO_OUTPUT_RGBA
+       vec4 color[2] = INPUT(tc);
+       vec4 color0 = color[0];
+       vec4 color1 = color[1];
+#else
+       vec4 color0 = INPUT(tc);
+#endif
+
+#if SQUARE_ROOT_TRANSFORMATION
+       // Make sure we don't give negative values to sqrt.
+       color0.rgb = sqrt(max(color0.rgb, 0.0));
+#endif
+
 #if YCBCR_OUTPUT_PLANAR
-       gl_FragData[0] = color.rrra;
-       gl_FragData[1] = color.ggga;
-       gl_FragData[2] = color.bbba;
+       Y = color0.rrra;
+       Cb = color0.ggga;
+       Cr = color0.bbba;
 #elif YCBCR_OUTPUT_SPLIT_Y_AND_CBCR
-       gl_FragData[0] = color.rrra;
-       gl_FragData[1] = color.gbba;
+       Y = color0.rrra;
+       Chroma = color0.gbba;
 #else
-       gl_FragColor = color;
+       FragColor = color0;
+#endif
+
+#if YCBCR_ALSO_OUTPUT_RGBA
+       RGBA = color1;
 #endif
 }