xref: /aosp_15_r20/external/angle/src/tests/egl_tests/EGLSyncTestMetalSharedEvent.mm (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker//
2*8975f5c5SAndroid Build Coastguard Worker// Copyright 2022 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// EGLSyncTestMetalSharedEvent:
7*8975f5c5SAndroid Build Coastguard Worker//   Tests pertaining to EGL_ANGLE_sync_mtl_shared_event extension.
8*8975f5c5SAndroid Build Coastguard Worker//
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker#include <gtest/gtest.h>
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Worker#include "test_utils/ANGLETest.h"
13*8975f5c5SAndroid Build Coastguard Worker#include "util/EGLWindow.h"
14*8975f5c5SAndroid Build Coastguard Worker
15*8975f5c5SAndroid Build Coastguard Worker#include <Metal/Metal.h>
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Workerusing namespace angle;
18*8975f5c5SAndroid Build Coastguard Worker
19*8975f5c5SAndroid Build Coastguard Workerstatic inline EGLAttrib Uint64HighPart(uint64_t value)
20*8975f5c5SAndroid Build Coastguard Worker{
21*8975f5c5SAndroid Build Coastguard Worker    return value >> 32;
22*8975f5c5SAndroid Build Coastguard Worker}
23*8975f5c5SAndroid Build Coastguard Worker
24*8975f5c5SAndroid Build Coastguard Workerstatic inline EGLAttrib Uint64LowPart(uint64_t value)
25*8975f5c5SAndroid Build Coastguard Worker{
26*8975f5c5SAndroid Build Coastguard Worker    return value & 0xFFFFFFFF;
27*8975f5c5SAndroid Build Coastguard Worker}
28*8975f5c5SAndroid Build Coastguard Worker
29*8975f5c5SAndroid Build Coastguard Workerclass EGLSyncTestMetalSharedEvent : public ANGLETest<>
30*8975f5c5SAndroid Build Coastguard Worker{
31*8975f5c5SAndroid Build Coastguard Worker  protected:
32*8975f5c5SAndroid Build Coastguard Worker    id<MTLSharedEvent> createMetalSharedEvent() const
33*8975f5c5SAndroid Build Coastguard Worker    {
34*8975f5c5SAndroid Build Coastguard Worker        id<MTLDevice> device           = getMetalDevice();
35*8975f5c5SAndroid Build Coastguard Worker        id<MTLSharedEvent> sharedEvent = [device newSharedEvent];
36*8975f5c5SAndroid Build Coastguard Worker        sharedEvent.label              = @"TestSharedEvent";
37*8975f5c5SAndroid Build Coastguard Worker        return sharedEvent;
38*8975f5c5SAndroid Build Coastguard Worker    }
39*8975f5c5SAndroid Build Coastguard Worker
40*8975f5c5SAndroid Build Coastguard Worker    id<MTLDevice> getMetalDevice() const
41*8975f5c5SAndroid Build Coastguard Worker    {
42*8975f5c5SAndroid Build Coastguard Worker        EGLAttrib angleDevice = 0;
43*8975f5c5SAndroid Build Coastguard Worker        EXPECT_EGL_TRUE(
44*8975f5c5SAndroid Build Coastguard Worker            eglQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &angleDevice));
45*8975f5c5SAndroid Build Coastguard Worker
46*8975f5c5SAndroid Build Coastguard Worker        EGLAttrib device = 0;
47*8975f5c5SAndroid Build Coastguard Worker        EXPECT_EGL_TRUE(eglQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice),
48*8975f5c5SAndroid Build Coastguard Worker                                                EGL_METAL_DEVICE_ANGLE, &device));
49*8975f5c5SAndroid Build Coastguard Worker
50*8975f5c5SAndroid Build Coastguard Worker        return (__bridge id<MTLDevice>)reinterpret_cast<void *>(device);
51*8975f5c5SAndroid Build Coastguard Worker    }
52*8975f5c5SAndroid Build Coastguard Worker
53*8975f5c5SAndroid Build Coastguard Worker    bool hasEGLDisplayExtension(const char *extname) const
54*8975f5c5SAndroid Build Coastguard Worker    {
55*8975f5c5SAndroid Build Coastguard Worker        return IsEGLDisplayExtensionEnabled(getEGLWindow()->getDisplay(), extname);
56*8975f5c5SAndroid Build Coastguard Worker    }
57*8975f5c5SAndroid Build Coastguard Worker
58*8975f5c5SAndroid Build Coastguard Worker    bool hasSyncMetalSharedEventExtension() const
59*8975f5c5SAndroid Build Coastguard Worker    {
60*8975f5c5SAndroid Build Coastguard Worker        return hasEGLDisplayExtension("EGL_ANGLE_metal_shared_event_sync");
61*8975f5c5SAndroid Build Coastguard Worker    }
62*8975f5c5SAndroid Build Coastguard Worker
63*8975f5c5SAndroid Build Coastguard Worker    EGLAttrib sharedEventAsAttrib(id<MTLSharedEvent> sharedEvent) const
64*8975f5c5SAndroid Build Coastguard Worker    {
65*8975f5c5SAndroid Build Coastguard Worker        return reinterpret_cast<EGLAttrib>(sharedEvent);
66*8975f5c5SAndroid Build Coastguard Worker    }
67*8975f5c5SAndroid Build Coastguard Worker
68*8975f5c5SAndroid Build Coastguard Worker    id<MTLSharedEvent> sharedEventFromVoidPtr(void *ptr) const
69*8975f5c5SAndroid Build Coastguard Worker    {
70*8975f5c5SAndroid Build Coastguard Worker        return (__bridge id<MTLSharedEvent>)ptr;
71*8975f5c5SAndroid Build Coastguard Worker    }
72*8975f5c5SAndroid Build Coastguard Worker};
73*8975f5c5SAndroid Build Coastguard Worker
74*8975f5c5SAndroid Build Coastguard Worker// Test existing fence is created unsignaled
75*8975f5c5SAndroid Build Coastguard WorkerTEST_P(EGLSyncTestMetalSharedEvent, BasicEGLSync)
76*8975f5c5SAndroid Build Coastguard Worker{
77*8975f5c5SAndroid Build Coastguard Worker    ANGLE_SKIP_TEST_IF(!hasSyncMetalSharedEventExtension());
78*8975f5c5SAndroid Build Coastguard Worker
79*8975f5c5SAndroid Build Coastguard Worker    EGLDisplay display = getEGLWindow()->getDisplay();
80*8975f5c5SAndroid Build Coastguard Worker
81*8975f5c5SAndroid Build Coastguard Worker    EGLSyncKHR sync = eglCreateSyncKHR(display, EGL_SYNC_FENCE_KHR, nullptr);
82*8975f5c5SAndroid Build Coastguard Worker    EXPECT_NE(sync, EGL_NO_SYNC_KHR);
83*8975f5c5SAndroid Build Coastguard Worker
84*8975f5c5SAndroid Build Coastguard Worker    constexpr EGLint kSentinelAttribValue = 123456789;
85*8975f5c5SAndroid Build Coastguard Worker    EGLint signaledValue                  = kSentinelAttribValue;
86*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttribKHR(display, sync, EGL_SYNC_STATUS_KHR, &signaledValue));
87*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(signaledValue, EGL_UNSIGNALED_KHR);
88*8975f5c5SAndroid Build Coastguard Worker
89*8975f5c5SAndroid Build Coastguard Worker    glClearColor(1.0f, 0.0f, 1.0f, 1.0f);
90*8975f5c5SAndroid Build Coastguard Worker
91*8975f5c5SAndroid Build Coastguard Worker    glClear(GL_COLOR_BUFFER_BIT);
92*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglWaitSyncKHR(display, sync, 0));
93*8975f5c5SAndroid Build Coastguard Worker
94*8975f5c5SAndroid Build Coastguard Worker    glFinish();
95*8975f5c5SAndroid Build Coastguard Worker
96*8975f5c5SAndroid Build Coastguard Worker    // Don't wait forever to make sure the test terminates
97*8975f5c5SAndroid Build Coastguard Worker    constexpr GLuint64 kTimeout = 1000'000'000ul;  // 1 second
98*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(EGL_CONDITION_SATISFIED_KHR,
99*8975f5c5SAndroid Build Coastguard Worker              eglClientWaitSyncKHR(display, sync, EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, kTimeout));
100*8975f5c5SAndroid Build Coastguard Worker
101*8975f5c5SAndroid Build Coastguard Worker    signaledValue = kSentinelAttribValue;
102*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttribKHR(display, sync, EGL_SYNC_STATUS_KHR, &signaledValue));
103*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(signaledValue, EGL_SIGNALED_KHR);
104*8975f5c5SAndroid Build Coastguard Worker
105*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglDestroySyncKHR(display, sync));
106*8975f5c5SAndroid Build Coastguard Worker}
107*8975f5c5SAndroid Build Coastguard Worker
108*8975f5c5SAndroid Build Coastguard Worker// Test usage of eglGetSyncAttrib
109*8975f5c5SAndroid Build Coastguard WorkerTEST_P(EGLSyncTestMetalSharedEvent, GetSyncAttrib)
110*8975f5c5SAndroid Build Coastguard Worker{
111*8975f5c5SAndroid Build Coastguard Worker    ANGLE_SKIP_TEST_IF(!hasSyncMetalSharedEventExtension());
112*8975f5c5SAndroid Build Coastguard Worker
113*8975f5c5SAndroid Build Coastguard Worker    id<MTLSharedEvent> sharedEvent = createMetalSharedEvent();
114*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ([sharedEvent retainCount], 1ul);
115*8975f5c5SAndroid Build Coastguard Worker    uint64_t initialSignalValue = sharedEvent.signaledValue;
116*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(initialSignalValue, 0u);
117*8975f5c5SAndroid Build Coastguard Worker
118*8975f5c5SAndroid Build Coastguard Worker    EGLDisplay display      = getEGLWindow()->getDisplay();
119*8975f5c5SAndroid Build Coastguard Worker    EGLAttrib syncAttribs[] = {EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE,
120*8975f5c5SAndroid Build Coastguard Worker                               sharedEventAsAttrib(sharedEvent), EGL_NONE};
121*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ([sharedEvent retainCount], 1ul);
122*8975f5c5SAndroid Build Coastguard Worker
123*8975f5c5SAndroid Build Coastguard Worker    EGLSync sync = eglCreateSync(display, EGL_SYNC_METAL_SHARED_EVENT_ANGLE, syncAttribs);
124*8975f5c5SAndroid Build Coastguard Worker    EXPECT_NE(sync, EGL_NO_SYNC);
125*8975f5c5SAndroid Build Coastguard Worker    // sharedEvent, sync, mtlCommandBuffer
126*8975f5c5SAndroid Build Coastguard Worker    EXPECT_GT([sharedEvent retainCount], 1ul);
127*8975f5c5SAndroid Build Coastguard Worker
128*8975f5c5SAndroid Build Coastguard Worker    // Fence sync attributes are:
129*8975f5c5SAndroid Build Coastguard Worker    //
130*8975f5c5SAndroid Build Coastguard Worker    // EGL_SYNC_TYPE: EGL_SYNC_METAL_SHARED_EVENT_ANGLE
131*8975f5c5SAndroid Build Coastguard Worker    // EGL_SYNC_STATUS: EGL_UNSIGNALED or EGL_SIGNALED
132*8975f5c5SAndroid Build Coastguard Worker    // EGL_SYNC_CONDITION: EGL_SYNC_PRIOR_COMMANDS_COMPLETE
133*8975f5c5SAndroid Build Coastguard Worker
134*8975f5c5SAndroid Build Coastguard Worker    constexpr EGLAttrib kSentinelAttribValue = 123456789;
135*8975f5c5SAndroid Build Coastguard Worker    EGLAttrib attribValue                    = kSentinelAttribValue;
136*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttrib(display, sync, EGL_SYNC_TYPE, &attribValue));
137*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(attribValue, EGL_SYNC_METAL_SHARED_EVENT_ANGLE);
138*8975f5c5SAndroid Build Coastguard Worker
139*8975f5c5SAndroid Build Coastguard Worker    attribValue = kSentinelAttribValue;
140*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttrib(display, sync, EGL_SYNC_CONDITION, &attribValue));
141*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(attribValue, EGL_SYNC_PRIOR_COMMANDS_COMPLETE);
142*8975f5c5SAndroid Build Coastguard Worker
143*8975f5c5SAndroid Build Coastguard Worker    attribValue = kSentinelAttribValue;
144*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttrib(display, sync, EGL_SYNC_STATUS, &attribValue));
145*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(attribValue, EGL_UNSIGNALED);
146*8975f5c5SAndroid Build Coastguard Worker    EXPECT_GT([sharedEvent retainCount], 1ul);
147*8975f5c5SAndroid Build Coastguard Worker
148*8975f5c5SAndroid Build Coastguard Worker    glFinish();
149*8975f5c5SAndroid Build Coastguard Worker
150*8975f5c5SAndroid Build Coastguard Worker    attribValue = kSentinelAttribValue;
151*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttrib(display, sync, EGL_SYNC_STATUS, &attribValue));
152*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(attribValue, EGL_SIGNALED);
153*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(sharedEvent.signaledValue, initialSignalValue + 1);
154*8975f5c5SAndroid Build Coastguard Worker    EXPECT_GT([sharedEvent retainCount], 1ul);
155*8975f5c5SAndroid Build Coastguard Worker
156*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglDestroySync(display, sync));
157*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ([sharedEvent retainCount], 1ul);
158*8975f5c5SAndroid Build Coastguard Worker
159*8975f5c5SAndroid Build Coastguard Worker    sharedEvent = nil;
160*8975f5c5SAndroid Build Coastguard Worker}
161*8975f5c5SAndroid Build Coastguard Worker
162*8975f5c5SAndroid Build Coastguard Worker// Test usage of eglGetSyncAttrib with explicit sync condition
163*8975f5c5SAndroid Build Coastguard WorkerTEST_P(EGLSyncTestMetalSharedEvent, GetSyncAttrib_ExplicitSyncCondition)
164*8975f5c5SAndroid Build Coastguard Worker{
165*8975f5c5SAndroid Build Coastguard Worker    ANGLE_SKIP_TEST_IF(!hasSyncMetalSharedEventExtension());
166*8975f5c5SAndroid Build Coastguard Worker
167*8975f5c5SAndroid Build Coastguard Worker    id<MTLSharedEvent> sharedEvent = createMetalSharedEvent();
168*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(sharedEvent.signaledValue, 0u);
169*8975f5c5SAndroid Build Coastguard Worker
170*8975f5c5SAndroid Build Coastguard Worker    EGLDisplay display          = getEGLWindow()->getDisplay();
171*8975f5c5SAndroid Build Coastguard Worker    EGLAttrib syncAttribs[3][5] = {
172*8975f5c5SAndroid Build Coastguard Worker        {EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE, sharedEventAsAttrib(sharedEvent), EGL_NONE},
173*8975f5c5SAndroid Build Coastguard Worker        {EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE, sharedEventAsAttrib(sharedEvent),
174*8975f5c5SAndroid Build Coastguard Worker         EGL_SYNC_CONDITION, EGL_SYNC_PRIOR_COMMANDS_COMPLETE, EGL_NONE},
175*8975f5c5SAndroid Build Coastguard Worker        {EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE, sharedEventAsAttrib(sharedEvent),
176*8975f5c5SAndroid Build Coastguard Worker         EGL_SYNC_CONDITION, EGL_SYNC_METAL_SHARED_EVENT_SIGNALED_ANGLE, EGL_NONE}};
177*8975f5c5SAndroid Build Coastguard Worker
178*8975f5c5SAndroid Build Coastguard Worker    EGLAttrib expectedSyncCondition[3] = {EGL_SYNC_PRIOR_COMMANDS_COMPLETE,
179*8975f5c5SAndroid Build Coastguard Worker                                          EGL_SYNC_PRIOR_COMMANDS_COMPLETE,
180*8975f5c5SAndroid Build Coastguard Worker                                          EGL_SYNC_METAL_SHARED_EVENT_SIGNALED_ANGLE};
181*8975f5c5SAndroid Build Coastguard Worker
182*8975f5c5SAndroid Build Coastguard Worker    for (int i = 0; i < 3; ++i)
183*8975f5c5SAndroid Build Coastguard Worker    {
184*8975f5c5SAndroid Build Coastguard Worker        uint64_t initialSignalValue = sharedEvent.signaledValue;
185*8975f5c5SAndroid Build Coastguard Worker
186*8975f5c5SAndroid Build Coastguard Worker        EGLSync sync = eglCreateSync(display, EGL_SYNC_METAL_SHARED_EVENT_ANGLE, syncAttribs[i]);
187*8975f5c5SAndroid Build Coastguard Worker        EXPECT_NE(sync, EGL_NO_SYNC);
188*8975f5c5SAndroid Build Coastguard Worker
189*8975f5c5SAndroid Build Coastguard Worker        constexpr EGLAttrib kSentinelAttribValue = 123456789;
190*8975f5c5SAndroid Build Coastguard Worker        EGLAttrib attribValue                    = kSentinelAttribValue;
191*8975f5c5SAndroid Build Coastguard Worker        EXPECT_EGL_TRUE(eglGetSyncAttrib(display, sync, EGL_SYNC_TYPE, &attribValue));
192*8975f5c5SAndroid Build Coastguard Worker        EXPECT_EQ(attribValue, EGL_SYNC_METAL_SHARED_EVENT_ANGLE);
193*8975f5c5SAndroid Build Coastguard Worker
194*8975f5c5SAndroid Build Coastguard Worker        attribValue = kSentinelAttribValue;
195*8975f5c5SAndroid Build Coastguard Worker        EXPECT_EGL_TRUE(eglGetSyncAttrib(display, sync, EGL_SYNC_CONDITION, &attribValue));
196*8975f5c5SAndroid Build Coastguard Worker        EXPECT_EQ(attribValue, expectedSyncCondition[i]);
197*8975f5c5SAndroid Build Coastguard Worker
198*8975f5c5SAndroid Build Coastguard Worker        attribValue = kSentinelAttribValue;
199*8975f5c5SAndroid Build Coastguard Worker        EXPECT_EGL_TRUE(eglGetSyncAttrib(display, sync, EGL_SYNC_STATUS, &attribValue));
200*8975f5c5SAndroid Build Coastguard Worker        EXPECT_EQ(attribValue, EGL_UNSIGNALED);
201*8975f5c5SAndroid Build Coastguard Worker
202*8975f5c5SAndroid Build Coastguard Worker        glFinish();
203*8975f5c5SAndroid Build Coastguard Worker
204*8975f5c5SAndroid Build Coastguard Worker        if (i == 2)
205*8975f5c5SAndroid Build Coastguard Worker        {
206*8975f5c5SAndroid Build Coastguard Worker            sharedEvent.signaledValue += 1;
207*8975f5c5SAndroid Build Coastguard Worker        }
208*8975f5c5SAndroid Build Coastguard Worker
209*8975f5c5SAndroid Build Coastguard Worker        attribValue = kSentinelAttribValue;
210*8975f5c5SAndroid Build Coastguard Worker        EXPECT_EGL_TRUE(eglGetSyncAttrib(display, sync, EGL_SYNC_STATUS, &attribValue));
211*8975f5c5SAndroid Build Coastguard Worker        EXPECT_EQ(attribValue, EGL_SIGNALED);
212*8975f5c5SAndroid Build Coastguard Worker        EXPECT_EQ(sharedEvent.signaledValue, initialSignalValue + 1);
213*8975f5c5SAndroid Build Coastguard Worker
214*8975f5c5SAndroid Build Coastguard Worker        EXPECT_EGL_TRUE(eglDestroySync(display, sync));
215*8975f5c5SAndroid Build Coastguard Worker    }
216*8975f5c5SAndroid Build Coastguard Worker
217*8975f5c5SAndroid Build Coastguard Worker    sharedEvent = nil;
218*8975f5c5SAndroid Build Coastguard Worker}
219*8975f5c5SAndroid Build Coastguard Worker
220*8975f5c5SAndroid Build Coastguard Worker// Verify CreateSync and ClientWait for EGL_ANGLE_metal_shared_event_sync
221*8975f5c5SAndroid Build Coastguard WorkerTEST_P(EGLSyncTestMetalSharedEvent, AngleMetalSharedEventSync_ClientWait)
222*8975f5c5SAndroid Build Coastguard Worker{
223*8975f5c5SAndroid Build Coastguard Worker    ANGLE_SKIP_TEST_IF(!hasSyncMetalSharedEventExtension());
224*8975f5c5SAndroid Build Coastguard Worker
225*8975f5c5SAndroid Build Coastguard Worker    id<MTLSharedEvent> sharedEvent = createMetalSharedEvent();
226*8975f5c5SAndroid Build Coastguard Worker
227*8975f5c5SAndroid Build Coastguard Worker    EGLDisplay display      = getEGLWindow()->getDisplay();
228*8975f5c5SAndroid Build Coastguard Worker    EGLAttrib syncAttribs[] = {EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE,
229*8975f5c5SAndroid Build Coastguard Worker                               sharedEventAsAttrib(sharedEvent), EGL_NONE};
230*8975f5c5SAndroid Build Coastguard Worker
231*8975f5c5SAndroid Build Coastguard Worker    // We can ClientWait on this
232*8975f5c5SAndroid Build Coastguard Worker    EGLSync syncWithSharedEvent =
233*8975f5c5SAndroid Build Coastguard Worker        eglCreateSync(display, EGL_SYNC_METAL_SHARED_EVENT_ANGLE, syncAttribs);
234*8975f5c5SAndroid Build Coastguard Worker    EXPECT_NE(syncWithSharedEvent, EGL_NO_SYNC);
235*8975f5c5SAndroid Build Coastguard Worker
236*8975f5c5SAndroid Build Coastguard Worker    // Create work to do
237*8975f5c5SAndroid Build Coastguard Worker    glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
238*8975f5c5SAndroid Build Coastguard Worker    glClear(GL_COLOR_BUFFER_BIT);
239*8975f5c5SAndroid Build Coastguard Worker    glFlush();
240*8975f5c5SAndroid Build Coastguard Worker
241*8975f5c5SAndroid Build Coastguard Worker    // Wait for the draw to complete
242*8975f5c5SAndroid Build Coastguard Worker    glClear(GL_COLOR_BUFFER_BIT);
243*8975f5c5SAndroid Build Coastguard Worker
244*8975f5c5SAndroid Build Coastguard Worker    // Don't wait forever to make sure the test terminates
245*8975f5c5SAndroid Build Coastguard Worker    constexpr GLuint64 kTimeout = 1000000000;  // 1 second
246*8975f5c5SAndroid Build Coastguard Worker    EGLAttrib value             = 0;
247*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(EGL_CONDITION_SATISFIED, eglClientWaitSync(display, syncWithSharedEvent,
248*8975f5c5SAndroid Build Coastguard Worker                                                         EGL_SYNC_FLUSH_COMMANDS_BIT, kTimeout));
249*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttrib(display, syncWithSharedEvent, EGL_SYNC_STATUS, &value));
250*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(value, EGL_SIGNALED);
251*8975f5c5SAndroid Build Coastguard Worker
252*8975f5c5SAndroid Build Coastguard Worker    // Clean up created objects.
253*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglDestroySync(display, syncWithSharedEvent));
254*8975f5c5SAndroid Build Coastguard Worker    sharedEvent = nil;
255*8975f5c5SAndroid Build Coastguard Worker}
256*8975f5c5SAndroid Build Coastguard Worker
257*8975f5c5SAndroid Build Coastguard Worker// Verify CreateSync and ClientWait for EGL_ANGLE_metal_shared_event_sync
258*8975f5c5SAndroid Build Coastguard WorkerTEST_P(EGLSyncTestMetalSharedEvent, AngleMetalSharedEventSync_ClientWait_WithSignalValue)
259*8975f5c5SAndroid Build Coastguard Worker{
260*8975f5c5SAndroid Build Coastguard Worker    ANGLE_SKIP_TEST_IF(!hasSyncMetalSharedEventExtension());
261*8975f5c5SAndroid Build Coastguard Worker
262*8975f5c5SAndroid Build Coastguard Worker    id<MTLSharedEvent> sharedEvent = createMetalSharedEvent();
263*8975f5c5SAndroid Build Coastguard Worker
264*8975f5c5SAndroid Build Coastguard Worker    constexpr uint64_t kSignalValue = 0xDEADBEEFCAFE;
265*8975f5c5SAndroid Build Coastguard Worker    EGLDisplay display              = getEGLWindow()->getDisplay();
266*8975f5c5SAndroid Build Coastguard Worker    EGLAttrib syncAttribs[]         = {EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE,
267*8975f5c5SAndroid Build Coastguard Worker                                       sharedEventAsAttrib(sharedEvent),
268*8975f5c5SAndroid Build Coastguard Worker                                       EGL_SYNC_METAL_SHARED_EVENT_SIGNAL_VALUE_HI_ANGLE,
269*8975f5c5SAndroid Build Coastguard Worker                                       Uint64HighPart(kSignalValue),
270*8975f5c5SAndroid Build Coastguard Worker                                       EGL_SYNC_METAL_SHARED_EVENT_SIGNAL_VALUE_LO_ANGLE,
271*8975f5c5SAndroid Build Coastguard Worker                                       Uint64LowPart(kSignalValue),
272*8975f5c5SAndroid Build Coastguard Worker                                       EGL_NONE};
273*8975f5c5SAndroid Build Coastguard Worker
274*8975f5c5SAndroid Build Coastguard Worker    // We can ClientWait on this
275*8975f5c5SAndroid Build Coastguard Worker    EGLSync syncWithSharedEvent =
276*8975f5c5SAndroid Build Coastguard Worker        eglCreateSync(display, EGL_SYNC_METAL_SHARED_EVENT_ANGLE, syncAttribs);
277*8975f5c5SAndroid Build Coastguard Worker    EXPECT_NE(syncWithSharedEvent, EGL_NO_SYNC);
278*8975f5c5SAndroid Build Coastguard Worker
279*8975f5c5SAndroid Build Coastguard Worker    // Create work to do
280*8975f5c5SAndroid Build Coastguard Worker    glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
281*8975f5c5SAndroid Build Coastguard Worker    glClear(GL_COLOR_BUFFER_BIT);
282*8975f5c5SAndroid Build Coastguard Worker    glFlush();
283*8975f5c5SAndroid Build Coastguard Worker
284*8975f5c5SAndroid Build Coastguard Worker    // Wait for the draw to complete
285*8975f5c5SAndroid Build Coastguard Worker    glClear(GL_COLOR_BUFFER_BIT);
286*8975f5c5SAndroid Build Coastguard Worker
287*8975f5c5SAndroid Build Coastguard Worker    // Don't wait forever to make sure the test terminates
288*8975f5c5SAndroid Build Coastguard Worker    constexpr GLuint64 kTimeout = 1000000000;  // 1 second
289*8975f5c5SAndroid Build Coastguard Worker    EGLAttrib value             = 0;
290*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(EGL_CONDITION_SATISFIED, eglClientWaitSync(display, syncWithSharedEvent,
291*8975f5c5SAndroid Build Coastguard Worker                                                         EGL_SYNC_FLUSH_COMMANDS_BIT, kTimeout));
292*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttrib(display, syncWithSharedEvent, EGL_SYNC_STATUS, &value));
293*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(value, EGL_SIGNALED);
294*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(sharedEvent.signaledValue, kSignalValue);
295*8975f5c5SAndroid Build Coastguard Worker
296*8975f5c5SAndroid Build Coastguard Worker    // Clean up created objects.
297*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglDestroySync(display, syncWithSharedEvent));
298*8975f5c5SAndroid Build Coastguard Worker    sharedEvent = nil;
299*8975f5c5SAndroid Build Coastguard Worker}
300*8975f5c5SAndroid Build Coastguard Worker
301*8975f5c5SAndroid Build Coastguard Worker// Verify eglCopyMetalSharedEventANGLE for EGL_ANGLE_metal_shared_event_sync
302*8975f5c5SAndroid Build Coastguard WorkerTEST_P(EGLSyncTestMetalSharedEvent, AngleMetalSharedEventSync_CopyMetalSharedEventANGLE)
303*8975f5c5SAndroid Build Coastguard Worker{
304*8975f5c5SAndroid Build Coastguard Worker    ANGLE_SKIP_TEST_IF(!hasSyncMetalSharedEventExtension());
305*8975f5c5SAndroid Build Coastguard Worker
306*8975f5c5SAndroid Build Coastguard Worker    EGLDisplay display = getEGLWindow()->getDisplay();
307*8975f5c5SAndroid Build Coastguard Worker
308*8975f5c5SAndroid Build Coastguard Worker    // We can ClientWait on this
309*8975f5c5SAndroid Build Coastguard Worker    EGLSync syncWithGeneratedEvent =
310*8975f5c5SAndroid Build Coastguard Worker        eglCreateSyncKHR(display, EGL_SYNC_METAL_SHARED_EVENT_ANGLE, nullptr);
311*8975f5c5SAndroid Build Coastguard Worker    EXPECT_NE(syncWithGeneratedEvent, EGL_NO_SYNC_KHR);
312*8975f5c5SAndroid Build Coastguard Worker
313*8975f5c5SAndroid Build Coastguard Worker    id<MTLSharedEvent> sharedEvent =
314*8975f5c5SAndroid Build Coastguard Worker        sharedEventFromVoidPtr(eglCopyMetalSharedEventANGLE(display, syncWithGeneratedEvent));
315*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_SUCCESS();
316*8975f5c5SAndroid Build Coastguard Worker    EXPECT_GT([sharedEvent retainCount], 1ul);
317*8975f5c5SAndroid Build Coastguard Worker
318*8975f5c5SAndroid Build Coastguard Worker    glFinish();
319*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglDestroySync(display, syncWithGeneratedEvent));
320*8975f5c5SAndroid Build Coastguard Worker
321*8975f5c5SAndroid Build Coastguard Worker    // Clean up created objects.
322*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ([sharedEvent retainCount], 1ul);
323*8975f5c5SAndroid Build Coastguard Worker    [sharedEvent release];
324*8975f5c5SAndroid Build Coastguard Worker}
325*8975f5c5SAndroid Build Coastguard Worker
326*8975f5c5SAndroid Build Coastguard Worker// Verify WaitSync with EGL_ANGLE_metal_shared_event_sync
327*8975f5c5SAndroid Build Coastguard Worker// Simulate passing shared events across processes by passing across Contexts.
328*8975f5c5SAndroid Build Coastguard WorkerTEST_P(EGLSyncTestMetalSharedEvent, AngleMetalSharedEventSync_WaitSync)
329*8975f5c5SAndroid Build Coastguard Worker{
330*8975f5c5SAndroid Build Coastguard Worker    ANGLE_SKIP_TEST_IF(!hasSyncMetalSharedEventExtension());
331*8975f5c5SAndroid Build Coastguard Worker
332*8975f5c5SAndroid Build Coastguard Worker    id<MTLSharedEvent> sharedEvent = createMetalSharedEvent();
333*8975f5c5SAndroid Build Coastguard Worker
334*8975f5c5SAndroid Build Coastguard Worker    EGLAttrib value    = 0;
335*8975f5c5SAndroid Build Coastguard Worker    EGLDisplay display = getEGLWindow()->getDisplay();
336*8975f5c5SAndroid Build Coastguard Worker    EGLSurface surface = getEGLWindow()->getSurface();
337*8975f5c5SAndroid Build Coastguard Worker
338*8975f5c5SAndroid Build Coastguard Worker    /*- First Context ------------------------*/
339*8975f5c5SAndroid Build Coastguard Worker
340*8975f5c5SAndroid Build Coastguard Worker    EGLAttrib syncAttribs[] = {EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE,
341*8975f5c5SAndroid Build Coastguard Worker                               sharedEventAsAttrib(sharedEvent), EGL_NONE};
342*8975f5c5SAndroid Build Coastguard Worker    // We can ClientWait on this
343*8975f5c5SAndroid Build Coastguard Worker
344*8975f5c5SAndroid Build Coastguard Worker    EGLSync syncWithSharedEvent1 =
345*8975f5c5SAndroid Build Coastguard Worker        eglCreateSync(display, EGL_SYNC_METAL_SHARED_EVENT_ANGLE, syncAttribs);
346*8975f5c5SAndroid Build Coastguard Worker    EXPECT_NE(syncWithSharedEvent1, EGL_NO_SYNC);
347*8975f5c5SAndroid Build Coastguard Worker    if (syncWithSharedEvent1 == EGL_NO_SYNC)
348*8975f5c5SAndroid Build Coastguard Worker    {
349*8975f5c5SAndroid Build Coastguard Worker        // Unable to continue with test.
350*8975f5c5SAndroid Build Coastguard Worker        return;
351*8975f5c5SAndroid Build Coastguard Worker    }
352*8975f5c5SAndroid Build Coastguard Worker
353*8975f5c5SAndroid Build Coastguard Worker    // Create work to do
354*8975f5c5SAndroid Build Coastguard Worker    glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
355*8975f5c5SAndroid Build Coastguard Worker    glClear(GL_COLOR_BUFFER_BIT);
356*8975f5c5SAndroid Build Coastguard Worker    glFlush();
357*8975f5c5SAndroid Build Coastguard Worker
358*8975f5c5SAndroid Build Coastguard Worker    /*- Second Context ------------------------*/
359*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
360*8975f5c5SAndroid Build Coastguard Worker
361*8975f5c5SAndroid Build Coastguard Worker    EGLContext context2 = getEGLWindow()->createContext(EGL_NO_CONTEXT, nullptr);
362*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglMakeCurrent(display, surface, surface, context2));
363*8975f5c5SAndroid Build Coastguard Worker
364*8975f5c5SAndroid Build Coastguard Worker    EGLSync syncWithSharedEvent2 =
365*8975f5c5SAndroid Build Coastguard Worker        eglCreateSync(display, EGL_SYNC_METAL_SHARED_EVENT_ANGLE, syncAttribs);
366*8975f5c5SAndroid Build Coastguard Worker    EXPECT_NE(syncWithSharedEvent2, EGL_NO_SYNC);
367*8975f5c5SAndroid Build Coastguard Worker    if (syncWithSharedEvent2 == EGL_NO_SYNC)
368*8975f5c5SAndroid Build Coastguard Worker    {
369*8975f5c5SAndroid Build Coastguard Worker        // Unable to continue with test.
370*8975f5c5SAndroid Build Coastguard Worker        return;
371*8975f5c5SAndroid Build Coastguard Worker    }
372*8975f5c5SAndroid Build Coastguard Worker
373*8975f5c5SAndroid Build Coastguard Worker    // Second draw waits for first to complete. May already be signaled - ignore error.
374*8975f5c5SAndroid Build Coastguard Worker    if (eglWaitSync(display, syncWithSharedEvent2, 0) == EGL_TRUE)
375*8975f5c5SAndroid Build Coastguard Worker    {
376*8975f5c5SAndroid Build Coastguard Worker        // Create work to do
377*8975f5c5SAndroid Build Coastguard Worker        glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
378*8975f5c5SAndroid Build Coastguard Worker        glClear(GL_COLOR_BUFFER_BIT);
379*8975f5c5SAndroid Build Coastguard Worker        glFlush();
380*8975f5c5SAndroid Build Coastguard Worker    }
381*8975f5c5SAndroid Build Coastguard Worker
382*8975f5c5SAndroid Build Coastguard Worker    // Wait for second draw to complete
383*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(EGL_CONDITION_SATISFIED, eglClientWaitSync(display, syncWithSharedEvent2,
384*8975f5c5SAndroid Build Coastguard Worker                                                         EGL_SYNC_FLUSH_COMMANDS_BIT, 1000000000));
385*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttrib(display, syncWithSharedEvent2, EGL_SYNC_STATUS, &value));
386*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(value, EGL_SIGNALED);
387*8975f5c5SAndroid Build Coastguard Worker
388*8975f5c5SAndroid Build Coastguard Worker    // Reset to default context and surface.
389*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
390*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglMakeCurrent(display, surface, surface, getEGLWindow()->getContext()));
391*8975f5c5SAndroid Build Coastguard Worker
392*8975f5c5SAndroid Build Coastguard Worker    // Clean up created objects.
393*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglDestroySync(display, syncWithSharedEvent2));
394*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglDestroyContext(display, context2));
395*8975f5c5SAndroid Build Coastguard Worker
396*8975f5c5SAndroid Build Coastguard Worker    // Wait for first draw to complete
397*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(EGL_CONDITION_SATISFIED, eglClientWaitSync(display, syncWithSharedEvent1,
398*8975f5c5SAndroid Build Coastguard Worker                                                         EGL_SYNC_FLUSH_COMMANDS_BIT, 1000000000));
399*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttrib(display, syncWithSharedEvent1, EGL_SYNC_STATUS, &value));
400*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(value, EGL_SIGNALED);
401*8975f5c5SAndroid Build Coastguard Worker
402*8975f5c5SAndroid Build Coastguard Worker    // Clean up created objects.
403*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglDestroySync(display, syncWithSharedEvent1));
404*8975f5c5SAndroid Build Coastguard Worker    sharedEvent = nil;
405*8975f5c5SAndroid Build Coastguard Worker}
406*8975f5c5SAndroid Build Coastguard Worker
407*8975f5c5SAndroid Build Coastguard Worker// Verify WaitSync with EGL_ANGLE_metal_shared_event_sync
408*8975f5c5SAndroid Build Coastguard Worker// Simulate passing shared events across processes by passing across Contexts.
409*8975f5c5SAndroid Build Coastguard WorkerTEST_P(EGLSyncTestMetalSharedEvent, AngleMetalSharedEventSync_WaitSync_ExternallySignaled)
410*8975f5c5SAndroid Build Coastguard Worker{
411*8975f5c5SAndroid Build Coastguard Worker    ANGLE_SKIP_TEST_IF(!hasSyncMetalSharedEventExtension());
412*8975f5c5SAndroid Build Coastguard Worker
413*8975f5c5SAndroid Build Coastguard Worker    id<MTLSharedEvent> sharedEvent = createMetalSharedEvent();
414*8975f5c5SAndroid Build Coastguard Worker
415*8975f5c5SAndroid Build Coastguard Worker    EGLAttrib value    = 0;
416*8975f5c5SAndroid Build Coastguard Worker    EGLDisplay display = getEGLWindow()->getDisplay();
417*8975f5c5SAndroid Build Coastguard Worker
418*8975f5c5SAndroid Build Coastguard Worker    EGLAttrib syncAttribs[] = {EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE,
419*8975f5c5SAndroid Build Coastguard Worker                               sharedEventAsAttrib(sharedEvent), EGL_SYNC_CONDITION,
420*8975f5c5SAndroid Build Coastguard Worker                               EGL_SYNC_METAL_SHARED_EVENT_SIGNALED_ANGLE, EGL_NONE};
421*8975f5c5SAndroid Build Coastguard Worker
422*8975f5c5SAndroid Build Coastguard Worker    // We can ClientWait on this
423*8975f5c5SAndroid Build Coastguard Worker    EGLSync syncWithSharedEvent =
424*8975f5c5SAndroid Build Coastguard Worker        eglCreateSync(display, EGL_SYNC_METAL_SHARED_EVENT_ANGLE, syncAttribs);
425*8975f5c5SAndroid Build Coastguard Worker    EXPECT_NE(syncWithSharedEvent, EGL_NO_SYNC);
426*8975f5c5SAndroid Build Coastguard Worker    if (syncWithSharedEvent == EGL_NO_SYNC)
427*8975f5c5SAndroid Build Coastguard Worker    {
428*8975f5c5SAndroid Build Coastguard Worker        // Unable to continue with test.
429*8975f5c5SAndroid Build Coastguard Worker        return;
430*8975f5c5SAndroid Build Coastguard Worker    }
431*8975f5c5SAndroid Build Coastguard Worker
432*8975f5c5SAndroid Build Coastguard Worker    constexpr EGLAttrib kSentinelAttribValue = 123456789;
433*8975f5c5SAndroid Build Coastguard Worker    value                                    = kSentinelAttribValue;
434*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttrib(display, syncWithSharedEvent, EGL_SYNC_CONDITION, &value));
435*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(value, EGL_SYNC_METAL_SHARED_EVENT_SIGNALED_ANGLE);
436*8975f5c5SAndroid Build Coastguard Worker
437*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(EGL_TIMEOUT_EXPIRED,
438*8975f5c5SAndroid Build Coastguard Worker              eglClientWaitSync(display, syncWithSharedEvent, EGL_SYNC_FLUSH_COMMANDS_BIT, 0));
439*8975f5c5SAndroid Build Coastguard Worker
440*8975f5c5SAndroid Build Coastguard Worker    value = kSentinelAttribValue;
441*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttrib(display, syncWithSharedEvent, EGL_SYNC_STATUS, &value));
442*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(value, EGL_UNSIGNALED);
443*8975f5c5SAndroid Build Coastguard Worker
444*8975f5c5SAndroid Build Coastguard Worker    // Wait for previous work to complete before drawing
445*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglWaitSync(display, syncWithSharedEvent, 0));
446*8975f5c5SAndroid Build Coastguard Worker
447*8975f5c5SAndroid Build Coastguard Worker    // Create work to do
448*8975f5c5SAndroid Build Coastguard Worker    glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
449*8975f5c5SAndroid Build Coastguard Worker    glClear(GL_COLOR_BUFFER_BIT);
450*8975f5c5SAndroid Build Coastguard Worker    glFlush();
451*8975f5c5SAndroid Build Coastguard Worker
452*8975f5c5SAndroid Build Coastguard Worker    // After explicit flush, should still time out
453*8975f5c5SAndroid Build Coastguard Worker    // TODO(djg): flushing here causes a 5s stall in `CommandBuffer::wait`
454*8975f5c5SAndroid Build Coastguard Worker    // (mtl_command_buffer.mm:765) EXPECT_EQ(EGL_TIMEOUT_EXPIRED,
455*8975f5c5SAndroid Build Coastguard Worker    //           eglClientWaitSync(display, syncWithSharedEvent, EGL_SYNC_FLUSH_COMMANDS_BIT, 0));
456*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(EGL_TIMEOUT_EXPIRED, eglClientWaitSync(display, syncWithSharedEvent, 0, 0));
457*8975f5c5SAndroid Build Coastguard Worker
458*8975f5c5SAndroid Build Coastguard Worker    value = kSentinelAttribValue;
459*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttrib(display, syncWithSharedEvent, EGL_SYNC_STATUS, &value));
460*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(value, EGL_UNSIGNALED);
461*8975f5c5SAndroid Build Coastguard Worker
462*8975f5c5SAndroid Build Coastguard Worker    // Signal the MTLSharedEvent
463*8975f5c5SAndroid Build Coastguard Worker    sharedEvent.signaledValue += 1;
464*8975f5c5SAndroid Build Coastguard Worker
465*8975f5c5SAndroid Build Coastguard Worker    // Wait for draw to complete. This will be satisfied since the signalValue
466*8975f5c5SAndroid Build Coastguard Worker    // was incremented on sharedEvent.
467*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(EGL_CONDITION_SATISFIED,
468*8975f5c5SAndroid Build Coastguard Worker              eglClientWaitSync(display, syncWithSharedEvent, EGL_SYNC_FLUSH_COMMANDS_BIT, 0));
469*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglGetSyncAttrib(display, syncWithSharedEvent, EGL_SYNC_STATUS, &value));
470*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EQ(value, EGL_SIGNALED);
471*8975f5c5SAndroid Build Coastguard Worker
472*8975f5c5SAndroid Build Coastguard Worker    // Clean up created objects.
473*8975f5c5SAndroid Build Coastguard Worker    EXPECT_EGL_TRUE(eglDestroySync(display, syncWithSharedEvent));
474*8975f5c5SAndroid Build Coastguard Worker    sharedEvent = nil;
475*8975f5c5SAndroid Build Coastguard Worker}
476*8975f5c5SAndroid Build Coastguard Worker
477*8975f5c5SAndroid Build Coastguard WorkerANGLE_INSTANTIATE_TEST(EGLSyncTestMetalSharedEvent, ES2_METAL(), ES3_METAL());
478*8975f5c5SAndroid Build Coastguard Worker// This test suite is not instantiated on non-Metal backends and OSes.
479*8975f5c5SAndroid Build Coastguard WorkerGTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLSyncTestMetalSharedEvent);
480