Implement the vkEnumerateInstanceVersion() function.
We're Vulkan 1.1 now!
diff --git a/Docs/MoltenVK_Runtime_UserGuide.md b/Docs/MoltenVK_Runtime_UserGuide.md
index 199099f..b03c059 100644
--- a/Docs/MoltenVK_Runtime_UserGuide.md
+++ b/Docs/MoltenVK_Runtime_UserGuide.md
@@ -53,7 +53,7 @@
About **MoltenVK**
------------------
-**MoltenVK** is a layered implementation of [*Vulkan 1.0*](https://www.khronos.org/vulkan)
+**MoltenVK** is a layered implementation of [*Vulkan 1.1*](https://www.khronos.org/vulkan)
graphics and compute functionality, that is built on Apple's [*Metal*](https://developer.apple.com/metal)
graphics and compute framework on *macOS*, *iOS*, and *tvOS*. **MoltenVK** allows you to use *Vulkan*
graphics and compute functionality to develop modern, cross-platform, high-performance graphical games
diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md
index 54307db..68d6acd 100644
--- a/Docs/Whats_New.md
+++ b/Docs/Whats_New.md
@@ -18,6 +18,12 @@
Released TBD
+- Add support for Vulkan 1.1, including:
+ - The `vkEnumerateInstanceVersion()` function
+ - The `vkGetDeviceQueue2()` function
+ - Protected memory (non-functional)
+ - A feature struct for `VK_KHR_shader_draw_parameters`
+ - All extensions that were promoted to core in Vulkan 1.1
- Add support for extensions:
- `VK_KHR_external_fence` (non-functional groundwork for future extensions,
including support for GCD and Mach semaphores)
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm
index ed4896f..03560d1 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm
@@ -17,6 +17,7 @@
*/
#include "MVKDescriptorSet.h"
+#include "MVKInstance.h"
#include "MVKOSExtensions.h"
@@ -554,7 +555,8 @@
const VkDescriptorSetLayout* pSetLayouts,
VkDescriptorSet* pDescriptorSets) {
if (_allocatedSets.size() + count > _maxSets) {
- if (_device->_enabledExtensions.vk_KHR_maintenance1.enabled) {
+ if (_device->_enabledExtensions.vk_KHR_maintenance1.enabled ||
+ _device->getInstance()->getAPIVersion() >= VK_API_VERSION_1_1) {
return VK_ERROR_OUT_OF_POOL_MEMORY; // Failure is an acceptable test...don't log as error.
} else {
return reportError(VK_ERROR_INITIALIZATION_FAILED, "The maximum number of descriptor sets that can be allocated by this descriptor pool is %d.", _maxSets);
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h
index f6dd5bd..3ff1a95 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h
@@ -67,6 +67,9 @@
/** Returns a pointer to the Vulkan instance. */
MVKInstance* getInstance() override { return this; }
+ /** Returns the maximum version of Vulkan the application supports. */
+ inline uint32_t getAPIVersion() { return _appInfo.apiVersion; }
+
/** Returns a pointer to the layer manager. */
inline MVKLayerManager* getLayerManager() { return MVKLayerManager::globalManager(); }
diff --git a/MoltenVK/MoltenVK/Utility/MVKEnvironment.h b/MoltenVK/MoltenVK/Utility/MVKEnvironment.h
index 2e1c982..1b93fad 100644
--- a/MoltenVK/MoltenVK/Utility/MVKEnvironment.h
+++ b/MoltenVK/MoltenVK/Utility/MVKEnvironment.h
@@ -35,8 +35,8 @@
#endif
/** Macro to determine the Vulkan version supported by MoltenVK. */
-#define MVK_VULKAN_API_VERSION VK_MAKE_VERSION(VK_VERSION_MAJOR(VK_API_VERSION_1_0), \
- VK_VERSION_MINOR(VK_API_VERSION_1_0), \
+#define MVK_VULKAN_API_VERSION VK_MAKE_VERSION(VK_VERSION_MAJOR(VK_API_VERSION_1_1), \
+ VK_VERSION_MINOR(VK_API_VERSION_1_1), \
VK_HEADER_VERSION)
/**
diff --git a/MoltenVK/MoltenVK/Vulkan/vulkan.mm b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
index fd2a59f..b360b06 100644
--- a/MoltenVK/MoltenVK/Vulkan/vulkan.mm
+++ b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
@@ -281,6 +281,8 @@
func = (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
} else if (strcmp(pName, "vkEnumerateInstanceLayerProperties") == 0) {
func = (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
+ } else if (strcmp(pName, "vkEnumerateInstanceVersion") == 0) {
+ func = (PFN_vkVoidFunction)vkEnumerateInstanceVersion;
} else if (instance) {
MVKInstance* mvkInst = MVKInstance::getMVKInstance(instance);
func = mvkInst->getProcAddr(pName);
@@ -1905,6 +1907,15 @@
#pragma mark -
#pragma mark Vulkan 1.1 calls
+MVK_PUBLIC_SYMBOL VkResult vkEnumerateInstanceVersion(
+ uint32_t* pApiVersion) {
+
+ MVKTraceVulkanCallStart();
+ *pApiVersion = MVK_VULKAN_API_VERSION;
+ MVKTraceVulkanCallEnd();
+ return VK_SUCCESS;
+}
+
MVK_PUBLIC_SYMBOL VkResult vkEnumeratePhysicalDeviceGroups(
VkInstance instance,
uint32_t* pPhysicalDeviceGroupCount,