]> git.sesse.net Git - casparcg/commitdiff
2.0. image_kernel: Added compability mode for wierd drivers that can't compile valid...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 11 Aug 2011 07:19:17 +0000 (07:19 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 11 Aug 2011 07:19:17 +0000 (07:19 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1134 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/image/image_kernel.cpp

index de3a20f9a8b9e014cd92042510d75f91a97a9814..013d6b801732c4cf3d81f51fa92a32783fcb1a6d 100644 (file)
@@ -55,193 +55,220 @@ GLubyte lower_pattern[] = {
 struct image_kernel::implementation : boost::noncopyable\r
 {      \r
        std::unique_ptr<shader> shader_;\r
-\r
-       std::string vertex_;\r
-       std::string fragment_;\r
-\r
+       \r
        core::video_mode::type  last_mode_;\r
        size_t                                  last_width_;\r
        size_t                                  last_height_;\r
        \r
+       std::string get_blend_color_func()\r
+       {\r
+               return \r
+                       \r
+               get_blend_glsl()\r
+               \r
+               +\r
+                       \r
+               "vec3 get_blend_color(vec3 back, vec3 fore)                                                                                     \n"\r
+               "{                                                                                                                                                                      \n"\r
+               "       switch(blend_mode)                                                                                                                              \n"\r
+               "       {                                                                                                                                                               \n"\r
+               "       case  0: return BlendNormal(back, fore);                                                                                \n"\r
+               "       case  1: return BlendLighten(back, fore);                                                                               \n"\r
+               "       case  2: return BlendDarken(back, fore);                                                                                \n"\r
+               "       case  3: return BlendMultiply(back, fore);                                                                              \n"\r
+               "       case  4: return BlendAverage(back, fore);                                                                               \n"\r
+               "       case  5: return BlendAdd(back, fore);                                                                                   \n"\r
+               "       case  6: return BlendSubstract(back, fore);                                                                             \n"\r
+               "       case  7: return BlendDifference(back, fore);                                                                    \n"\r
+               "       case  8: return BlendNegation(back, fore);                                                                              \n"\r
+               "       case  9: return BlendExclusion(back, fore);                                                                             \n"\r
+               "       case 10: return BlendScreen(back, fore);                                                                                \n"\r
+               "       case 11: return BlendOverlay(back, fore);                                                                               \n"\r
+               //"     case 12: return BlendSoftLight(back, fore);                                                                             \n"\r
+               "       case 13: return BlendHardLight(back, fore);                                                                             \n"\r
+               "       case 14: return BlendColorDodge(back, fore);                                                                    \n"\r
+               "       case 15: return BlendColorBurn(back, fore);                                                                             \n"\r
+               "       case 16: return BlendLinearDodge(back, fore);                                                                   \n"\r
+               "       case 17: return BlendLinearBurn(back, fore);                                                                    \n"\r
+               "       case 18: return BlendLinearLight(back, fore);                                                                   \n"\r
+               "       case 19: return BlendVividLight(back, fore);                                                                    \n"\r
+               "       case 20: return BlendPinLight(back, fore);                                                                              \n"\r
+               "       case 21: return BlendHardMix(back, fore);                                                                               \n"\r
+               "       case 22: return BlendReflect(back, fore);                                                                               \n"\r
+               "       case 23: return BlendGlow(back, fore);                                                                                  \n"\r
+               "       case 24: return BlendPhoenix(back, fore);                                                                               \n"\r
+               "       case 25: return BlendHue(back, fore);                                                                                   \n"\r
+               "       case 26: return BlendSaturation(back, fore);                                                                    \n"\r
+               "       case 27: return BlendColor(back, fore);                                                                                 \n"\r
+               "       case 28: return BlendLuminosity(back, fore);                                                                    \n"\r
+               "       }                                                                                                                                                               \n"\r
+               "       return BlendNormal(back, fore);                                                                                                 \n"\r
+               "}                                                                                                                                                                      \n"\r
+               "                                                                                                                                                                       \n"                                                                                                                                                       \r
+               "vec4 blend_color(vec4 fore)                                                                                                            \n"\r
+               "{                                                                                                                                                                      \n"\r
+               "   vec4 back = texture2D(background, gl_TexCoord[1].st);                                                       \n"\r
+               "   if(levels)                                                                                                                                          \n"\r
+               "               fore.rgb = LevelsControl(fore.rgb, min_input, max_input, gamma, min_output, max_output); \n"\r
+               "       if(csb)                                                                                                                                                 \n"\r
+               "               fore.rgb = ContrastSaturationBrightness(fore.rgb, brt, sat, con);                       \n"\r
+               "   fore.rgb = get_blend_color(back.bgr, fore.rgb);                                                                     \n"\r
+               "                                                                                                                                                                       \n"\r
+               "       return vec4(mix(back.rgb, fore.rgb, fore.a), back.a + fore.a);                                  \n"\r
+               "}                                                                                                                                                                      \n";\r
+       }\r
+               \r
+       std::string get_simple_blend_color_func()\r
+       {\r
+               return  \r
+\r
+               "vec4 blend_color(vec4 fore)                                                                                                            \n"\r
+               "{                                                                                                                                                                      \n"\r
+               "   vec4 back = texture2D(background, gl_TexCoord[1].st);                                                       \n"\r
+               "       return vec4(mix(back.rgb, fore.rgb, fore.a), back.a + fore.a);                                  \n"\r
+               "}                                                                                                                                                                      \n";\r
+       }\r
+\r
+       std::string get_vertex()\r
+       {\r
+               return \r
+\r
+               "void main()                                                                                                                                            \n"\r
+               "{                                                                                                                                                                      \n"\r
+               "       gl_TexCoord[0] = gl_MultiTexCoord0;                                                                                             \n"\r
+               "       gl_TexCoord[1] = gl_MultiTexCoord1;                                                                                             \n"\r
+               "       gl_FrontColor  = gl_Color;                                                                                                              \n"\r
+               "       gl_Position    = ftransform();                                                                                                  \n"\r
+               "}                                                                                                                                                                      \n";\r
+       }\r
+\r
+       std::string get_fragment(bool compability_mode)\r
+       {\r
+               return\r
+\r
+               "#version 120                                                                                                                                           \n"\r
+               "uniform sampler2D      background;                                                                                                             \n"\r
+               "uniform sampler2D      plane[4];                                                                                                               \n"\r
+               "uniform sampler2D      local_key;                                                                                                              \n"\r
+               "uniform sampler2D      layer_key;                                                                                                              \n"\r
+               "                                                                                                                                                                       \n"\r
+               "uniform bool           is_hd;                                                                                                                  \n"\r
+               "uniform bool           has_local_key;                                                                                                  \n"\r
+               "uniform bool           has_layer_key;                                                                                                  \n"\r
+               "uniform int            blend_mode;                                                                                                             \n"\r
+               "uniform int            alpha_mode;                                                                                                             \n"\r
+               "uniform int            pixel_format;                                                                                                   \n"\r
+               "                                                                                                                                                                       \n"\r
+               "uniform bool           levels;                                                                                                                 \n"\r
+               "uniform float          min_input;                                                                                                              \n"\r
+               "uniform float          max_input;                                                                                                              \n"\r
+               "uniform float          gamma;                                                                                                                  \n"\r
+               "uniform float          min_output;                                                                                                             \n"\r
+               "uniform float          max_output;                                                                                                             \n"\r
+               "                                                                                                                                                                       \n"\r
+               "uniform bool           csb;                                                                                                                    \n"\r
+               "uniform float          brt;                                                                                                                    \n"\r
+               "uniform float          sat;                                                                                                                    \n"\r
+               "uniform float          con;                                                                                                                    \n"\r
+               "                                                                                                                                                                       \n"\r
+\r
+               +\r
+\r
+               (compability_mode ? get_simple_blend_color_func() : get_blend_color_func())\r
+               \r
+               +\r
+\r
+               "                                                                                                                                                                       \n"\r
+               "// NOTE: YCbCr, ITU-R, http://www.intersil.com/data/an/an9717.pdf                                      \n"\r
+               "// TODO: Support for more yuv formats might be needed.                                                         \n"\r
+               "vec4 ycbcra_to_rgba_sd(float y, float cb, float cr, float a)                                           \n"\r
+               "{                                                                                                                                                                      \n"\r
+               "       cb -= 0.5;                                                                                                                                              \n"\r
+               "       cr -= 0.5;                                                                                                                                              \n"\r
+               "       y = 1.164*(y-0.0625);                                                                                                                   \n"\r
+               "                                                                                                                                                                       \n"\r
+               "       vec4 color;                                                                                                                                             \n"\r
+               "       color.r = y + 2.018 * cb;                                                                                                               \n"\r
+               "       color.b = y + 1.596 * cr;                                                                                                               \n"\r
+               "       color.g = y - 0.813 * cr - 0.391 * cb;                                                                                  \n"\r
+               "       color.a = a;                                                                                                                                    \n"\r
+               "                                                                                                                                                                       \n"\r
+               "       return color;                                                                                                                                   \n"\r
+               "}                                                                                                                                                                      \n"                     \r
+               "                                                                                                                                                                       \n"\r
+               "vec4 ycbcra_to_rgba_hd(float y, float cb, float cr, float a)                                           \n"\r
+               "{                                                                                                                                                                      \n"\r
+               "       cb -= 0.5;                                                                                                                                              \n"\r
+               "       cr -= 0.5;                                                                                                                                              \n"\r
+               "       y = 1.164*(y-0.0625);                                                                                                                   \n"\r
+               "                                                                                                                                                                       \n"\r
+               "       vec4 color;                                                                                                                                             \n"\r
+               "       color.r = y + 2.115 * cb;                                                                                                               \n"\r
+               "       color.b = y + 1.793 * cr;                                                                                                               \n"\r
+               "       color.g = y - 0.534 * cr - 0.213 * cb;                                                                                  \n"\r
+               "       color.a = a;                                                                                                                                    \n"\r
+               "                                                                                                                                                                       \n"\r
+               "       return color;                                                                                                                                   \n"\r
+               "}                                                                                                                                                                      \n"                     \r
+               "                                                                                                                                                                       \n"                     \r
+               "vec4 ycbcra_to_rgba(float y, float cb, float cr, float a)                                                      \n"\r
+               "{                                                                                                                                                                      \n"\r
+               "       if(is_hd)                                                                                                                                               \n"\r
+               "               return ycbcra_to_rgba_hd(y, cb, cr, a);                                                                         \n"\r
+               "       else                                                                                                                                                    \n"\r
+               "               return ycbcra_to_rgba_sd(y, cb, cr, a);                                                                         \n"\r
+               "}                                                                                                                                                                      \n"\r
+               "                                                                                                                                                                       \n"\r
+               "vec4 get_rgba_color()                                                                                                                          \n"\r
+               "{                                                                                                                                                                      \n"\r
+               "       switch(pixel_format)                                                                                                                    \n"\r
+               "       {                                                                                                                                                               \n"\r
+               "       case 0:         //gray                                                                                                                          \n"\r
+               "               return vec4(texture2D(plane[0], gl_TexCoord[0].st).rrr, 1.0);                           \n"\r
+               "       case 1:         //bgra,                                                                                                                         \n"\r
+               "               return texture2D(plane[0], gl_TexCoord[0].st).bgra;                                                     \n"\r
+               "       case 2:         //rgba,                                                                                                                         \n"\r
+               "               return texture2D(plane[0], gl_TexCoord[0].st).rgba;                                                     \n"\r
+               "       case 3:         //argb,                                                                                                                         \n"\r
+               "               return texture2D(plane[0], gl_TexCoord[0].st).argb;                                                     \n"\r
+               "       case 4:         //abgr,                                                                                                                         \n"\r
+               "               return texture2D(plane[0], gl_TexCoord[0].st).gbar;                                                     \n"\r
+               "       case 5:         //ycbcr,                                                                                                                        \n"\r
+               "               {                                                                                                                                                       \n"\r
+               "                       float y  = texture2D(plane[0], gl_TexCoord[0].st).r;                                    \n"\r
+               "                       float cb = texture2D(plane[1], gl_TexCoord[0].st).r;                                    \n"\r
+               "                       float cr = texture2D(plane[2], gl_TexCoord[0].st).r;                                    \n"\r
+               "                       return ycbcra_to_rgba(y, cb, cr, 1.0);                                                                  \n"\r
+               "               }                                                                                                                                                       \n"\r
+               "       case 6:         //ycbcra                                                                                                                        \n"\r
+               "               {                                                                                                                                                       \n"\r
+               "                       float y  = texture2D(plane[0], gl_TexCoord[0].st).r;                                    \n"\r
+               "                       float cb = texture2D(plane[1], gl_TexCoord[0].st).r;                                    \n"\r
+               "                       float cr = texture2D(plane[2], gl_TexCoord[0].st).r;                                    \n"\r
+               "                       float a  = texture2D(plane[3], gl_TexCoord[0].st).r;                                    \n"\r
+               "                       return ycbcra_to_rgba(y, cb, cr, a);                                                                    \n"\r
+               "               }                                                                                                                                                       \n"\r
+               "       }                                                                                                                                                               \n"\r
+               "       return vec4(0.0, 0.0, 0.0, 0.0);                                                                                                \n"\r
+               "}                                                                                                                                                                      \n"\r
+               "                                                                                                                                                                       \n"\r
+               "void main()                                                                                                                                            \n"\r
+               "{                                                                                                                                                                      \n"\r
+               "       vec4 color = get_rgba_color();                                                                                                  \n"\r
+               "       if(has_local_key)                                                                                                                               \n"\r
+               "               color.a *= texture2D(local_key, gl_TexCoord[1].st).r;                                           \n"\r
+               "       if(has_layer_key)                                                                                                                               \n"\r
+               "               color.a *= texture2D(layer_key, gl_TexCoord[1].st).r;                                           \n"\r
+               "       gl_FragColor = blend_color(color.bgra * gl_Color);                                                              \n"\r
+               "}                                                                                                                                                                      \n";\r
+       }\r
+\r
+\r
        implementation() \r
                : last_mode_(core::video_mode::progressive)\r
                , last_width_(0)\r
                , last_height_(0)\r
-       {\r
-               vertex_ = \r
-                       "void main()                                                                                                                                            \n"\r
-                       "{                                                                                                                                                                      \n"\r
-                       "       gl_TexCoord[0] = gl_MultiTexCoord0;                                                                                             \n"\r
-                       "       gl_TexCoord[1] = gl_MultiTexCoord1;                                                                                             \n"\r
-                       "       gl_FrontColor  = gl_Color;                                                                                                              \n"\r
-                       "       gl_Position    = ftransform();                                                                                                  \n"\r
-                       "}                                                                                                                                                                      \n";\r
-\r
-               fragment_ =\r
-                       "#version 120                                                                                                                                           \n"\r
-                       "uniform sampler2D      background;                                                                                                             \n"\r
-                       "uniform sampler2D      plane[4];                                                                                                               \n"\r
-                       "uniform sampler2D      local_key;                                                                                                              \n"\r
-                       "uniform sampler2D      layer_key;                                                                                                              \n"\r
-                       "                                                                                                                                                                       \n"\r
-                       "uniform bool           is_hd;                                                                                                                  \n"\r
-                       "uniform bool           has_local_key;                                                                                                  \n"\r
-                       "uniform bool           has_layer_key;                                                                                                  \n"\r
-                       "uniform int            blend_mode;                                                                                                             \n"\r
-                       "uniform int            alpha_mode;                                                                                                             \n"\r
-                       "uniform int            pixel_format;                                                                                                   \n"\r
-                       "                                                                                                                                                                       \n"\r
-                       "uniform bool           levels;                                                                                                                 \n"\r
-                       "uniform float          min_input;                                                                                                              \n"\r
-                       "uniform float          max_input;                                                                                                              \n"\r
-                       "uniform float          gamma;                                                                                                                  \n"\r
-                       "uniform float          min_output;                                                                                                             \n"\r
-                       "uniform float          max_output;                                                                                                             \n"\r
-                       "                                                                                                                                                                       \n"\r
-                       "uniform bool           csb;                                                                                                                    \n"\r
-                       "uniform float          brt;                                                                                                                    \n"\r
-                       "uniform float          sat;                                                                                                                    \n"\r
-                       "uniform float          con;                                                                                                                    \n"\r
-                       "                                                                                                                                                                       \n"\r
-\r
-                       +\r
-\r
-                       get_blend_glsl()\r
-                       \r
-                       +\r
-\r
-                       "vec3 get_blend_color(vec3 back, vec3 fore)                                                                                     \n"\r
-                       "{                                                                                                                                                                      \n"\r
-                       "       switch(blend_mode)                                                                                                                              \n"\r
-                       "       {                                                                                                                                                               \n"\r
-                       "       case  0: return BlendNormal(back, fore);                                                                                \n"\r
-                       "       case  1: return BlendLighten(back, fore);                                                                               \n"\r
-                       "       case  2: return BlendDarken(back, fore);                                                                                \n"\r
-                       "       case  3: return BlendMultiply(back, fore);                                                                              \n"\r
-                       "       case  4: return BlendAverage(back, fore);                                                                               \n"\r
-                       "       case  5: return BlendAdd(back, fore);                                                                                   \n"\r
-                       "       case  6: return BlendSubstract(back, fore);                                                                             \n"\r
-                       "       case  7: return BlendDifference(back, fore);                                                                    \n"\r
-                       "       case  8: return BlendNegation(back, fore);                                                                              \n"\r
-                       "       case  9: return BlendExclusion(back, fore);                                                                             \n"\r
-                       "       case 10: return BlendScreen(back, fore);                                                                                \n"\r
-                       "       case 11: return BlendOverlay(back, fore);                                                                               \n"\r
-                       //"     case 12: return BlendSoftLight(back, fore);                                                                             \n"\r
-                       "       case 13: return BlendHardLight(back, fore);                                                                             \n"\r
-                       "       case 14: return BlendColorDodge(back, fore);                                                                    \n"\r
-                       "       case 15: return BlendColorBurn(back, fore);                                                                             \n"\r
-                       "       case 16: return BlendLinearDodge(back, fore);                                                                   \n"\r
-                       "       case 17: return BlendLinearBurn(back, fore);                                                                    \n"\r
-                       "       case 18: return BlendLinearLight(back, fore);                                                                   \n"\r
-                       "       case 19: return BlendVividLight(back, fore);                                                                    \n"\r
-                       "       case 20: return BlendPinLight(back, fore);                                                                              \n"\r
-                       "       case 21: return BlendHardMix(back, fore);                                                                               \n"\r
-                       "       case 22: return BlendReflect(back, fore);                                                                               \n"\r
-                       "       case 23: return BlendGlow(back, fore);                                                                                  \n"\r
-                       "       case 24: return BlendPhoenix(back, fore);                                                                               \n"\r
-                       "       case 25: return BlendHue(back, fore);                                                                                   \n"\r
-                       "       case 26: return BlendSaturation(back, fore);                                                                    \n"\r
-                       "       case 27: return BlendColor(back, fore);                                                                                 \n"\r
-                       "       case 28: return BlendLuminosity(back, fore);                                                                    \n"\r
-                       "       }                                                                                                                                                               \n"\r
-                       "                                                                                                                                                                       \n"\r
-                       "       return BlendNormal(back, fore);                                                                                                 \n"\r
-                       "}                                                                                                                                                                      \n"\r
-                       "                                                                                                                                                                       \n"                                                                                                                                                       \r
-                       "vec4 blend_color(vec4 fore)                                                                                                            \n"\r
-                       "{                                                                                                                                                                      \n"\r
-                       "   vec4 back = texture2D(background, gl_TexCoord[1].st);                                                       \n"\r
-                       "   if(levels)                                                                                                                                          \n"\r
-                       "               fore.rgb = LevelsControl(fore.rgb, min_input, max_input, gamma, min_output, max_output); \n"\r
-                       "       if(csb)                                                                                                                                                 \n"\r
-                       "               fore.rgb = ContrastSaturationBrightness(fore.rgb, brt, sat, con);                       \n"\r
-                       "   fore.rgb = get_blend_color(back.bgr, fore.rgb);                                                                     \n"\r
-                       "                                                                                                                                                                       \n"\r
-                       "       return vec4(mix(back.rgb, fore.rgb, fore.a), back.a + fore.a);                                  \n"\r
-                       "}                                                                                                                                                                      \n"\r
-                       "                                                                                                                                                                       \n"\r
-                       "// NOTE: YCbCr, ITU-R, http://www.intersil.com/data/an/an9717.pdf                                      \n"\r
-                       "// TODO: Support for more yuv formats might be needed.                                                         \n"\r
-                       "vec4 ycbcra_to_rgba_sd(float y, float cb, float cr, float a)                                           \n"\r
-                       "{                                                                                                                                                                      \n"\r
-                       "       cb -= 0.5;                                                                                                                                              \n"\r
-                       "       cr -= 0.5;                                                                                                                                              \n"\r
-                       "       y = 1.164*(y-0.0625);                                                                                                                   \n"\r
-                       "                                                                                                                                                                       \n"\r
-                       "       vec4 color;                                                                                                                                             \n"\r
-                       "       color.r = y + 2.018 * cb;                                                                                                               \n"\r
-                       "       color.b = y + 1.596 * cr;                                                                                                               \n"\r
-                       "       color.g = y - 0.813 * cr - 0.391 * cb;                                                                                  \n"\r
-                       "       color.a = a;                                                                                                                                    \n"\r
-                       "                                                                                                                                                                       \n"\r
-                       "       return color;                                                                                                                                   \n"\r
-                       "}                                                                                                                                                                      \n"                     \r
-                       "                                                                                                                                                                       \n"\r
-                       "vec4 ycbcra_to_rgba_hd(float y, float cb, float cr, float a)                                           \n"\r
-                       "{                                                                                                                                                                      \n"\r
-                       "       cb -= 0.5;                                                                                                                                              \n"\r
-                       "       cr -= 0.5;                                                                                                                                              \n"\r
-                       "       y = 1.164*(y-0.0625);                                                                                                                   \n"\r
-                       "                                                                                                                                                                       \n"\r
-                       "       vec4 color;                                                                                                                                             \n"\r
-                       "       color.r = y + 2.115 * cb;                                                                                                               \n"\r
-                       "       color.b = y + 1.793 * cr;                                                                                                               \n"\r
-                       "       color.g = y - 0.534 * cr - 0.213 * cb;                                                                                  \n"\r
-                       "       color.a = a;                                                                                                                                    \n"\r
-                       "                                                                                                                                                                       \n"\r
-                       "       return color;                                                                                                                                   \n"\r
-                       "}                                                                                                                                                                      \n"                     \r
-                       "                                                                                                                                                                       \n"                     \r
-                       "vec4 ycbcra_to_rgba(float y, float cb, float cr, float a)                                                      \n"\r
-                       "{                                                                                                                                                                      \n"\r
-                       "       if(is_hd)                                                                                                                                               \n"\r
-                       "               return ycbcra_to_rgba_hd(y, cb, cr, a);                                                                         \n"\r
-                       "       else                                                                                                                                                    \n"\r
-                       "               return ycbcra_to_rgba_sd(y, cb, cr, a);                                                                         \n"\r
-                       "}                                                                                                                                                                      \n"\r
-                       "                                                                                                                                                                       \n"\r
-                       "vec4 get_rgba_color()                                                                                                                          \n"\r
-                       "{                                                                                                                                                                      \n"\r
-                       "       switch(pixel_format)                                                                                                                    \n"\r
-                       "       {                                                                                                                                                               \n"\r
-                       "       case 0:         //gray                                                                                                                          \n"\r
-                       "               return vec4(texture2D(plane[0], gl_TexCoord[0].st).rrr, 1.0);                           \n"\r
-                       "       case 1:         //bgra,                                                                                                                         \n"\r
-                       "               return texture2D(plane[0], gl_TexCoord[0].st).bgra;                                                     \n"\r
-                       "       case 2:         //rgba,                                                                                                                         \n"\r
-                       "               return texture2D(plane[0], gl_TexCoord[0].st).rgba;                                                     \n"\r
-                       "       case 3:         //argb,                                                                                                                         \n"\r
-                       "               return texture2D(plane[0], gl_TexCoord[0].st).argb;                                                     \n"\r
-                       "       case 4:         //abgr,                                                                                                                         \n"\r
-                       "               return texture2D(plane[0], gl_TexCoord[0].st).gbar;                                                     \n"\r
-                       "       case 5:         //ycbcr,                                                                                                                        \n"\r
-                       "               {                                                                                                                                                       \n"\r
-                       "                       float y  = texture2D(plane[0], gl_TexCoord[0].st).r;                                    \n"\r
-                       "                       float cb = texture2D(plane[1], gl_TexCoord[0].st).r;                                    \n"\r
-                       "                       float cr = texture2D(plane[2], gl_TexCoord[0].st).r;                                    \n"\r
-                       "                       return ycbcra_to_rgba(y, cb, cr, 1.0);                                                                  \n"\r
-                       "               }                                                                                                                                                       \n"\r
-                       "       case 6:         //ycbcra                                                                                                                        \n"\r
-                       "               {                                                                                                                                                       \n"\r
-                       "                       float y  = texture2D(plane[0], gl_TexCoord[0].st).r;                                    \n"\r
-                       "                       float cb = texture2D(plane[1], gl_TexCoord[0].st).r;                                    \n"\r
-                       "                       float cr = texture2D(plane[2], gl_TexCoord[0].st).r;                                    \n"\r
-                       "                       float a  = texture2D(plane[3], gl_TexCoord[0].st).r;                                    \n"\r
-                       "                       return ycbcra_to_rgba(y, cb, cr, a);                                                                    \n"\r
-                       "               }                                                                                                                                                       \n"\r
-                       "       }                                                                                                                                                               \n"\r
-                       "       return vec4(0.0, 0.0, 0.0, 0.0);                                                                                                \n"\r
-                       "}                                                                                                                                                                      \n"\r
-                       "                                                                                                                                                                       \n"\r
-                       "void main()                                                                                                                                            \n"\r
-                       "{                                                                                                                                                                      \n"\r
-                       "       vec4 color = get_rgba_color();                                                                                                  \n"\r
-                       "       if(has_local_key)                                                                                                                               \n"\r
-                       "               color.a *= texture2D(local_key, gl_TexCoord[1].st).r;                                           \n"\r
-                       "       if(has_layer_key)                                                                                                                               \n"\r
-                       "               color.a *= texture2D(layer_key, gl_TexCoord[1].st).r;                                           \n"\r
-                       "       gl_FragColor = blend_color(color.bgra * gl_Color);                                                              \n"\r
-                       "}                                                                                                                                                                      \n";\r
+       {                       \r
        }\r
 \r
        \r
@@ -262,7 +289,17 @@ struct image_kernel::implementation : boost::noncopyable
 \r
                if(!shader_)\r
                {\r
-                       shader_.reset(new shader(vertex_, fragment_));\r
+                       try\r
+                       {\r
+                               shader_.reset(new shader(get_vertex(), get_fragment(false)));\r
+                       }\r
+                       catch(...)\r
+                       {\r
+                               CASPAR_LOG_CURRENT_EXCEPTION();\r
+                               CASPAR_LOG(warning) << "Failed to compile shader. Trying to compile without blend-modes.";\r
+                               shader_.reset(new shader(get_vertex(), get_fragment(true)));\r
+                       }\r
+\r
                        GL(glEnable(GL_TEXTURE_2D));\r
                }\r
 \r