aboutsummaryrefslogtreecommitdiff
path: root/src/deps/skia/include/gpu/GrBackendSurfaceMutableState.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/deps/skia/include/gpu/GrBackendSurfaceMutableState.h')
-rw-r--r--src/deps/skia/include/gpu/GrBackendSurfaceMutableState.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/deps/skia/include/gpu/GrBackendSurfaceMutableState.h b/src/deps/skia/include/gpu/GrBackendSurfaceMutableState.h
new file mode 100644
index 000000000..3a5f1d7fa
--- /dev/null
+++ b/src/deps/skia/include/gpu/GrBackendSurfaceMutableState.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef GrBackendSurfaceMutableState_DEFINED
+#define GrBackendSurfaceMutableState_DEFINED
+
+#include "include/gpu/GrTypes.h"
+
+#ifdef SK_VULKAN
+#include "include/private/GrVkTypesPriv.h"
+#endif
+
+/**
+ * Since Skia and clients can both modify gpu textures and their connected state, Skia needs a way
+ * for clients to inform us if they have modifiend any of this state. In order to not need setters
+ * for every single API and state, we use this class to be a generic wrapper around all the mutable
+ * state. This class is used for calls that inform Skia of these texture/image state changes by the
+ * client as well as for requesting state changes to be done by Skia. The backend specific state
+ * that is wrapped by this class are:
+ *
+ * Vulkan: VkImageLayout and QueueFamilyIndex
+ */
+class SK_API GrBackendSurfaceMutableState {
+public:
+ GrBackendSurfaceMutableState() {}
+
+#ifdef SK_VULKAN
+ GrBackendSurfaceMutableState(VkImageLayout layout, uint32_t queueFamilyIndex)
+ : fVkState(layout, queueFamilyIndex)
+ , fBackend(GrBackend::kVulkan)
+ , fIsValid(true) {}
+#endif
+
+ GrBackendSurfaceMutableState(const GrBackendSurfaceMutableState& that);
+ GrBackendSurfaceMutableState& operator=(const GrBackendSurfaceMutableState& that);
+
+#ifdef SK_VULKAN
+ // If this class is not Vulkan backed it will return value of VK_IMAGE_LAYOUT_UNDEFINED.
+ // Otherwise it will return the VkImageLayout.
+ VkImageLayout getVkImageLayout() const {
+ if (this->isValid() && fBackend != GrBackendApi::kVulkan) {
+ return VK_IMAGE_LAYOUT_UNDEFINED;
+ }
+ return fVkState.getImageLayout();
+ }
+
+ // If this class is not Vulkan backed it will return value of VK_QUEUE_FAMILY_IGNORED.
+ // Otherwise it will return the VkImageLayout.
+ uint32_t getQueueFamilyIndex() const {
+ if (this->isValid() && fBackend != GrBackendApi::kVulkan) {
+ return VK_QUEUE_FAMILY_IGNORED;
+ }
+ return fVkState.getQueueFamilyIndex();
+ }
+#endif
+
+ // Returns true if the backend mutable state has been initialized.
+ bool isValid() const { return fIsValid; }
+
+ GrBackendApi backend() const { return fBackend; }
+
+private:
+ friend class GrBackendSurfaceMutableStateImpl;
+ friend class GrVkGpu;
+
+#ifdef SK_VULKAN
+ void setVulkanState(VkImageLayout layout, uint32_t queueFamilyIndex) {
+ SkASSERT(!this->isValid() || fBackend == GrBackendApi::kVulkan);
+ fVkState.setImageLayout(layout);
+ fVkState.setQueueFamilyIndex(queueFamilyIndex);
+ fBackend = GrBackendApi::kVulkan;
+ fIsValid = true;
+ }
+#endif
+
+ union {
+ char fPlaceholder;
+#ifdef SK_VULKAN
+ GrVkSharedImageInfo fVkState;
+#endif
+ };
+
+ GrBackend fBackend = GrBackendApi::kMock;
+ bool fIsValid = false;
+};
+
+#endif