Implement Direct3D semaphores
Change-Id: Iadfa14965bbe11cfea556ade5d46e264f0ace61a
Bug: skia:9935
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/298752
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/GrBackendSemaphore.cpp b/src/gpu/GrBackendSemaphore.cpp
new file mode 100644
index 0000000..ccbff36
--- /dev/null
+++ b/src/gpu/GrBackendSemaphore.cpp
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "include/gpu/GrBackendSemaphore.h"
+
+#ifdef SK_DIRECT3D
+#include "include/gpu/d3d/GrD3DTypes.h"
+
+GrBackendSemaphore::~GrBackendSemaphore() {
+ if (fIsInitialized && GrBackendApi::kDirect3D == fBackend) {
+ delete fD3DFenceInfo;
+ fD3DFenceInfo = nullptr;
+ fIsInitialized = false;
+ }
+}
+
+void GrBackendSemaphore::assignD3DFenceInfo(const GrD3DFenceInfo& info) {
+ SkASSERT(GrBackendApi::kDirect3D == fBackend);
+ if (fIsInitialized) {
+ *fD3DFenceInfo = info;
+ } else {
+ fD3DFenceInfo = new GrD3DFenceInfo(info);
+ }
+}
+
+bool GrBackendSemaphore::getD3DFenceInfo(GrD3DFenceInfo* outInfo) const {
+ if (fIsInitialized && GrBackendApi::kDirect3D == fBackend) {
+ *outInfo = *fD3DFenceInfo;
+ return true;
+ }
+ return false;
+}
+
+GrBackendSemaphore::GrBackendSemaphore(const GrBackendSemaphore& that) {
+ fIsInitialized = false;
+ *this = that;
+}
+
+GrBackendSemaphore& GrBackendSemaphore::operator=(const GrBackendSemaphore& that) {
+ SkASSERT(!fIsInitialized || fBackend == that.fBackend);
+ fBackend = that.fBackend;
+ switch (that.fBackend) {
+#ifdef SK_GL
+ case GrBackendApi::kOpenGL:
+ fGLSync = that.fGLSync;
+ break;
+#endif
+#ifdef SK_VULKAN
+ case GrBackendApi::kVulkan:
+ fVkSemaphore = that.fVkSemaphore;
+ break;
+#endif
+#ifdef SK_METAL
+ case GrBackendApi::kMetal:
+ fMtlEvent = that.fMtlEvent;
+ fMtlValue = that.fMtlValue;
+ break;
+#endif
+ case GrBackendApi::kDirect3D:
+ this->assignD3DFenceInfo(*that.fD3DFenceInfo);
+ break;
+ default:
+ SK_ABORT("Unknown GrBackend");
+ }
+ fIsInitialized = true;
+ return *this;
+}
+
+#endif // SK_DIRECT3D