]> git.sesse.net Git - casparcg/commitdiff
Changed vblank waiting to use higher precision timing facilities in screen consumer
authorhellgore <hellgore@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 20 Aug 2012 08:31:23 +0000 (08:31 +0000)
committerhellgore <hellgore@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 20 Aug 2012 08:31:23 +0000 (08:31 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/trunk@3210 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/ogl/consumer/ogl_consumer.cpp

index 8acc4d6bca4b85230f4abdd0e9ef31857cd008a9..cbf666939d9a0d66b34dc4fc2ca5eeed2cec5674 100644 (file)
@@ -134,7 +134,6 @@ struct ogl_consumer : boost::noncopyable
        safe_ptr<diagnostics::graph>    graph_;\r
        boost::timer                                    perf_timer_;\r
        boost::timer                                    tick_timer_;\r
-       boost::timer                                    vblank_timer_;\r
 \r
        caspar::high_prec_timer wait_timer_;\r
 \r
@@ -174,6 +173,7 @@ public:
                graph_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f));   \r
                graph_->set_color("frame-time", diagnostics::color(0.1f, 1.0f, 0.1f));\r
                graph_->set_color("dropped-frame", diagnostics::color(0.3f, 0.6f, 0.3f));\r
+\r
                graph_->set_text(print());\r
                diagnostics::register_graph(graph_);\r
                                                                        \r
@@ -313,16 +313,20 @@ public:
 \r
        void try_sleep_almost_until_vblank()\r
        {\r
-               static const double THRESHOLD = 0.005;\r
+               static const double THRESHOLD = 0.003;\r
                double threshold = config_.vsync ? THRESHOLD : 0.0;\r
 \r
-               auto elapsed = vblank_timer_.elapsed();\r
                auto frame_time = 1.0 / (format_desc_.fps * format_desc_.field_count);\r
 \r
-               if (elapsed + threshold < frame_time)\r
-               {\r
-                       wait_timer_.tick(frame_time - elapsed - threshold);\r
-               }\r
+               wait_timer_.tick(frame_time - threshold);\r
+       }\r
+\r
+       void wait_for_vblank_and_display()\r
+       {\r
+               try_sleep_almost_until_vblank();\r
+               window_.Display();\r
+               // Make sure that the next tick measures the duration from this point in time.\r
+               wait_timer_.tick(0.0);\r
        }\r
        \r
        safe_ptr<AVFrame> get_av_frame()\r
@@ -360,27 +364,21 @@ public:
                        render(frames[0], frame->image_data().size());\r
                        graph_->set_value("frame-time", perf_timer_.elapsed() * format_desc_.fps * 0.5);\r
 \r
-                       try_sleep_almost_until_vblank();\r
-                       window_.Display();\r
-                       vblank_timer_.restart();\r
+                       wait_for_vblank_and_display(); // progressive frame\r
                }\r
                else if (frames.size() == 2)\r
                {\r
                        render(frames[0], frame->image_data().size());\r
                        double perf_elapsed = perf_timer_.elapsed();\r
 \r
-                       try_sleep_almost_until_vblank();\r
-                       window_.Display();\r
-                       vblank_timer_.restart();\r
+                       wait_for_vblank_and_display(); // field1\r
 \r
                        perf_timer_.restart();\r
                        render(frames[1], frame->image_data().size());\r
                        perf_elapsed += perf_timer_.elapsed();\r
                        graph_->set_value("frame-time", perf_elapsed * format_desc_.fps * 0.5);\r
 \r
-                       try_sleep_almost_until_vblank();\r
-                       window_.Display();\r
-                       vblank_timer_.restart();\r
+                       wait_for_vblank_and_display(); // field2\r
                }\r
        }\r
 \r