diff options
Diffstat (limited to 'src/deps/skia/include/gpu/GrBackendSemaphore.h')
-rw-r--r-- | src/deps/skia/include/gpu/GrBackendSemaphore.h | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/src/deps/skia/include/gpu/GrBackendSemaphore.h b/src/deps/skia/include/gpu/GrBackendSemaphore.h new file mode 100644 index 000000000..83d70adf0 --- /dev/null +++ b/src/deps/skia/include/gpu/GrBackendSemaphore.h @@ -0,0 +1,140 @@ +/* + * 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" + +#ifdef SK_METAL +#include "include/gpu/mtl/GrMtlTypes.h" +#endif + +#ifdef SK_VULKAN +#include "include/gpu/vk/GrVkTypes.h" +#endif + +#ifdef SK_DIRECT3D +#include "include/private/GrD3DTypesMinimal.h" +#endif + +/** + * 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 init* is called, which will set the appropriate GrBackend. + GrBackendSemaphore() + : fBackend(GrBackendApi::kOpenGL), fGLSync(nullptr), fIsInitialized(false) {} + +#ifdef SK_DIRECT3D + // We only need to specify these if Direct3D is enabled, because it requires special copy + // characteristics. + ~GrBackendSemaphore(); + GrBackendSemaphore(const GrBackendSemaphore&); + GrBackendSemaphore& operator=(const GrBackendSemaphore&); +#endif + + void initGL(GrGLsync sync) { + fBackend = GrBackendApi::kOpenGL; + fGLSync = sync; + fIsInitialized = true; + } + +#ifdef SK_VULKAN + void initVulkan(VkSemaphore semaphore) { + fBackend = GrBackendApi::kVulkan; + fVkSemaphore = semaphore; + + fIsInitialized = true; + } + + VkSemaphore vkSemaphore() const { + if (!fIsInitialized || GrBackendApi::kVulkan != fBackend) { + return VK_NULL_HANDLE; + } + return fVkSemaphore; + } +#endif + +#ifdef SK_METAL + // 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; + + fIsInitialized = true; + } + + 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; + } + +#endif + +#ifdef SK_DIRECT3D + void initDirect3D(const GrD3DFenceInfo& info) { + fBackend = GrBackendApi::kDirect3D; + this->assignD3DFenceInfo(info); + fIsInitialized = true; + } +#endif + + bool isInitialized() const { return fIsInitialized; } + + GrGLsync glSync() const { + if (!fIsInitialized || GrBackendApi::kOpenGL != fBackend) { + return nullptr; + } + return fGLSync; + } + + +#ifdef SK_DIRECT3D + bool getD3DFenceInfo(GrD3DFenceInfo* outInfo) const; +#endif + +private: +#ifdef SK_DIRECT3D + void assignD3DFenceInfo(const GrD3DFenceInfo& info); +#endif + + GrBackendApi fBackend; + union { + GrGLsync fGLSync; +#ifdef SK_VULKAN + VkSemaphore fVkSemaphore; +#endif +#ifdef SK_METAL + GrMTLHandle fMtlEvent; // Expected to be an id<MTLEvent> +#endif +#ifdef SK_DIRECT3D + GrD3DFenceInfo* fD3DFenceInfo; +#endif + }; +#ifdef SK_METAL + uint64_t fMtlValue; +#endif + bool fIsInitialized; +}; + +#endif |