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