Set MVKPhysicalDeviceVulkan12FeaturesNoExt parameters based on support.
- shaderOutputViewportIndex requires multi-viewport
- shaderOutputLayer requires layered rendering
- subgroupBroadcastDynamicId requires SIMD support
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h
index 747b708..e7fda7e 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h
@@ -90,7 +90,7 @@
#pragma mark -
#pragma mark MVKPhysicalDevice
-/** VkPhysicalDeviceVulkan12Features entries that didn't originate in a prior extension. */
+/** VkPhysicalDeviceVulkan12Features entries that did not originate in a prior extension. */
typedef struct MVKPhysicalDeviceVulkan12FeaturesNoExt {
VkBool32 samplerMirrorClampToEdge;
VkBool32 drawIndirectCount;
@@ -803,7 +803,7 @@
VkPhysicalDevice##structName##Features##extnSfx _enabled##structName##Features;
#include "MVKDeviceFeatureStructs.def"
- /** Vulkan 1.2 features that did originate in a prior extension available and enabled. */
+ /** VkPhysicalDeviceVulkan12Features entries that did not originate in a prior extension available and enabled. */
MVKPhysicalDeviceVulkan12FeaturesNoExt _enabledVulkan12FeaturesNoExt;
/** Pointer to the Metal-specific features of the underlying physical device. */
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
index 0ba3eb9..b2d2be8 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
@@ -1988,15 +1988,6 @@
_features.drawIndirectFirstInstance = _metalFeatures.indirectDrawing && _metalFeatures.baseVertexInstanceDrawing;
- mvkClear(&_vulkan12FeaturesNoExt); // Start with everything cleared
- _vulkan12FeaturesNoExt.samplerMirrorClampToEdge = _metalFeatures.samplerMirrorClampToEdge;
- _vulkan12FeaturesNoExt.drawIndirectCount = false;
- _vulkan12FeaturesNoExt.descriptorIndexing = true;
- _vulkan12FeaturesNoExt.samplerFilterMinmax = false;
- _vulkan12FeaturesNoExt.shaderOutputViewportIndex = true;
- _vulkan12FeaturesNoExt.shaderOutputLayer = true;
- _vulkan12FeaturesNoExt.subgroupBroadcastDynamicId = true;
-
#if MVK_TVOS
_features.textureCompressionETC2 = true;
_features.textureCompressionASTC_LDR = true;
@@ -2094,6 +2085,17 @@
_features.textureCompressionASTC_LDR = true;
}
#endif
+
+ // Additional non-extension Vulkan 1.2 features.
+ mvkClear(&_vulkan12FeaturesNoExt); // Start with everything cleared
+ _vulkan12FeaturesNoExt.samplerMirrorClampToEdge = _metalFeatures.samplerMirrorClampToEdge;
+ _vulkan12FeaturesNoExt.drawIndirectCount = false;
+ _vulkan12FeaturesNoExt.descriptorIndexing = true;
+ _vulkan12FeaturesNoExt.samplerFilterMinmax = false;
+ _vulkan12FeaturesNoExt.shaderOutputViewportIndex = _features.multiViewport;
+ _vulkan12FeaturesNoExt.shaderOutputLayer = _metalFeatures.layeredRendering;
+ _vulkan12FeaturesNoExt.subgroupBroadcastDynamicId = _metalFeatures.simdPermute || _metalFeatures.quadPermute;
+
}