xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/EGLReusableSync.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2020 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 // EGLReusableSync.cpp: Implements the egl::ReusableSync class.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/EGLReusableSync.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/ContextImpl.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker namespace rx
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker 
ReusableSync()17*8975f5c5SAndroid Build Coastguard Worker ReusableSync::ReusableSync() : EGLSyncImpl(), mStatus(0) {}
18*8975f5c5SAndroid Build Coastguard Worker 
onDestroy(const egl::Display * display)19*8975f5c5SAndroid Build Coastguard Worker void ReusableSync::onDestroy(const egl::Display *display) {}
20*8975f5c5SAndroid Build Coastguard Worker 
~ReusableSync()21*8975f5c5SAndroid Build Coastguard Worker ReusableSync::~ReusableSync()
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker     // Release any waiting thread.
24*8975f5c5SAndroid Build Coastguard Worker     mCondVar.notify_all();
25*8975f5c5SAndroid Build Coastguard Worker }
26*8975f5c5SAndroid Build Coastguard Worker 
initialize(const egl::Display * display,const gl::Context * context,EGLenum type,const egl::AttributeMap & attribs)27*8975f5c5SAndroid Build Coastguard Worker egl::Error ReusableSync::initialize(const egl::Display *display,
28*8975f5c5SAndroid Build Coastguard Worker                                     const gl::Context *context,
29*8975f5c5SAndroid Build Coastguard Worker                                     EGLenum type,
30*8975f5c5SAndroid Build Coastguard Worker                                     const egl::AttributeMap &attribs)
31*8975f5c5SAndroid Build Coastguard Worker {
32*8975f5c5SAndroid Build Coastguard Worker     ASSERT(type == EGL_SYNC_REUSABLE_KHR);
33*8975f5c5SAndroid Build Coastguard Worker     mStatus = EGL_UNSIGNALED;
34*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
35*8975f5c5SAndroid Build Coastguard Worker }
36*8975f5c5SAndroid Build Coastguard Worker 
clientWait(const egl::Display * display,const gl::Context * context,EGLint flags,EGLTime timeout,EGLint * outResult)37*8975f5c5SAndroid Build Coastguard Worker egl::Error ReusableSync::clientWait(const egl::Display *display,
38*8975f5c5SAndroid Build Coastguard Worker                                     const gl::Context *context,
39*8975f5c5SAndroid Build Coastguard Worker                                     EGLint flags,
40*8975f5c5SAndroid Build Coastguard Worker                                     EGLTime timeout,
41*8975f5c5SAndroid Build Coastguard Worker                                     EGLint *outResult)
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker     if (mStatus == EGL_SIGNALED)
44*8975f5c5SAndroid Build Coastguard Worker     {
45*8975f5c5SAndroid Build Coastguard Worker         *outResult = EGL_CONDITION_SATISFIED_KHR;
46*8975f5c5SAndroid Build Coastguard Worker         return egl::NoError();
47*8975f5c5SAndroid Build Coastguard Worker     }
48*8975f5c5SAndroid Build Coastguard Worker     if (((flags & EGL_SYNC_FLUSH_COMMANDS_BIT) != 0) && (context != nullptr))
49*8975f5c5SAndroid Build Coastguard Worker     {
50*8975f5c5SAndroid Build Coastguard Worker         angle::Result result = context->getImplementation()->flush(context);
51*8975f5c5SAndroid Build Coastguard Worker         if (result != angle::Result::Continue)
52*8975f5c5SAndroid Build Coastguard Worker         {
53*8975f5c5SAndroid Build Coastguard Worker             return ResultToEGL(result);
54*8975f5c5SAndroid Build Coastguard Worker         }
55*8975f5c5SAndroid Build Coastguard Worker     }
56*8975f5c5SAndroid Build Coastguard Worker     if (timeout == 0)
57*8975f5c5SAndroid Build Coastguard Worker     {
58*8975f5c5SAndroid Build Coastguard Worker         *outResult = EGL_TIMEOUT_EXPIRED_KHR;
59*8975f5c5SAndroid Build Coastguard Worker         return egl::NoError();
60*8975f5c5SAndroid Build Coastguard Worker     }
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker     using NanoSeconds    = std::chrono::duration<int64_t, std::nano>;
63*8975f5c5SAndroid Build Coastguard Worker     NanoSeconds duration = (timeout == EGL_FOREVER) ? NanoSeconds::max() : NanoSeconds(timeout);
64*8975f5c5SAndroid Build Coastguard Worker     std::cv_status waitStatus = std::cv_status::no_timeout;
65*8975f5c5SAndroid Build Coastguard Worker     mMutex.lock();
66*8975f5c5SAndroid Build Coastguard Worker     waitStatus = mCondVar.wait_for(mMutex, duration);
67*8975f5c5SAndroid Build Coastguard Worker     mMutex.unlock();
68*8975f5c5SAndroid Build Coastguard Worker 
69*8975f5c5SAndroid Build Coastguard Worker     switch (waitStatus)
70*8975f5c5SAndroid Build Coastguard Worker     {
71*8975f5c5SAndroid Build Coastguard Worker         case std::cv_status::no_timeout:  // Signaled.
72*8975f5c5SAndroid Build Coastguard Worker             *outResult = EGL_CONDITION_SATISFIED_KHR;
73*8975f5c5SAndroid Build Coastguard Worker             break;
74*8975f5c5SAndroid Build Coastguard Worker         case std::cv_status::timeout:  // Timed-out.
75*8975f5c5SAndroid Build Coastguard Worker             *outResult = EGL_TIMEOUT_EXPIRED_KHR;
76*8975f5c5SAndroid Build Coastguard Worker             break;
77*8975f5c5SAndroid Build Coastguard Worker         default:
78*8975f5c5SAndroid Build Coastguard Worker             break;
79*8975f5c5SAndroid Build Coastguard Worker     }
80*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
81*8975f5c5SAndroid Build Coastguard Worker }
82*8975f5c5SAndroid Build Coastguard Worker 
serverWait(const egl::Display * display,const gl::Context * context,EGLint flags)83*8975f5c5SAndroid Build Coastguard Worker egl::Error ReusableSync::serverWait(const egl::Display *display,
84*8975f5c5SAndroid Build Coastguard Worker                                     const gl::Context *context,
85*8975f5c5SAndroid Build Coastguard Worker                                     EGLint flags)
86*8975f5c5SAndroid Build Coastguard Worker {
87*8975f5c5SAndroid Build Coastguard Worker     // Does not support server wait.
88*8975f5c5SAndroid Build Coastguard Worker     return egl::EglBadMatch();
89*8975f5c5SAndroid Build Coastguard Worker }
90*8975f5c5SAndroid Build Coastguard Worker 
signal(const egl::Display * display,const gl::Context * context,EGLint mode)91*8975f5c5SAndroid Build Coastguard Worker egl::Error ReusableSync::signal(const egl::Display *display,
92*8975f5c5SAndroid Build Coastguard Worker                                 const gl::Context *context,
93*8975f5c5SAndroid Build Coastguard Worker                                 EGLint mode)
94*8975f5c5SAndroid Build Coastguard Worker {
95*8975f5c5SAndroid Build Coastguard Worker     if (mode == EGL_SIGNALED)
96*8975f5c5SAndroid Build Coastguard Worker     {
97*8975f5c5SAndroid Build Coastguard Worker         if (mStatus == EGL_UNSIGNALED)
98*8975f5c5SAndroid Build Coastguard Worker         {
99*8975f5c5SAndroid Build Coastguard Worker             // Release all threads.
100*8975f5c5SAndroid Build Coastguard Worker             mCondVar.notify_all();
101*8975f5c5SAndroid Build Coastguard Worker         }
102*8975f5c5SAndroid Build Coastguard Worker         mStatus = EGL_SIGNALED;
103*8975f5c5SAndroid Build Coastguard Worker     }
104*8975f5c5SAndroid Build Coastguard Worker     else
105*8975f5c5SAndroid Build Coastguard Worker     {
106*8975f5c5SAndroid Build Coastguard Worker         mStatus = EGL_UNSIGNALED;
107*8975f5c5SAndroid Build Coastguard Worker     }
108*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker 
getStatus(const egl::Display * display,EGLint * outStatus)111*8975f5c5SAndroid Build Coastguard Worker egl::Error ReusableSync::getStatus(const egl::Display *display, EGLint *outStatus)
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker     *outStatus = mStatus;
114*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
115*8975f5c5SAndroid Build Coastguard Worker }
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
118