// // Copyright 2015 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // SyncGL.cpp: Implements the class methods for SyncGL. #include "libANGLE/renderer/gl/SyncGL.h" #include "common/debug.h" #include "libANGLE/Context.h" #include "libANGLE/renderer/gl/ContextGL.h" #include "libANGLE/renderer/gl/FunctionsGL.h" namespace rx { SyncGL::SyncGL(const FunctionsGL *functions) : SyncImpl(), mFunctions(functions), mSyncObject(0) { ASSERT(mFunctions); } SyncGL::~SyncGL() { ASSERT(mSyncObject == 0); } void SyncGL::onDestroy(const gl::Context *context) { ASSERT(mSyncObject != 0); mFunctions->deleteSync(mSyncObject); mSyncObject = 0; } angle::Result SyncGL::set(const gl::Context *context, GLenum condition, GLbitfield flags) { ASSERT(condition == GL_SYNC_GPU_COMMANDS_COMPLETE && flags == 0); ContextGL *contextGL = GetImplAs(context); mSyncObject = mFunctions->fenceSync(condition, flags); ANGLE_CHECK(contextGL, mSyncObject != 0, "glFenceSync failed to create a GLsync object.", GL_OUT_OF_MEMORY); contextGL->markWorkSubmitted(); return angle::Result::Continue; } angle::Result SyncGL::clientWait(const gl::Context *context, GLbitfield flags, GLuint64 timeout, GLenum *outResult) { ASSERT(mSyncObject != 0); *outResult = mFunctions->clientWaitSync(mSyncObject, flags, timeout); return angle::Result::Continue; } angle::Result SyncGL::serverWait(const gl::Context *context, GLbitfield flags, GLuint64 timeout) { ASSERT(mSyncObject != 0); mFunctions->waitSync(mSyncObject, flags, timeout); return angle::Result::Continue; } angle::Result SyncGL::getStatus(const gl::Context *context, GLint *outResult) { ASSERT(mSyncObject != 0); mFunctions->getSynciv(mSyncObject, GL_SYNC_STATUS, 1, nullptr, outResult); return angle::Result::Continue; } } // namespace rx