X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=footer.frag;h=8a55b01bbaa373a3a9d20d27d98ef2c80fcf1b0a;hp=c140b46f6cf0e920dc6fb2d35686b4e861bfaa83;hb=8e9f58fec54a4c879035b214fd7411f6ff7b3a32;hpb=06ba8d86c019208682d8883dc7187df37b027814 diff --git a/footer.frag b/footer.frag index c140b46..8a55b01 100644 --- a/footer.frag +++ b/footer.frag @@ -1,14 +1,94 @@ +// 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 SECOND_YCBCR_OUTPUT_PLANAR +#define SECOND_YCBCR_OUTPUT_PLANAR 0 +#endif + +#ifndef SECOND_YCBCR_OUTPUT_SPLIT_Y_AND_CBCR +#define SECOND_YCBCR_OUTPUT_SPLIT_Y_AND_CBCR 0 +#endif + +#ifndef SECOND_YCBCR_OUTPUT_INTERLEAVED +#define SECOND_YCBCR_OUTPUT_INTERLEAVED 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, Cb, Cr; +#elif YCBCR_OUTPUT_SPLIT_Y_AND_CBCR +out vec4 Y, Chroma; +#else +out vec4 FragColor; // Y'CbCr or RGBA. +#endif + +#if SECOND_YCBCR_OUTPUT_PLANAR +out vec4 Y2, Cb2, Cr2; +#elif SECOND_YCBCR_OUTPUT_SPLIT_Y_AND_CBCR +out vec4 Y2, Chroma2; +#elif SECOND_YCBCR_OUTPUT_INTERLEAVED +out vec4 YCbCr2; +#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 + + // Exactly the same, just with other outputs. + // (GLSL does not allow arrays of outputs.) +#if SECOND_YCBCR_OUTPUT_PLANAR + Y2 = color0.rrra; + Cb2 = color0.ggga; + Cr2 = color0.bbba; +#elif SECOND_YCBCR_OUTPUT_SPLIT_Y_AND_CBCR + Y2 = color0.rrra; + Chroma2 = color0.gbba; +#elif SECOND_YCBCR_OUTPUT_INTERLEAVED + YCbCr2 = color0; +#endif + +#if YCBCR_ALSO_OUTPUT_RGBA + RGBA = color1; #endif }