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 #ifdef SK_DIRECT3D 17 #include "include/gpu/d3d/GrD3DTypesMinimal.h" 18 #endif 19 20 /** 21 * Wrapper class for passing into and receiving data from Ganesh about a backend semaphore object. 22 */ 23 class GrBackendSemaphore { 24 public: 25 // For convenience we just set the backend here to OpenGL. The GrBackendSemaphore cannot be used 26 // until either initGL or initVulkan are called which will set the appropriate GrBackend. GrBackendSemaphore()27 GrBackendSemaphore() 28 : fBackend(GrBackendApi::kOpenGL), fGLSync(nullptr), fIsInitialized(false) {} 29 30 #ifdef SK_DIRECT3D 31 // We only need to specify these if Direct3D is enabled, because it requires special copy 32 // characteristics. 33 ~GrBackendSemaphore(); 34 GrBackendSemaphore(const GrBackendSemaphore&); 35 GrBackendSemaphore& operator=(const GrBackendSemaphore&); 36 #endif 37 initGL(GrGLsync sync)38 void initGL(GrGLsync sync) { 39 fBackend = GrBackendApi::kOpenGL; 40 fGLSync = sync; 41 fIsInitialized = true; 42 } 43 initVulkan(VkSemaphore semaphore)44 void initVulkan(VkSemaphore semaphore) { 45 fBackend = GrBackendApi::kVulkan; 46 fVkSemaphore = semaphore; 47 #ifdef SK_VULKAN 48 fIsInitialized = true; 49 #else 50 fIsInitialized = false; 51 #endif 52 } 53 54 // It is the creator's responsibility to ref the MTLEvent passed in here, via __bridge_retained. 55 // The other end will wrap this BackendSemaphore and take the ref, via __bridge_transfer. initMetal(GrMTLHandle event,uint64_t value)56 void initMetal(GrMTLHandle event, uint64_t value) { 57 fBackend = GrBackendApi::kMetal; 58 fMtlEvent = event; 59 fMtlValue = value; 60 #ifdef SK_METAL 61 fIsInitialized = true; 62 #else 63 fIsInitialized = false; 64 #endif 65 } 66 67 #ifdef SK_DIRECT3D initDirect3D(const GrD3DFenceInfo & info)68 void initDirect3D(const GrD3DFenceInfo& info) { 69 fBackend = GrBackendApi::kDirect3D; 70 this->assignD3DFenceInfo(info); 71 fIsInitialized = true; 72 } 73 #endif 74 isInitialized()75 bool isInitialized() const { return fIsInitialized; } 76 glSync()77 GrGLsync glSync() const { 78 if (!fIsInitialized || GrBackendApi::kOpenGL != fBackend) { 79 return nullptr; 80 } 81 return fGLSync; 82 } 83 vkSemaphore()84 VkSemaphore vkSemaphore() const { 85 if (!fIsInitialized || GrBackendApi::kVulkan != fBackend) { 86 return VK_NULL_HANDLE; 87 } 88 return fVkSemaphore; 89 } 90 mtlSemaphore()91 GrMTLHandle mtlSemaphore() const { 92 if (!fIsInitialized || GrBackendApi::kMetal != fBackend) { 93 return nullptr; 94 } 95 return fMtlEvent; 96 } 97 mtlValue()98 uint64_t mtlValue() const { 99 if (!fIsInitialized || GrBackendApi::kMetal != fBackend) { 100 return 0; 101 } 102 return fMtlValue; 103 } 104 105 #ifdef SK_DIRECT3D 106 bool getD3DFenceInfo(GrD3DFenceInfo* outInfo) const; 107 #endif 108 109 private: 110 #ifdef SK_DIRECT3D 111 void assignD3DFenceInfo(const GrD3DFenceInfo& info); 112 #endif 113 114 GrBackendApi fBackend; 115 union { 116 GrGLsync fGLSync; 117 VkSemaphore fVkSemaphore; 118 GrMTLHandle fMtlEvent; // Expected to be an id<MTLEvent> 119 #ifdef SK_DIRECT3D 120 GrD3DFenceInfo* fD3DFenceInfo; 121 #endif 122 }; 123 uint64_t fMtlValue; 124 bool fIsInitialized; 125 }; 126 127 #endif 128