]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 6 Aug 2011 23:21:38 +0000 (23:21 +0000)
committerRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 6 Aug 2011 23:21:38 +0000 (23:21 +0000)
core/core.vcxproj
core/core.vcxproj.filters
core/mixer/gpu/device_buffer.cpp
core/mixer/gpu/fence.cpp [new file with mode: 0644]
core/mixer/gpu/fence.h [new file with mode: 0644]
core/mixer/gpu/host_buffer.cpp
core/mixer/gpu/host_buffer.h
core/mixer/read_frame.cpp
core/video_channel.cpp
modules/ffmpeg/producer/filter/filter.cpp

index 2480eff5d1dc6bd79a54b5b9cc1fba0635c3d194..7ea2c9a272d38c9e54327df9bd67dd06ef28a6a0 100644 (file)
     <Lib />\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
+    <ClInclude Include="mixer\gpu\fence.h" />\r
     <ClInclude Include="mixer\gpu\shader.h" />\r
     <ClInclude Include="mixer\image\blending_glsl.h" />\r
     <ClInclude Include="video_channel.h" />\r
     <ClInclude Include="StdAfx.h" />\r
   </ItemGroup>\r
   <ItemGroup>\r
+    <ClCompile Include="mixer\gpu\fence.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Develop|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
     <ClCompile Include="mixer\gpu\shader.cpp">\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
index ee585c6ad390b7dfb8b86ffc7c7e505e03d5f5a9..e4ddfd6fffa4e78d1a86c34c8338073c272f97f3 100644 (file)
     <ClInclude Include="mixer\gpu\shader.h">\r
       <Filter>source\mixer\gpu</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="mixer\gpu\fence.h">\r
+      <Filter>source\mixer\gpu</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClCompile Include="producer\transition\transition_producer.cpp">\r
     <ClCompile Include="mixer\gpu\shader.cpp">\r
       <Filter>source\mixer\gpu</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="mixer\gpu\fence.cpp">\r
+      <Filter>source\mixer\gpu</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
 </Project>
\ No newline at end of file
index 891fd6faa17fd5d87aa83e7f38307510abf4bd55..66a417011ab8681b6cb0627f8340b7bc6f9aa95c 100644 (file)
@@ -22,6 +22,7 @@
 #include "device_buffer.h"\r
 \r
 #include "host_buffer.h"\r
+#include "fence.h"\r
 \r
 #include <common/gl/gl_check.h>\r
 \r
@@ -103,8 +104,7 @@ public:
                GL(glReadPixels(0, 0, width_, height_, FORMAT[stride_], GL_UNSIGNED_BYTE, NULL));\r
                target.unbind();\r
                GL(glBindTexture(GL_TEXTURE_2D, 0));\r
-               target.fence_set();\r
-               glFlush();\r
+               target.fence();\r
        }\r
 \r
        void attach(int index)\r
diff --git a/core/mixer/gpu/fence.cpp b/core/mixer/gpu/fence.cpp
new file mode 100644 (file)
index 0000000..fca4a60
--- /dev/null
@@ -0,0 +1,49 @@
+#include "../../StdAfx.h"\r
+\r
+#include "fence.h"\r
+\r
+#include "ogl_device.h"\r
+\r
+#include <common/gl/gl_check.h>\r
+\r
+namespace caspar { namespace core {\r
+       \r
+fence::fence() : id_(0){}\r
+\r
+fence::~fence()\r
+{\r
+       if(id_)\r
+               glDeleteFencesNV(1, &id_);\r
+}\r
+\r
+void fence::set()\r
+{\r
+       if(id_)\r
+               glDeleteFencesNV(1, &id_);\r
+                       \r
+       GL(glGenFencesNV(1, &id_));\r
+       GL(glSetFenceNV(id_, GL_ALL_COMPLETED_NV));\r
+}\r
+\r
+bool fence::ready() const\r
+{\r
+       return id_ ? GL2(glTestFenceNV(id_)) != GL_FALSE : true;\r
+}\r
+\r
+void fence::wait(ogl_device& ogl)\r
+{      \r
+       int delay = 0;\r
+       if(!ogl.invoke([this]{return ready();}, high_priority))\r
+       {\r
+               while(!ogl.invoke([this]{return ready();}, normal_priority))\r
+               {\r
+                       delay += 3;\r
+                       Sleep(3);\r
+               }\r
+       }\r
+\r
+       if(delay > 0)\r
+               CASPAR_LOG(warning) << L"[ogl_device] Performance warning. GPU was not ready during requested host read-back. Delayed by atleast: " << delay << L" ms.";\r
+}\r
+\r
+}}
\ No newline at end of file
diff --git a/core/mixer/gpu/fence.h b/core/mixer/gpu/fence.h
new file mode 100644 (file)
index 0000000..9111591
--- /dev/null
@@ -0,0 +1,18 @@
+#pragma once\r
+\r
+namespace caspar { namespace core {\r
+       \r
+class ogl_device;\r
+\r
+class fence\r
+{\r
+       unsigned int id_;\r
+public:\r
+       fence();\r
+       ~fence();\r
+       void set();\r
+       bool ready() const;\r
+       void wait(ogl_device& ogl);\r
+};\r
+\r
+}}\r
index 943014bc6a675decb7d3868da0b4cbecf456043e..125956ef554266ca6d562dbe62fb97ba7945a683 100644 (file)
 */\r
 #include "../../stdafx.h"\r
 \r
-#include "../gpu/host_buffer.h"\r
+#include "host_buffer.h"\r
+\r
+#include "fence.h"\r
+#include "ogl_device.h"\r
 \r
 #include <common/gl/gl_check.h>\r
 \r
@@ -27,14 +30,12 @@ namespace caspar { namespace core {
                                                                                                                                                                                                                                                                                                                                \r
 struct host_buffer::implementation : boost::noncopyable\r
 {      \r
-       GLuint pbo_;\r
-       GLuint fence_;\r
-\r
-       const size_t size_;\r
-\r
-       void* data_;\r
-       GLenum usage_;\r
-       GLenum target_;\r
+       GLuint                  pbo_;\r
+       const size_t    size_;\r
+       void*                   data_;\r
+       GLenum                  usage_;\r
+       GLenum                  target_;\r
+       core::fence             fence_;\r
 \r
 public:\r
        implementation(size_t size, usage_t usage) \r
@@ -43,7 +44,6 @@ public:
                , pbo_(0)\r
                , target_(usage == write_only ? GL_PIXEL_UNPACK_BUFFER : GL_PIXEL_PACK_BUFFER)\r
                , usage_(usage == write_only ? GL_STREAM_DRAW : GL_STREAM_READ)\r
-               , fence_(0)\r
        {\r
                GL(glGenBuffers(1, &pbo_));\r
                GL(glBindBuffer(target_, pbo_));\r
@@ -61,9 +61,6 @@ public:
        {\r
                try\r
                {\r
-                       if(fence_)\r
-                               glDeleteFencesNV(1, &fence_);\r
-\r
                        GL(glDeleteBuffers(1, &pbo_));\r
                }\r
                catch(...)\r
@@ -87,6 +84,12 @@ public:
                        BOOST_THROW_EXCEPTION(invalid_operation() << msg_info("Failed to map target_ OpenGL Pixel Buffer Object."));\r
        }\r
 \r
+       void map2(ogl_device& ogl)\r
+       {\r
+               fence_.wait(ogl);\r
+               ogl.invoke(std::bind(&implementation::map, this), high_priority);\r
+       }\r
+\r
        void unmap()\r
        {\r
                if(!data_)\r
@@ -107,19 +110,11 @@ public:
        {\r
                GL(glBindBuffer(target_, 0));\r
        }\r
-       \r
-       void fence_set()\r
-       {\r
-               if(fence_)\r
-                       glDeleteFencesNV(1, &fence_);\r
-                       \r
-               GL(glGenFencesNV(1, &fence_));\r
-               GL(glSetFenceNV(fence_, GL_ALL_COMPLETED_NV));\r
-       }\r
 \r
-       bool fence_rdy() const\r
+       void fence()\r
        {\r
-               return GL2(glTestFenceNV(fence_)) != GL_FALSE;\r
+               fence_.set();\r
+               GL(glFlush());\r
        }\r
 };\r
 \r
@@ -127,12 +122,11 @@ host_buffer::host_buffer(size_t size, usage_t usage) : impl_(new implementation(
 const void* host_buffer::data() const {return impl_->data_;}\r
 void* host_buffer::data() {return impl_->data_;}\r
 void host_buffer::map(){impl_->map();}\r
+void host_buffer::map(ogl_device& ogl){impl_->map2(ogl);}\r
 void host_buffer::unmap(){impl_->unmap();}\r
 void host_buffer::bind(){impl_->bind();}\r
 void host_buffer::unbind(){impl_->unbind();}\r
-void host_buffer::fence_set(){impl_->fence_set();}\r
-bool host_buffer::fence_rdy() const{return impl_->fence_rdy();}\r
-\r
+void host_buffer::fence(){impl_->fence();}\r
 size_t host_buffer::size() const { return impl_->size_; }\r
 \r
 }}
\ No newline at end of file
index 2e1484545e6bd13fe005b73a4fda71794dd0cc62..3d9e48c8ded61730191acd6a572f6215703e35e1 100644 (file)
@@ -24,6 +24,8 @@
 #include <common/memory/safe_ptr.h>\r
 \r
 namespace caspar { namespace core {\r
+\r
+class ogl_device;\r
                \r
 class host_buffer : boost::noncopyable\r
 {\r
@@ -42,10 +44,10 @@ public:
        void unbind();\r
 \r
        void map();\r
+       void map(ogl_device& ogl);\r
        void unmap();\r
 \r
-       void fence_set();\r
-       bool fence_rdy() const;\r
+       void fence();\r
 private:\r
        friend class ogl_device;\r
        host_buffer(size_t size, usage_t usage);\r
index e096c9e76351722ddc35ca2211c1b179b657508f..be4aaf169b722d7058ac37dd0b5e2c6d73e4bf89 100644 (file)
@@ -21,6 +21,7 @@
 \r
 #include "read_frame.h"\r
 \r
+#include "gpu/fence.h"\r
 #include "gpu/host_buffer.h"   \r
 #include "gpu/ogl_device.h"\r
 \r
@@ -41,27 +42,7 @@ public:
        const boost::iterator_range<const uint8_t*> image_data()\r
        {\r
                if(!image_data_->data())\r
-               {\r
-                       auto fence_check = [=]{return image_data_->fence_rdy();};\r
-\r
-                       int delay = 0;\r
-                       if(!ogl_.invoke(fence_check, high_priority))\r
-                       {\r
-                               while(!ogl_.invoke(fence_check, normal_priority))\r
-                               {\r
-                                       delay += 3;\r
-                                       Sleep(3);\r
-                               }\r
-                       }\r
-\r
-                       if(delay > 0)\r
-                               CASPAR_LOG(warning) << L" Performance warning. GPU was not ready during requested host read-back. Delayed by atleast: " << delay << L" ms.";\r
-\r
-                       ogl_.invoke([=]\r
-                       {\r
-                               image_data_->map();\r
-                       }, high_priority);\r
-               }\r
+                       image_data_->map(ogl_);\r
 \r
                auto ptr = static_cast<const uint8_t*>(image_data_->data());\r
                return boost::iterator_range<const uint8_t*>(ptr, ptr + image_data_->size());\r
index d9df666ff94d9f598c64d06a02b4f7157f72e544..25c43131a32454c6f42dee70c5e7306086d8d023 100644 (file)
@@ -52,6 +52,7 @@ struct video_channel::implementation : boost::noncopyable
        safe_ptr<diagnostics::graph>    diag_;\r
        boost::timer                                    frame_timer_;\r
        boost::timer                                    tick_timer_;\r
+       boost::timer                                    output_timer_;\r
        \r
 public:\r
        implementation(int index, const video_format_desc& format_desc, ogl_device& ogl)  \r
@@ -63,8 +64,8 @@ public:
        {\r
                diag_->add_guide("produce-time", 0.5f); \r
                diag_->set_color("produce-time", diagnostics::color(1.0f, 0.0f, 0.0f));\r
-               diag_->add_guide("mix-time", 0.5f);     \r
                diag_->set_color("mix-time", diagnostics::color(1.0f, 0.0f, 1.0f));\r
+               diag_->set_color("output-time", diagnostics::color(1.0f, 1.0f, 0.0f));\r
                diag_->set_color("tick-time", diagnostics::color(0.1f, 0.7f, 0.8f));    \r
 \r
                CASPAR_LOG(info) << print() << " Successfully Initialized.";\r
@@ -99,9 +100,14 @@ public:
                diag_->update_value("mix-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5);\r
                \r
                // Consume\r
+               \r
+               output_timer_.restart();\r
 \r
                output_->execute(finished_frame);\r
                \r
+               diag_->update_value("output-time", frame_timer_.elapsed()*context_.get_format_desc().fps*0.5);\r
+\r
+               \r
                diag_->update_value("tick-time", tick_timer_.elapsed()*context_.get_format_desc().fps*0.5);\r
                tick_timer_.restart();\r
 \r
index f890f4c15240a8c480d89a38fe6a102459beaeee..4db46b9503f6ccd13069ac33805c17fb997ab895 100644 (file)
@@ -91,7 +91,7 @@ struct filter::implementation
                        \r
                        AVFilterInOut* outputs = avfilter_inout_alloc();\r
                        AVFilterInOut* inputs  = avfilter_inout_alloc();\r
-\r
+                       \r
                        outputs->name                   = av_strdup("in");\r
                        outputs->filter_ctx             = buffersrc_ctx_;\r
                        outputs->pad_idx                = 0;\r
@@ -102,14 +102,12 @@ struct filter::implementation
                        inputs->pad_idx                 = 0;\r
                        inputs->next                    = NULL;\r
                        \r
-                       int ret = avfilter_graph_parse(graph_.get(), filters_.c_str(), &inputs, &outputs, NULL);\r
-\r
+                       THROW_ON_ERROR2(avfilter_graph_parse(graph_.get(), filters_.c_str(), &inputs, &outputs, NULL), "[filter]");\r
+                       \r
                        avfilter_inout_free(&inputs);\r
                        avfilter_inout_free(&outputs);\r
-                       \r
-                       THROW_ON_ERROR(ret, "[filter]", "avfilter_graph_parse");\r
-                                               \r
-                       THROW_ON_ERROR2(avfilter_graph_config(graph_.get(), NULL), "[filter]");\r
+\r
+                       THROW_ON_ERROR2(avfilter_graph_config(graph_.get(), NULL), "[filter]");                 \r
 \r
                        for(size_t n = 0; n < graph_->filter_count; ++n)\r
                        {\r