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