xref: /aosp_15_r20/external/angle/src/libANGLE/Fence.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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