From 3f88fbb3725129083b8a5ce738f44cbf12263635 Mon Sep 17 00:00:00 2001 From: Chip Davis Date: Sun, 19 Nov 2023 18:58:15 -0800 Subject: [PATCH] MVKDevice: Clamp max per-set descriptor limit to minimum 1024. As required by the Vulkan spec. Fixes the CTS tests `dEQP-VK.api.info.vulkan1p2_limits_validation.khr_maintenance_3` and `dEQP-VK.api.maintenance3_check.maintenance3_properties`. --- MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm index 0dd865f23..975f6db4c 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm @@ -525,9 +525,9 @@ supportedProps11.maxMultiviewViewCount = 32; supportedProps11.maxMultiviewInstanceIndex = canUseInstancingForMultiview() ? uintMax / 32 : uintMax; supportedProps11.protectedNoFault = false; - supportedProps11.maxPerSetDescriptors = 4 * (_metalFeatures.maxPerStageBufferCount + + supportedProps11.maxPerSetDescriptors = max(4 * (_metalFeatures.maxPerStageBufferCount + _metalFeatures.maxPerStageTextureCount + - _metalFeatures.maxPerStageSamplerCount); + _metalFeatures.maxPerStageSamplerCount), 1024u); supportedProps11.maxMemoryAllocationSize = _metalFeatures.maxMTLBufferSize; // Create a SSOT for these Vulkan 1.2 properties, which can be queried via two mechanisms here. @@ -3499,7 +3499,9 @@ static uint32_t mvkGetEntryProperty(io_registry_entry_t entry, CFStringRef prope for (uint32_t i = 0; i < pCreateInfo->bindingCount; i++) { descriptorCount += pCreateInfo->pBindings[i].descriptorCount; } - pSupport->supported = (descriptorCount < ((_physicalDevice->_metalFeatures.maxPerStageBufferCount + _physicalDevice->_metalFeatures.maxPerStageTextureCount + _physicalDevice->_metalFeatures.maxPerStageSamplerCount) * 2)); + pSupport->supported = (descriptorCount < max(4 * (_physicalDevice->_metalFeatures.maxPerStageBufferCount + + _physicalDevice->_metalFeatures.maxPerStageTextureCount + + _physicalDevice->_metalFeatures.maxPerStageSamplerCount), 1024u)); // Check whether the layout has a variable-count descriptor, and if so, whether we can support it. for (auto* next = (VkBaseOutStructure*)pSupport->pNext; next; next = next->pNext) {