1 #include "../../StdAfx.h"
\r
5 #include "ogl_device.h"
\r
7 #include <common/gl/gl_check.h>
\r
9 namespace caspar { namespace core {
\r
11 struct fence::implementation
\r
15 implementation() : sync_(0){}
\r
16 ~implementation(){glDeleteSync(sync_);}
\r
20 glDeleteSync(sync_);
\r
21 sync_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
\r
32 GL(glGetSynciv(sync_, GL_SYNC_STATUS, 1, &length, values));
\r
34 return values[0] == GL_SIGNALED;
\r
37 void wait(ogl_device& ogl)
\r
40 if(!ogl.invoke([this]{return ready();}, high_priority))
\r
42 while(!ogl.invoke([this]{return ready();}, normal_priority))
\r
50 CASPAR_LOG(warning) << L"[fence] Performance warning. GPU was not ready during requested host read-back. Delayed by atleast: " << delay << L" ms.";
\r
57 impl_.reset(new implementation());
\r
59 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
69 bool fence::ready() const
\r
71 return impl_ ? impl_->ready() : true;
\r
74 void fence::wait(ogl_device& ogl)
\r