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