safe_ptr<ogl_device> ogl_;\r
safe_ptr<shader> shader_;\r
bool blend_modes_;\r
+ bool post_processing_;\r
bool supports_texture_barrier_;\r
\r
implementation(const safe_ptr<ogl_device>& ogl)\r
: ogl_(ogl)\r
- , shader_(ogl_->invoke([&]{return get_image_shader(*ogl, blend_modes_);}))\r
+ , shader_(ogl_->invoke([&]{return get_image_shader(*ogl, blend_modes_, post_processing_);}))\r
, supports_texture_barrier_(glTextureBarrierNV != 0)\r
{\r
if (!supports_texture_barrier_)\r
const safe_ptr<device_buffer>& background, bool straighten_alpha)\r
{\r
bool should_post_process = \r
- supports_texture_barrier_ && straighten_alpha;\r
+ supports_texture_barrier_\r
+ && straighten_alpha\r
+ && post_processing_;\r
\r
if (!should_post_process)\r
return;\r
std::shared_ptr<shader> g_shader;\r
tbb::mutex g_shader_mutex;\r
bool g_blend_modes = false;\r
+bool g_post_processing = false;\r
\r
std::string get_blend_color_func()\r
{\r
"} \n";\r
}\r
\r
-std::string get_fragment(bool blend_modes)\r
+std::string get_fragment(bool blend_modes, bool chroma_key, bool post_processing)\r
{\r
return\r
\r
" \n"\r
"void main() \n"\r
"{ \n"\r
+ +\r
+ (post_processing ? \r
" if (post_processing) \n"\r
" { \n"\r
" gl_FragColor = post_process().bgra; \n"\r
" } \n"\r
- " else \n"\r
+ " else \n" : "")\r
+ +\r
" { \n"\r
" vec4 color = get_rgba_color(); \n"\r
- " color = chroma_key(color); \n"\r
+ +\r
+ (chroma_key ? " color = chroma_key(color);\n" : "")\r
+ +\r
" if(levels) \n"\r
" color.rgb = LevelsControl( \n"\r
" color.rgb, min_input, max_input, gamma, min_output, max_output);\n"\r
"} \n";\r
}\r
\r
-safe_ptr<shader> get_image_shader(ogl_device& ogl, bool& blend_modes)\r
+safe_ptr<shader> get_image_shader(\r
+ ogl_device& ogl, bool& blend_modes, bool& post_processing)\r
{\r
tbb::mutex::scoped_lock lock(g_shader_mutex);\r
\r
if(g_shader)\r
{\r
blend_modes = g_blend_modes;\r
+ post_processing = g_post_processing;\r
+\r
return make_safe_ptr(g_shader);\r
}\r
\r
+ bool chroma_key = env::properties().get(L"configuration.mixer.chroma-key", false);\r
+ bool straight_alpha = env::properties().get(L"configuration.mixer.straight-alpha", false);\r
+ g_post_processing = straight_alpha;\r
+\r
try\r
{ \r
- g_blend_modes = glTextureBarrierNV ? env::properties().get(L"configuration.blend-modes", false) : false;\r
- g_shader.reset(new shader(get_vertex(), get_fragment(g_blend_modes)));\r
+ g_blend_modes = glTextureBarrierNV ? env::properties().get(L"configuration.mixer.blend-modes", false) : false;\r
+ g_shader.reset(new shader(get_vertex(), get_fragment(g_blend_modes, chroma_key, g_post_processing)));\r
}\r
catch(...)\r
{\r
CASPAR_LOG(warning) << "Failed to compile shader. Trying to compile without blend-modes.";\r
\r
g_blend_modes = false;\r
- g_shader.reset(new shader(get_vertex(), get_fragment(g_blend_modes)));\r
+ g_shader.reset(new shader(get_vertex(), get_fragment(g_blend_modes, chroma_key, g_post_processing)));\r
}\r
\r
ogl.enable(GL_TEXTURE_2D);\r
}\r
\r
blend_modes = g_blend_modes;\r
+ post_processing = g_post_processing;\r
+\r
return make_safe_ptr(g_shader);\r
}\r
\r
<!--\r
<log-level> trace [trace|debug|info|warning|error]</log-level>\r
<channel-grid> false [true|false]</channel-grid>\r
-<blend-modes> false [true|false]</blend-modes>\r
+<mixer>\r
+ <blend-modes> false [true|false]</blend-modes>\r
+ <straight-alpha>false [true|false]</straight-alpha>\r
+ <chroma-key> false [true|false]</chroma-key>\r
+</mixer>\r
<auto-deinterlace>true [true|false]</auto-deinterlace>\r
<auto-transcode> true [true|false]</auto-transcode>\r
<pipeline-tokens> 2 [1..] </pipeline-tokens>\r