| /* | |
| * Copyright 2017 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef GrBackendSemaphore_DEFINED | |
| #define GrBackendSemaphore_DEFINED | |
| #include "include/gpu/GrTypes.h" | |
| #include "include/gpu/gl/GrGLTypes.h" | |
| #include "include/gpu/mtl/GrMtlTypes.h" | |
| #include "include/gpu/vk/GrVkTypes.h" | |
| /** | |
| * Wrapper class for passing into and receiving data from Ganesh about a backend semaphore object. | |
| */ | |
| class GrBackendSemaphore { | |
| public: | |
| // For convenience we just set the backend here to OpenGL. The GrBackendSemaphore cannot be used | |
| // until either initGL or initVulkan are called which will set the appropriate GrBackend. | |
| GrBackendSemaphore() : fBackend(GrBackendApi::kOpenGL), fGLSync(0), fIsInitialized(false) {} | |
| void initGL(GrGLsync sync) { | |
| fBackend = GrBackendApi::kOpenGL; | |
| fGLSync = sync; | |
| fIsInitialized = true; | |
| } | |
| void initVulkan(VkSemaphore semaphore) { | |
| fBackend = GrBackendApi::kVulkan; | |
| fVkSemaphore = semaphore; | |
| #ifdef SK_VULKAN | |
| fIsInitialized = true; | |
| #else | |
| fIsInitialized = false; | |
| #endif | |
| } | |
| // It is the creator's responsibility to ref the MTLEvent passed in here, via __bridge_retained. | |
| // The other end will wrap this BackendSemaphore and take the ref, via __bridge_transfer. | |
| void initMetal(GrMTLHandle event, uint64_t value) { | |
| fBackend = GrBackendApi::kMetal; | |
| fMtlEvent = event; | |
| fMtlValue = value; | |
| #ifdef SK_METAL | |
| fIsInitialized = true; | |
| #else | |
| fIsInitialized = false; | |
| #endif | |
| } | |
| bool isInitialized() const { return fIsInitialized; } | |
| GrGLsync glSync() const { | |
| if (!fIsInitialized || GrBackendApi::kOpenGL != fBackend) { | |
| return 0; | |
| } | |
| return fGLSync; | |
| } | |
| VkSemaphore vkSemaphore() const { | |
| if (!fIsInitialized || GrBackendApi::kVulkan != fBackend) { | |
| return VK_NULL_HANDLE; | |
| } | |
| return fVkSemaphore; | |
| } | |
| GrMTLHandle mtlSemaphore() const { | |
| if (!fIsInitialized || GrBackendApi::kMetal != fBackend) { | |
| return nullptr; | |
| } | |
| return fMtlEvent; | |
| } | |
| uint64_t mtlValue() const { | |
| if (!fIsInitialized || GrBackendApi::kMetal != fBackend) { | |
| return 0; | |
| } | |
| return fMtlValue; | |
| } | |
| private: | |
| GrBackendApi fBackend; | |
| union { | |
| GrGLsync fGLSync; | |
| VkSemaphore fVkSemaphore; | |
| GrMTLHandle fMtlEvent; // Expected to be an id<MTLEvent> | |
| }; | |
| uint64_t fMtlValue; | |
| bool fIsInitialized; | |
| }; | |
| #endif |