aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/vk/GrVkExtensions.h
diff options
context:
space:
mode:
authorGravatar jvanverth <jvanverth@google.com>2016-03-18 12:39:05 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-03-18 12:39:05 -0700
commitd2497f35ce9e9e70ab6c7acd82b212c80cb86d3a (patch)
treef66fe30164e8edc3a8979b0d105d23f45849c3f6 /src/gpu/vk/GrVkExtensions.h
parente820dfebbc652bfc4a653f07a29f5fe371eb019b (diff)
Enable extension support and debug layer.
Diffstat (limited to 'src/gpu/vk/GrVkExtensions.h')
-rw-r--r--src/gpu/vk/GrVkExtensions.h92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/gpu/vk/GrVkExtensions.h b/src/gpu/vk/GrVkExtensions.h
new file mode 100644
index 0000000000..d1d57e424a
--- /dev/null
+++ b/src/gpu/vk/GrVkExtensions.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef GrVkExtensions_DEFINED
+#define GrVkExtensions_DEFINED
+
+#include "../../private/SkTArray.h"
+#include "SkString.h"
+#include "vulkan/vulkan.h"
+
+/**
+ * This helper queries the current Vulkan context for its extensions and layers, remembers them,
+ * and can be queried. It supports queries for both instance and device extensions and layers.
+ */
+class SK_API GrVkExtensions {
+public:
+ GrVkExtensions() : fInitialized(false)
+ , fInstanceExtensionStrings(new SkTArray<SkString>)
+ , fDeviceExtensionStrings(new SkTArray<SkString>)
+ , fInstanceLayerStrings(new SkTArray<SkString>)
+ , fDeviceLayerStrings(new SkTArray<SkString>) {}
+
+ GrVkExtensions(const GrVkExtensions&);
+
+ GrVkExtensions& operator=(const GrVkExtensions&);
+
+ void swap(GrVkExtensions* that) {
+ fInstanceExtensionStrings.swap(that->fInstanceExtensionStrings);
+ fDeviceExtensionStrings.swap(that->fDeviceExtensionStrings);
+ fInstanceLayerStrings.swap(that->fInstanceLayerStrings);
+ fDeviceLayerStrings.swap(that->fDeviceLayerStrings);
+
+ SkTSwap(fInitialized, that->fInitialized);
+ }
+
+ /**
+ * We sometimes need to use this class without having yet created a GrVkInterface.
+ */
+ bool init(uint32_t specVersion,
+ PFN_vkEnumerateInstanceExtensionProperties enumerateInstanceExtensionProperties,
+ PFN_vkEnumerateDeviceExtensionProperties enumerateDeviceExtensionProperties,
+ PFN_vkEnumerateInstanceLayerProperties enumerateInstanceLayerProperties,
+ PFN_vkEnumerateDeviceLayerProperties enumerateDeviceLayerProperties);
+
+ bool isInitialized() const { return fInitialized; }
+
+ /**
+ * Queries whether an extension or layer is present. Will fail if init() has not been called.
+ */
+ bool hasInstanceExtension(const char[]) const;
+ bool hasDeviceExtension(const char[]) const;
+ bool hasInstanceLayer(const char[]) const;
+ bool hasDeviceLayer(const char[]) const;
+
+ /**
+ * Removes an extension or layer if present. Returns true if it was present before the call.
+ */
+ bool removeInstanceExtension(const char[]);
+ bool removeDeviceExtension(const char[]);
+ bool removeInstanceLayer(const char[]);
+ bool removeDeviceLayer(const char[]);
+
+ /**
+ * Adds an extension or layer to list
+ */
+ void addInstanceExtension(const char[]);
+ void addDeviceExtension(const char[]);
+ void addInstanceLayer(const char[]);
+ void addDeviceLayer(const char[]);
+
+ void reset() {
+ fInstanceExtensionStrings->reset();
+ fDeviceExtensionStrings->reset();
+ fInstanceLayerStrings->reset();
+ fDeviceLayerStrings->reset();
+ }
+
+ void print(const char* sep = "\n") const;
+
+private:
+ bool fInitialized;
+ SkAutoTDelete<SkTArray<SkString> > fInstanceExtensionStrings;
+ SkAutoTDelete<SkTArray<SkString> > fDeviceExtensionStrings;
+ SkAutoTDelete<SkTArray<SkString> > fInstanceLayerStrings;
+ SkAutoTDelete<SkTArray<SkString> > fDeviceLayerStrings;
+};
+
+#endif