1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 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 // Fence.cpp: Implements the gl::FenceNV and gl::Sync classes.
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Fence.h"
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker #include "angle_gl.h"
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker #include "common/utilities.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/FenceNVImpl.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/GLImplFactory.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/SyncImpl.h"
17*8975f5c5SAndroid Build Coastguard Worker
18*8975f5c5SAndroid Build Coastguard Worker namespace gl
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker
FenceNV(rx::GLImplFactory * factory)21*8975f5c5SAndroid Build Coastguard Worker FenceNV::FenceNV(rx::GLImplFactory *factory)
22*8975f5c5SAndroid Build Coastguard Worker : mFence(factory->createFenceNV()), mIsSet(false), mStatus(GL_FALSE), mCondition(GL_NONE)
23*8975f5c5SAndroid Build Coastguard Worker {}
24*8975f5c5SAndroid Build Coastguard Worker
~FenceNV()25*8975f5c5SAndroid Build Coastguard Worker FenceNV::~FenceNV()
26*8975f5c5SAndroid Build Coastguard Worker {
27*8975f5c5SAndroid Build Coastguard Worker SafeDelete(mFence);
28*8975f5c5SAndroid Build Coastguard Worker }
29*8975f5c5SAndroid Build Coastguard Worker
onDestroy(const gl::Context * context)30*8975f5c5SAndroid Build Coastguard Worker void FenceNV::onDestroy(const gl::Context *context)
31*8975f5c5SAndroid Build Coastguard Worker {
32*8975f5c5SAndroid Build Coastguard Worker mFence->onDestroy(context);
33*8975f5c5SAndroid Build Coastguard Worker }
34*8975f5c5SAndroid Build Coastguard Worker
set(const Context * context,GLenum condition)35*8975f5c5SAndroid Build Coastguard Worker angle::Result FenceNV::set(const Context *context, GLenum condition)
36*8975f5c5SAndroid Build Coastguard Worker {
37*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(mFence->set(context, condition));
38*8975f5c5SAndroid Build Coastguard Worker
39*8975f5c5SAndroid Build Coastguard Worker mCondition = condition;
40*8975f5c5SAndroid Build Coastguard Worker mStatus = GL_FALSE;
41*8975f5c5SAndroid Build Coastguard Worker mIsSet = true;
42*8975f5c5SAndroid Build Coastguard Worker
43*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
44*8975f5c5SAndroid Build Coastguard Worker }
45*8975f5c5SAndroid Build Coastguard Worker
test(const Context * context,GLboolean * outResult)46*8975f5c5SAndroid Build Coastguard Worker angle::Result FenceNV::test(const Context *context, GLboolean *outResult)
47*8975f5c5SAndroid Build Coastguard Worker {
48*8975f5c5SAndroid Build Coastguard Worker // Flush the command buffer by default
49*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(mFence->test(context, &mStatus));
50*8975f5c5SAndroid Build Coastguard Worker
51*8975f5c5SAndroid Build Coastguard Worker *outResult = mStatus;
52*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
53*8975f5c5SAndroid Build Coastguard Worker }
54*8975f5c5SAndroid Build Coastguard Worker
finish(const Context * context)55*8975f5c5SAndroid Build Coastguard Worker angle::Result FenceNV::finish(const Context *context)
56*8975f5c5SAndroid Build Coastguard Worker {
57*8975f5c5SAndroid Build Coastguard Worker ASSERT(mIsSet);
58*8975f5c5SAndroid Build Coastguard Worker
59*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(mFence->finish(context));
60*8975f5c5SAndroid Build Coastguard Worker
61*8975f5c5SAndroid Build Coastguard Worker mStatus = GL_TRUE;
62*8975f5c5SAndroid Build Coastguard Worker
63*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
64*8975f5c5SAndroid Build Coastguard Worker }
65*8975f5c5SAndroid Build Coastguard Worker
Sync(rx::GLImplFactory * factory,SyncID id)66*8975f5c5SAndroid Build Coastguard Worker Sync::Sync(rx::GLImplFactory *factory, SyncID id)
67*8975f5c5SAndroid Build Coastguard Worker : RefCountObject(factory->generateSerial(), id),
68*8975f5c5SAndroid Build Coastguard Worker mFence(factory->createSync()),
69*8975f5c5SAndroid Build Coastguard Worker mLabel(),
70*8975f5c5SAndroid Build Coastguard Worker mCondition(GL_SYNC_GPU_COMMANDS_COMPLETE),
71*8975f5c5SAndroid Build Coastguard Worker mFlags(0)
72*8975f5c5SAndroid Build Coastguard Worker {}
73*8975f5c5SAndroid Build Coastguard Worker
onDestroy(const Context * context)74*8975f5c5SAndroid Build Coastguard Worker void Sync::onDestroy(const Context *context)
75*8975f5c5SAndroid Build Coastguard Worker {
76*8975f5c5SAndroid Build Coastguard Worker ASSERT(mFence);
77*8975f5c5SAndroid Build Coastguard Worker mFence->onDestroy(context);
78*8975f5c5SAndroid Build Coastguard Worker }
79*8975f5c5SAndroid Build Coastguard Worker
~Sync()80*8975f5c5SAndroid Build Coastguard Worker Sync::~Sync()
81*8975f5c5SAndroid Build Coastguard Worker {
82*8975f5c5SAndroid Build Coastguard Worker SafeDelete(mFence);
83*8975f5c5SAndroid Build Coastguard Worker }
84*8975f5c5SAndroid Build Coastguard Worker
setLabel(const Context * context,const std::string & label)85*8975f5c5SAndroid Build Coastguard Worker angle::Result Sync::setLabel(const Context *context, const std::string &label)
86*8975f5c5SAndroid Build Coastguard Worker {
87*8975f5c5SAndroid Build Coastguard Worker mLabel = label;
88*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
89*8975f5c5SAndroid Build Coastguard Worker }
90*8975f5c5SAndroid Build Coastguard Worker
getLabel() const91*8975f5c5SAndroid Build Coastguard Worker const std::string &Sync::getLabel() const
92*8975f5c5SAndroid Build Coastguard Worker {
93*8975f5c5SAndroid Build Coastguard Worker return mLabel;
94*8975f5c5SAndroid Build Coastguard Worker }
95*8975f5c5SAndroid Build Coastguard Worker
set(const Context * context,GLenum condition,GLbitfield flags)96*8975f5c5SAndroid Build Coastguard Worker angle::Result Sync::set(const Context *context, GLenum condition, GLbitfield flags)
97*8975f5c5SAndroid Build Coastguard Worker {
98*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(mFence->set(context, condition, flags));
99*8975f5c5SAndroid Build Coastguard Worker
100*8975f5c5SAndroid Build Coastguard Worker mCondition = condition;
101*8975f5c5SAndroid Build Coastguard Worker mFlags = flags;
102*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
103*8975f5c5SAndroid Build Coastguard Worker }
104*8975f5c5SAndroid Build Coastguard Worker
clientWait(const Context * context,GLbitfield flags,GLuint64 timeout,GLenum * outResult)105*8975f5c5SAndroid Build Coastguard Worker angle::Result Sync::clientWait(const Context *context,
106*8975f5c5SAndroid Build Coastguard Worker GLbitfield flags,
107*8975f5c5SAndroid Build Coastguard Worker GLuint64 timeout,
108*8975f5c5SAndroid Build Coastguard Worker GLenum *outResult)
109*8975f5c5SAndroid Build Coastguard Worker {
110*8975f5c5SAndroid Build Coastguard Worker ASSERT(mCondition != GL_NONE);
111*8975f5c5SAndroid Build Coastguard Worker return mFence->clientWait(context, flags, timeout, outResult);
112*8975f5c5SAndroid Build Coastguard Worker }
113*8975f5c5SAndroid Build Coastguard Worker
serverWait(const Context * context,GLbitfield flags,GLuint64 timeout)114*8975f5c5SAndroid Build Coastguard Worker angle::Result Sync::serverWait(const Context *context, GLbitfield flags, GLuint64 timeout)
115*8975f5c5SAndroid Build Coastguard Worker {
116*8975f5c5SAndroid Build Coastguard Worker return mFence->serverWait(context, flags, timeout);
117*8975f5c5SAndroid Build Coastguard Worker }
118*8975f5c5SAndroid Build Coastguard Worker
getStatus(const Context * context,GLint * outResult) const119*8975f5c5SAndroid Build Coastguard Worker angle::Result Sync::getStatus(const Context *context, GLint *outResult) const
120*8975f5c5SAndroid Build Coastguard Worker {
121*8975f5c5SAndroid Build Coastguard Worker return mFence->getStatus(context, outResult);
122*8975f5c5SAndroid Build Coastguard Worker }
123*8975f5c5SAndroid Build Coastguard Worker
124*8975f5c5SAndroid Build Coastguard Worker } // namespace gl
125