1 /* 2 * Copyright 2017 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrBackendSemaphore_DEFINED 9 #define GrBackendSemaphore_DEFINED 10 11 #include "include/gpu/GrTypes.h" 12 13 #include "include/gpu/gl/GrGLTypes.h" 14 #include "include/gpu/mtl/GrMtlTypes.h" 15 #include "include/gpu/vk/GrVkTypes.h" 16 17 /** 18 * Wrapper class for passing into and receiving data from Ganesh about a backend semaphore object. 19 */ 20 class GrBackendSemaphore { 21 public: 22 // For convenience we just set the backend here to OpenGL. The GrBackendSemaphore cannot be used 23 // until either initGL or initVulkan are called which will set the appropriate GrBackend. GrBackendSemaphore()24 GrBackendSemaphore() : fBackend(GrBackendApi::kOpenGL), fGLSync(0), fIsInitialized(false) {} 25 initGL(GrGLsync sync)26 void initGL(GrGLsync sync) { 27 fBackend = GrBackendApi::kOpenGL; 28 fGLSync = sync; 29 fIsInitialized = true; 30 } 31 initVulkan(VkSemaphore semaphore)32 void initVulkan(VkSemaphore semaphore) { 33 fBackend = GrBackendApi::kVulkan; 34 fVkSemaphore = semaphore; 35 #ifdef SK_VULKAN 36 fIsInitialized = true; 37 #else 38 fIsInitialized = false; 39 #endif 40 } 41 42 // It is the creator's responsibility to ref the MTLEvent passed in here, via __bridge_retained. 43 // The other end will wrap this BackendSemaphore and take the ref, via __bridge_transfer. initMetal(GrMTLHandle event,uint64_t value)44 void initMetal(GrMTLHandle event, uint64_t value) { 45 fBackend = GrBackendApi::kMetal; 46 fMtlEvent = event; 47 fMtlValue = value; 48 #ifdef SK_METAL 49 fIsInitialized = true; 50 #else 51 fIsInitialized = false; 52 #endif 53 } 54 isInitialized()55 bool isInitialized() const { return fIsInitialized; } 56 glSync()57 GrGLsync glSync() const { 58 if (!fIsInitialized || GrBackendApi::kOpenGL != fBackend) { 59 return 0; 60 } 61 return fGLSync; 62 } 63 vkSemaphore()64 VkSemaphore vkSemaphore() const { 65 if (!fIsInitialized || GrBackendApi::kVulkan != fBackend) { 66 return VK_NULL_HANDLE; 67 } 68 return fVkSemaphore; 69 } 70 mtlSemaphore()71 GrMTLHandle mtlSemaphore() const { 72 if (!fIsInitialized || GrBackendApi::kMetal != fBackend) { 73 return nullptr; 74 } 75 return fMtlEvent; 76 } 77 mtlValue()78 uint64_t mtlValue() const { 79 if (!fIsInitialized || GrBackendApi::kMetal != fBackend) { 80 return 0; 81 } 82 return fMtlValue; 83 } 84 85 private: 86 GrBackendApi fBackend; 87 union { 88 GrGLsync fGLSync; 89 VkSemaphore fVkSemaphore; 90 GrMTLHandle fMtlEvent; // Expected to be an id<MTLEvent> 91 }; 92 uint64_t fMtlValue; 93 bool fIsInitialized; 94 }; 95 96 #endif 97