class SkGpuFenceSync {
public:
virtual SkPlatformGpuFence SK_WARN_UNUSED_RESULT insertFence() const = 0;
- virtual bool flushAndWaitFence(SkPlatformGpuFence) const = 0;
+ virtual bool waitFence(SkPlatformGpuFence, bool flush) const = 0;
virtual void deleteFence(SkPlatformGpuFence) const = 0;
virtual ~SkGpuFenceSync() {}
static GLFenceSync* CreateIfSupported(const SkGLContext*);
SkPlatformGpuFence SK_WARN_UNUSED_RESULT insertFence() const override;
- bool flushAndWaitFence(SkPlatformGpuFence fence) const override;
+ bool waitFence(SkPlatformGpuFence fence, bool flush) const override;
void deleteFence(SkPlatformGpuFence fence) const override;
private:
}
if (fFrameFences[fCurrentFenceIdx]) {
- if (!fFenceSync->flushAndWaitFence(fFrameFences[fCurrentFenceIdx])) {
+ if (!fFenceSync->waitFence(fFrameFences[fCurrentFenceIdx], true)) {
SkDebugf("WARNING: Wait failed for fence sync. Timings might not be accurate.\n");
}
fFenceSync->deleteFence(fFrameFences[fCurrentFenceIdx]);
return fGLFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
}
-bool SkGLContext::GLFenceSync::flushAndWaitFence(SkPlatformGpuFence fence) const {
+bool SkGLContext::GLFenceSync::waitFence(SkPlatformGpuFence fence, bool flush) const {
GLsync glsync = static_cast<GLsync>(fence);
- return GL_WAIT_FAILED != fGLClientWaitSync(glsync, GL_SYNC_FLUSH_COMMANDS_BIT, -1);
+ return GL_WAIT_FAILED != fGLClientWaitSync(glsync, flush ? GL_SYNC_FLUSH_COMMANDS_BIT : 0, -1);
}
void SkGLContext::GLFenceSync::deleteFence(SkPlatformGpuFence fence) const {
static SkEGLFenceSync* CreateIfSupported(EGLDisplay);
SkPlatformGpuFence SK_WARN_UNUSED_RESULT insertFence() const override;
- bool flushAndWaitFence(SkPlatformGpuFence fence) const override;
+ bool waitFence(SkPlatformGpuFence fence, bool flush) const override;
void deleteFence(SkPlatformGpuFence fence) const override;
private:
return eglCreateSyncKHR(fDisplay, EGL_SYNC_FENCE_KHR, nullptr);
}
-bool SkEGLFenceSync::flushAndWaitFence(SkPlatformGpuFence platformFence) const {
+bool SkEGLFenceSync::waitFence(SkPlatformGpuFence platformFence, bool flush) const {
EGLSyncKHR eglsync = static_cast<EGLSyncKHR>(platformFence);
- return EGL_CONDITION_SATISFIED_KHR == eglClientWaitSyncKHR(fDisplay,
- eglsync,
- EGL_SYNC_FLUSH_COMMANDS_BIT_KHR,
- EGL_FOREVER_KHR);
+ return EGL_CONDITION_SATISFIED_KHR ==
+ eglClientWaitSyncKHR(fDisplay,
+ eglsync,
+ flush ? EGL_SYNC_FLUSH_COMMANDS_BIT_KHR : 0,
+ EGL_FOREVER_KHR);
}
void SkEGLFenceSync::deleteFence(SkPlatformGpuFence platformFence) const {