1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef GrBackendSemaphore_DEFINED 9cb93a386Sopenharmony_ci#define GrBackendSemaphore_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/gpu/GrTypes.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#include "include/gpu/gl/GrGLTypes.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci#ifdef SK_METAL 16cb93a386Sopenharmony_ci#include "include/gpu/mtl/GrMtlTypes.h" 17cb93a386Sopenharmony_ci#endif 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ci#ifdef SK_VULKAN 20cb93a386Sopenharmony_ci#include "include/gpu/vk/GrVkTypes.h" 21cb93a386Sopenharmony_ci#endif 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci#ifdef SK_DIRECT3D 24cb93a386Sopenharmony_ci#include "include/private/GrD3DTypesMinimal.h" 25cb93a386Sopenharmony_ci#endif 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci/** 28cb93a386Sopenharmony_ci * Wrapper class for passing into and receiving data from Ganesh about a backend semaphore object. 29cb93a386Sopenharmony_ci */ 30cb93a386Sopenharmony_ciclass GrBackendSemaphore { 31cb93a386Sopenharmony_cipublic: 32cb93a386Sopenharmony_ci // For convenience we just set the backend here to OpenGL. The GrBackendSemaphore cannot be used 33cb93a386Sopenharmony_ci // until either init* is called, which will set the appropriate GrBackend. 34cb93a386Sopenharmony_ci GrBackendSemaphore() 35cb93a386Sopenharmony_ci : fBackend(GrBackendApi::kOpenGL), fGLSync(nullptr), fIsInitialized(false) {} 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci#ifdef SK_DIRECT3D 38cb93a386Sopenharmony_ci // We only need to specify these if Direct3D is enabled, because it requires special copy 39cb93a386Sopenharmony_ci // characteristics. 40cb93a386Sopenharmony_ci ~GrBackendSemaphore(); 41cb93a386Sopenharmony_ci GrBackendSemaphore(const GrBackendSemaphore&); 42cb93a386Sopenharmony_ci GrBackendSemaphore& operator=(const GrBackendSemaphore&); 43cb93a386Sopenharmony_ci#endif 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci void initGL(GrGLsync sync) { 46cb93a386Sopenharmony_ci fBackend = GrBackendApi::kOpenGL; 47cb93a386Sopenharmony_ci fGLSync = sync; 48cb93a386Sopenharmony_ci fIsInitialized = true; 49cb93a386Sopenharmony_ci } 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci#ifdef SK_VULKAN 52cb93a386Sopenharmony_ci void initVulkan(VkSemaphore semaphore) { 53cb93a386Sopenharmony_ci fBackend = GrBackendApi::kVulkan; 54cb93a386Sopenharmony_ci fVkSemaphore = semaphore; 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci fIsInitialized = true; 57cb93a386Sopenharmony_ci } 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci VkSemaphore vkSemaphore() const { 60cb93a386Sopenharmony_ci if (!fIsInitialized || GrBackendApi::kVulkan != fBackend) { 61cb93a386Sopenharmony_ci return VK_NULL_HANDLE; 62cb93a386Sopenharmony_ci } 63cb93a386Sopenharmony_ci return fVkSemaphore; 64cb93a386Sopenharmony_ci } 65cb93a386Sopenharmony_ci#endif 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci#ifdef SK_METAL 68cb93a386Sopenharmony_ci // It is the creator's responsibility to ref the MTLEvent passed in here, via __bridge_retained. 69cb93a386Sopenharmony_ci // The other end will wrap this BackendSemaphore and take the ref, via __bridge_transfer. 70cb93a386Sopenharmony_ci void initMetal(GrMTLHandle event, uint64_t value) { 71cb93a386Sopenharmony_ci fBackend = GrBackendApi::kMetal; 72cb93a386Sopenharmony_ci fMtlEvent = event; 73cb93a386Sopenharmony_ci fMtlValue = value; 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci fIsInitialized = true; 76cb93a386Sopenharmony_ci } 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ci GrMTLHandle mtlSemaphore() const { 79cb93a386Sopenharmony_ci if (!fIsInitialized || GrBackendApi::kMetal != fBackend) { 80cb93a386Sopenharmony_ci return nullptr; 81cb93a386Sopenharmony_ci } 82cb93a386Sopenharmony_ci return fMtlEvent; 83cb93a386Sopenharmony_ci } 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_ci uint64_t mtlValue() const { 86cb93a386Sopenharmony_ci if (!fIsInitialized || GrBackendApi::kMetal != fBackend) { 87cb93a386Sopenharmony_ci return 0; 88cb93a386Sopenharmony_ci } 89cb93a386Sopenharmony_ci return fMtlValue; 90cb93a386Sopenharmony_ci } 91cb93a386Sopenharmony_ci 92cb93a386Sopenharmony_ci#endif 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci#ifdef SK_DIRECT3D 95cb93a386Sopenharmony_ci void initDirect3D(const GrD3DFenceInfo& info) { 96cb93a386Sopenharmony_ci fBackend = GrBackendApi::kDirect3D; 97cb93a386Sopenharmony_ci this->assignD3DFenceInfo(info); 98cb93a386Sopenharmony_ci fIsInitialized = true; 99cb93a386Sopenharmony_ci } 100cb93a386Sopenharmony_ci#endif 101cb93a386Sopenharmony_ci 102cb93a386Sopenharmony_ci bool isInitialized() const { return fIsInitialized; } 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_ci GrGLsync glSync() const { 105cb93a386Sopenharmony_ci if (!fIsInitialized || GrBackendApi::kOpenGL != fBackend) { 106cb93a386Sopenharmony_ci return nullptr; 107cb93a386Sopenharmony_ci } 108cb93a386Sopenharmony_ci return fGLSync; 109cb93a386Sopenharmony_ci } 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci 112cb93a386Sopenharmony_ci#ifdef SK_DIRECT3D 113cb93a386Sopenharmony_ci bool getD3DFenceInfo(GrD3DFenceInfo* outInfo) const; 114cb93a386Sopenharmony_ci#endif 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_ciprivate: 117cb93a386Sopenharmony_ci#ifdef SK_DIRECT3D 118cb93a386Sopenharmony_ci void assignD3DFenceInfo(const GrD3DFenceInfo& info); 119cb93a386Sopenharmony_ci#endif 120cb93a386Sopenharmony_ci 121cb93a386Sopenharmony_ci GrBackendApi fBackend; 122cb93a386Sopenharmony_ci union { 123cb93a386Sopenharmony_ci GrGLsync fGLSync; 124cb93a386Sopenharmony_ci#ifdef SK_VULKAN 125cb93a386Sopenharmony_ci VkSemaphore fVkSemaphore; 126cb93a386Sopenharmony_ci#endif 127cb93a386Sopenharmony_ci#ifdef SK_METAL 128cb93a386Sopenharmony_ci GrMTLHandle fMtlEvent; // Expected to be an id<MTLEvent> 129cb93a386Sopenharmony_ci#endif 130cb93a386Sopenharmony_ci#ifdef SK_DIRECT3D 131cb93a386Sopenharmony_ci GrD3DFenceInfo* fD3DFenceInfo; 132cb93a386Sopenharmony_ci#endif 133cb93a386Sopenharmony_ci }; 134cb93a386Sopenharmony_ci#ifdef SK_METAL 135cb93a386Sopenharmony_ci uint64_t fMtlValue; 136cb93a386Sopenharmony_ci#endif 137cb93a386Sopenharmony_ci bool fIsInitialized; 138cb93a386Sopenharmony_ci}; 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_ci#endif 141