1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker // SyncGL.cpp: Implements the class methods for SyncGL.
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/SyncGL.h"
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/ContextGL.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/FunctionsGL.h"
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker namespace rx
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker
SyncGL(const FunctionsGL * functions)19*8975f5c5SAndroid Build Coastguard Worker SyncGL::SyncGL(const FunctionsGL *functions) : SyncImpl(), mFunctions(functions), mSyncObject(0)
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker ASSERT(mFunctions);
22*8975f5c5SAndroid Build Coastguard Worker }
23*8975f5c5SAndroid Build Coastguard Worker
~SyncGL()24*8975f5c5SAndroid Build Coastguard Worker SyncGL::~SyncGL()
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker ASSERT(mSyncObject == 0);
27*8975f5c5SAndroid Build Coastguard Worker }
28*8975f5c5SAndroid Build Coastguard Worker
onDestroy(const gl::Context * context)29*8975f5c5SAndroid Build Coastguard Worker void SyncGL::onDestroy(const gl::Context *context)
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker ASSERT(mSyncObject != 0);
32*8975f5c5SAndroid Build Coastguard Worker mFunctions->deleteSync(mSyncObject);
33*8975f5c5SAndroid Build Coastguard Worker mSyncObject = 0;
34*8975f5c5SAndroid Build Coastguard Worker }
35*8975f5c5SAndroid Build Coastguard Worker
set(const gl::Context * context,GLenum condition,GLbitfield flags)36*8975f5c5SAndroid Build Coastguard Worker angle::Result SyncGL::set(const gl::Context *context, GLenum condition, GLbitfield flags)
37*8975f5c5SAndroid Build Coastguard Worker {
38*8975f5c5SAndroid Build Coastguard Worker ASSERT(condition == GL_SYNC_GPU_COMMANDS_COMPLETE && flags == 0);
39*8975f5c5SAndroid Build Coastguard Worker ContextGL *contextGL = GetImplAs<ContextGL>(context);
40*8975f5c5SAndroid Build Coastguard Worker mSyncObject = mFunctions->fenceSync(condition, flags);
41*8975f5c5SAndroid Build Coastguard Worker ANGLE_CHECK(contextGL, mSyncObject != 0, "glFenceSync failed to create a GLsync object.",
42*8975f5c5SAndroid Build Coastguard Worker GL_OUT_OF_MEMORY);
43*8975f5c5SAndroid Build Coastguard Worker contextGL->markWorkSubmitted();
44*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
45*8975f5c5SAndroid Build Coastguard Worker }
46*8975f5c5SAndroid Build Coastguard Worker
clientWait(const gl::Context * context,GLbitfield flags,GLuint64 timeout,GLenum * outResult)47*8975f5c5SAndroid Build Coastguard Worker angle::Result SyncGL::clientWait(const gl::Context *context,
48*8975f5c5SAndroid Build Coastguard Worker GLbitfield flags,
49*8975f5c5SAndroid Build Coastguard Worker GLuint64 timeout,
50*8975f5c5SAndroid Build Coastguard Worker GLenum *outResult)
51*8975f5c5SAndroid Build Coastguard Worker {
52*8975f5c5SAndroid Build Coastguard Worker ASSERT(mSyncObject != 0);
53*8975f5c5SAndroid Build Coastguard Worker *outResult = mFunctions->clientWaitSync(mSyncObject, flags, timeout);
54*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
55*8975f5c5SAndroid Build Coastguard Worker }
56*8975f5c5SAndroid Build Coastguard Worker
serverWait(const gl::Context * context,GLbitfield flags,GLuint64 timeout)57*8975f5c5SAndroid Build Coastguard Worker angle::Result SyncGL::serverWait(const gl::Context *context, GLbitfield flags, GLuint64 timeout)
58*8975f5c5SAndroid Build Coastguard Worker {
59*8975f5c5SAndroid Build Coastguard Worker ASSERT(mSyncObject != 0);
60*8975f5c5SAndroid Build Coastguard Worker mFunctions->waitSync(mSyncObject, flags, timeout);
61*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
62*8975f5c5SAndroid Build Coastguard Worker }
63*8975f5c5SAndroid Build Coastguard Worker
getStatus(const gl::Context * context,GLint * outResult)64*8975f5c5SAndroid Build Coastguard Worker angle::Result SyncGL::getStatus(const gl::Context *context, GLint *outResult)
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker ASSERT(mSyncObject != 0);
67*8975f5c5SAndroid Build Coastguard Worker mFunctions->getSynciv(mSyncObject, GL_SYNC_STATUS, 1, nullptr, outResult);
68*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
69*8975f5c5SAndroid Build Coastguard Worker }
70*8975f5c5SAndroid Build Coastguard Worker } // namespace rx
71