aboutsummaryrefslogtreecommitdiff
path: root/src/deps/skia/include/gpu/GrBackendSemaphore.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/deps/skia/include/gpu/GrBackendSemaphore.h')
-rw-r--r--src/deps/skia/include/gpu/GrBackendSemaphore.h140
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