]> git.sesse.net Git - casparcg/commitdiff
Huge performance impact detected with chroma key support (even though not in use...
authorHelge Norberg <helge.norberg@gmail.com>
Mon, 16 Sep 2013 15:32:16 +0000 (17:32 +0200)
committerHelge Norberg <helge.norberg@gmail.com>
Mon, 16 Sep 2013 15:32:16 +0000 (17:32 +0200)
New <mixer /> element added to configuration for turning on mixer features that not everybody would want to pay for (performance-wise). blend-modes also moved into this element:

<mixer>
    <blend-modes>   false [true|false]</blend-modes>
    <straight-alpha>false [true|false]</straight-alpha>
    <chroma-key>    false [true|false]</chroma-key>
</mixer>

core/mixer/image/image_kernel.cpp
core/mixer/image/shader/image_shader.cpp
core/mixer/image/shader/image_shader.h
shell/casparcg.config

index 7b36a6f8ed1901ad260d30b47edb4fb795356f37..dc8d933b8162c967ee3740e0b026dd0b80bdb325 100644 (file)
@@ -59,11 +59,12 @@ struct image_kernel::implementation : boost::noncopyable
        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
@@ -259,7 +260,9 @@ struct image_kernel::implementation : boost::noncopyable
                        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
index 719b5d16ceec7df8cc6ea9838dc81ed7efc35799..ed24cae6bd7ef0a865195a1ef99bb9a0ba072084 100644 (file)
@@ -38,6 +38,7 @@ namespace caspar { namespace core {
 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
@@ -145,7 +146,7 @@ std::string get_chroma_func()
                "}                                                                      \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
@@ -272,14 +273,19 @@ std::string get_fragment(bool blend_modes)
        "                                                                                                                                                                       \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
@@ -296,20 +302,27 @@ std::string get_fragment(bool blend_modes)
        "}                                                                                                                                                                      \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
@@ -317,7 +330,7 @@ safe_ptr<shader> get_image_shader(ogl_device& ogl, bool& blend_modes)
                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
@@ -330,6 +343,8 @@ safe_ptr<shader> get_image_shader(ogl_device& ogl, bool& blend_modes)
        }\r
 \r
        blend_modes = g_blend_modes;\r
+       post_processing = g_post_processing;\r
+\r
        return make_safe_ptr(g_shader);\r
 }\r
 \r
index 8ece6bdabfefd86017efb00274bf86b013c6b9e9..d82b062ebe66f1aea26e64d197fe894fbc663e34 100644 (file)
@@ -44,7 +44,8 @@ struct texture_id
        };\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
 \r
 }}
\ No newline at end of file
index 6b6db1f837c329dc8b900d03a686a97747c95cd3..5300a2da7b1efac20c996fc9415d729dca87b45f 100644 (file)
 <!--\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