1 #include "../../StdAfx.h"
\r
5 #include "ogl_device.h"
\r
7 #include <common/gl/gl_check.h>
\r
11 namespace caspar { namespace core {
\r
13 struct fence::implementation
\r
17 implementation() : sync_(0){}
\r
18 ~implementation(){glDeleteSync(sync_);}
\r
22 glDeleteSync(sync_);
\r
23 sync_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
\r
34 GL(glGetSynciv(sync_, GL_SYNC_STATUS, 1, &length, values));
\r
36 return values[0] == GL_SIGNALED;
\r
39 void wait(ogl_device& ogl)
\r
42 if(!ogl.invoke([this]{return ready();}, high_priority))
\r
44 while(!ogl.invoke([this]{return ready();}, normal_priority) && delay < 20)
\r
52 CASPAR_LOG(debug) << L"[fence] Performance warning. GPU was not ready during requested host read-back. Delayed by atleast: " << delay << L" ms.";
\r
58 static bool log_flag = false;
\r
61 impl_.reset(new implementation());
\r
64 CASPAR_LOG(warning) << "[fence] GL_SYNC not supported, running without fences. This might cause performance degradation when running multiple channels and short buffer depth.";
\r
75 bool fence::ready() const
\r
77 return impl_ ? impl_->ready() : true;
\r
80 void fence::wait(ogl_device& ogl)
\r