• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2002 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // EGLSync.cpp: Implements the egl::Sync class.
8 
9 #include "libANGLE/EGLSync.h"
10 
11 #include "angle_gl.h"
12 
13 #include "common/utilities.h"
14 #include "libANGLE/renderer/EGLImplFactory.h"
15 #include "libANGLE/renderer/EGLReusableSync.h"
16 #include "libANGLE/renderer/EGLSyncImpl.h"
17 
18 namespace egl
19 {
20 
Sync(rx::EGLImplFactory * factory,const egl::SyncID & id,EGLenum type,const AttributeMap & attribs)21 Sync::Sync(rx::EGLImplFactory *factory,
22            const egl::SyncID &id,
23            EGLenum type,
24            const AttributeMap &attribs)
25     : mLabel(nullptr),
26       mId(id),
27       mType(type),
28       mAttributeMap(attribs),
29       mCondition(EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR),
30       mNativeFenceFD(
31           attribs.getAsInt(EGL_SYNC_NATIVE_FENCE_FD_ANDROID, EGL_NO_NATIVE_FENCE_FD_ANDROID))
32 {
33     switch (type)
34     {
35         case EGL_SYNC_FENCE:
36         case EGL_SYNC_NATIVE_FENCE_ANDROID:
37         case EGL_SYNC_METAL_SHARED_EVENT_ANGLE:
38             mFence = std::unique_ptr<rx::EGLSyncImpl>(factory->createSync(attribs));
39             break;
40 
41         case EGL_SYNC_REUSABLE_KHR:
42             mFence = std::unique_ptr<rx::EGLSyncImpl>(new rx::ReusableSync(attribs));
43             break;
44 
45         default:
46             UNREACHABLE();
47     }
48 
49     // Per extension spec: Signaling Condition.
50     // "If the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute is not
51     // EGL_NO_NATIVE_FENCE_FD_ANDROID then the EGL_SYNC_CONDITION_KHR attribute
52     // is set to EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID and the EGL_SYNC_STATUS_KHR
53     // attribute is set to reflect the signal status of the native fence object.
54     if ((mType == EGL_SYNC_NATIVE_FENCE_ANDROID) &&
55         (mNativeFenceFD != EGL_NO_NATIVE_FENCE_FD_ANDROID))
56     {
57         mCondition = EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID;
58     }
59 
60     // Per extension spec: Signaling Condition.
61     if (mType == EGL_SYNC_METAL_SHARED_EVENT_ANGLE)
62     {
63         mCondition = attribs.getAsInt(EGL_SYNC_CONDITION, EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR);
64     }
65 }
66 
onDestroy(const Display * display)67 void Sync::onDestroy(const Display *display)
68 {
69     ASSERT(mFence);
70     mFence->onDestroy(display);
71     mFence.reset();
72 }
73 
~Sync()74 Sync::~Sync() {}
75 
initialize(const Display * display,const gl::Context * context)76 Error Sync::initialize(const Display *display, const gl::Context *context)
77 {
78     return mFence->initialize(display, context, mType);
79 }
80 
setLabel(EGLLabelKHR label)81 void Sync::setLabel(EGLLabelKHR label)
82 {
83     mLabel = label;
84 }
85 
getLabel() const86 EGLLabelKHR Sync::getLabel() const
87 {
88     return mLabel;
89 }
90 
clientWait(const Display * display,const gl::Context * context,EGLint flags,EGLTime timeout,EGLint * outResult)91 Error Sync::clientWait(const Display *display,
92                        const gl::Context *context,
93                        EGLint flags,
94                        EGLTime timeout,
95                        EGLint *outResult)
96 {
97     return mFence->clientWait(display, context, flags, timeout, outResult);
98 }
99 
serverWait(const Display * display,const gl::Context * context,EGLint flags)100 Error Sync::serverWait(const Display *display, const gl::Context *context, EGLint flags)
101 {
102     return mFence->serverWait(display, context, flags);
103 }
104 
signal(const Display * display,const gl::Context * context,EGLint mode)105 Error Sync::signal(const Display *display, const gl::Context *context, EGLint mode)
106 {
107     return mFence->signal(display, context, mode);
108 }
109 
getStatus(const Display * display,EGLint * outStatus) const110 Error Sync::getStatus(const Display *display, EGLint *outStatus) const
111 {
112     return mFence->getStatus(display, outStatus);
113 }
114 
copyMetalSharedEventANGLE(const Display * display,void ** result) const115 Error Sync::copyMetalSharedEventANGLE(const Display *display, void **result) const
116 {
117     return mFence->copyMetalSharedEventANGLE(display, result);
118 }
119 
dupNativeFenceFD(const Display * display,EGLint * result) const120 Error Sync::dupNativeFenceFD(const Display *display, EGLint *result) const
121 {
122     return mFence->dupNativeFenceFD(display, result);
123 }
124 
125 }  // namespace egl
126