Expose descriptorIndexing support
Now that the prerequisites are met, this CL exposes the
descriptorIndexing feature, along with the equivalent
VK_EXT_descriptor_indexing extension.
Tests: dEQP-VK.descriptor_indexing.*
Bug: b/206633340
Change-Id: I098457ccc38a11adfb4964824ce8c5d7a5bb87b6
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/67811
Presubmit-Ready: Alexis Hétu <sugoi@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
Commit-Queue: Alexis Hétu <sugoi@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Vulkan/VkConfig.hpp b/src/Vulkan/VkConfig.hpp
index 0ee2800..4884986 100644
--- a/src/Vulkan/VkConfig.hpp
+++ b/src/Vulkan/VkConfig.hpp
@@ -74,6 +74,7 @@
constexpr uint32_t MAX_BOUND_DESCRIPTOR_SETS = 4;
constexpr uint32_t MAX_VERTEX_INPUT_BINDINGS = 16;
constexpr uint32_t MAX_PUSH_CONSTANT_SIZE = 128;
+constexpr uint32_t MAX_UPDATE_AFTER_BIND_DESCRIPTORS = 500000;
constexpr uint32_t MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC = 8;
constexpr uint32_t MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC = 4;
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp
index 59eef6b..27aec3c 100644
--- a/src/Vulkan/VkPhysicalDevice.cpp
+++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -254,8 +254,8 @@
features->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE;
features->shaderStorageTexelBufferArrayNonUniformIndexing = VK_TRUE;
features->descriptorBindingUniformBufferUpdateAfterBind = VK_FALSE;
- features->descriptorBindingSampledImageUpdateAfterBind = VK_FALSE;
- features->descriptorBindingStorageImageUpdateAfterBind = VK_FALSE;
+ features->descriptorBindingSampledImageUpdateAfterBind = VK_TRUE;
+ features->descriptorBindingStorageImageUpdateAfterBind = VK_TRUE;
features->descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE;
features->descriptorBindingUniformTexelBufferUpdateAfterBind = VK_TRUE;
features->descriptorBindingStorageTexelBufferUpdateAfterBind = VK_TRUE;
@@ -384,7 +384,7 @@
getPhysicalDevice8BitStorageFeaturesKHR(features);
getPhysicalDeviceShaderAtomicInt64Features(features);
getPhysicalDeviceShaderFloat16Int8Features(features);
- features->descriptorIndexing = VK_FALSE;
+ features->descriptorIndexing = VK_TRUE;
getPhysicalDeviceDescriptorIndexingFeatures(features);
features->samplerFilterMinmax = VK_FALSE;
getPhysicalDeviceScalarBlockLayoutFeatures(features);
@@ -1166,7 +1166,10 @@
// the corresponding non-UpdateAfterBind limit."
const VkPhysicalDeviceLimits &limits = PhysicalDevice::getLimits();
- properties->maxUpdateAfterBindDescriptorsInAllPools = 0;
+ // Limits from:
+ // https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#limits-minmax
+ // Table 53. Required Limits
+ properties->maxUpdateAfterBindDescriptorsInAllPools = vk::MAX_UPDATE_AFTER_BIND_DESCRIPTORS;
properties->shaderUniformBufferArrayNonUniformIndexingNative = VK_FALSE;
properties->shaderSampledImageArrayNonUniformIndexingNative = VK_FALSE;
properties->shaderStorageBufferArrayNonUniformIndexingNative = VK_FALSE;
@@ -1174,20 +1177,20 @@
properties->shaderInputAttachmentArrayNonUniformIndexingNative = VK_FALSE;
properties->robustBufferAccessUpdateAfterBind = VK_FALSE;
properties->quadDivergentImplicitLod = VK_FALSE;
- properties->maxPerStageDescriptorUpdateAfterBindSamplers = limits.maxPerStageDescriptorSamplers;
+ properties->maxPerStageDescriptorUpdateAfterBindSamplers = vk::MAX_UPDATE_AFTER_BIND_DESCRIPTORS;
properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers = limits.maxPerStageDescriptorUniformBuffers;
- properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers = limits.maxPerStageDescriptorStorageBuffers;
- properties->maxPerStageDescriptorUpdateAfterBindSampledImages = limits.maxPerStageDescriptorSampledImages;
- properties->maxPerStageDescriptorUpdateAfterBindStorageImages = limits.maxPerStageDescriptorStorageImages;
+ properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers = vk::MAX_UPDATE_AFTER_BIND_DESCRIPTORS;
+ properties->maxPerStageDescriptorUpdateAfterBindSampledImages = vk::MAX_UPDATE_AFTER_BIND_DESCRIPTORS;
+ properties->maxPerStageDescriptorUpdateAfterBindStorageImages = vk::MAX_UPDATE_AFTER_BIND_DESCRIPTORS;
properties->maxPerStageDescriptorUpdateAfterBindInputAttachments = limits.maxPerStageDescriptorInputAttachments;
- properties->maxPerStageUpdateAfterBindResources = limits.maxPerStageResources;
- properties->maxDescriptorSetUpdateAfterBindSamplers = limits.maxDescriptorSetSamplers;
+ properties->maxPerStageUpdateAfterBindResources = vk::MAX_UPDATE_AFTER_BIND_DESCRIPTORS;
+ properties->maxDescriptorSetUpdateAfterBindSamplers = vk::MAX_UPDATE_AFTER_BIND_DESCRIPTORS;
properties->maxDescriptorSetUpdateAfterBindUniformBuffers = limits.maxDescriptorSetUniformBuffers;
properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = limits.maxDescriptorSetUniformBuffersDynamic;
- properties->maxDescriptorSetUpdateAfterBindStorageBuffers = limits.maxDescriptorSetStorageBuffers;
+ properties->maxDescriptorSetUpdateAfterBindStorageBuffers = vk::MAX_UPDATE_AFTER_BIND_DESCRIPTORS;
properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = limits.maxDescriptorSetStorageBuffersDynamic;
- properties->maxDescriptorSetUpdateAfterBindSampledImages = limits.maxDescriptorSetSampledImages;
- properties->maxDescriptorSetUpdateAfterBindStorageImages = limits.maxDescriptorSetStorageImages;
+ properties->maxDescriptorSetUpdateAfterBindSampledImages = vk::MAX_UPDATE_AFTER_BIND_DESCRIPTORS;
+ properties->maxDescriptorSetUpdateAfterBindStorageImages = vk::MAX_UPDATE_AFTER_BIND_DESCRIPTORS;
properties->maxDescriptorSetUpdateAfterBindInputAttachments = limits.maxDescriptorSetInputAttachments;
}
@@ -1589,6 +1592,32 @@
return CheckFeature(requested, supported, primitiveTopologyListRestart) &&
CheckFeature(requested, supported, primitiveTopologyPatchListRestart);
}
+
+bool PhysicalDevice::hasExtendedFeatures(const VkPhysicalDeviceDescriptorIndexingFeatures *requested) const
+{
+ auto supported = getSupportedFeatures(requested);
+
+ return CheckFeature(requested, supported, shaderInputAttachmentArrayDynamicIndexing) &&
+ CheckFeature(requested, supported, shaderUniformTexelBufferArrayDynamicIndexing) &&
+ CheckFeature(requested, supported, shaderStorageTexelBufferArrayDynamicIndexing) &&
+ CheckFeature(requested, supported, shaderUniformBufferArrayNonUniformIndexing) &&
+ CheckFeature(requested, supported, shaderSampledImageArrayNonUniformIndexing) &&
+ CheckFeature(requested, supported, shaderStorageBufferArrayNonUniformIndexing) &&
+ CheckFeature(requested, supported, shaderStorageImageArrayNonUniformIndexing) &&
+ CheckFeature(requested, supported, shaderInputAttachmentArrayNonUniformIndexing) &&
+ CheckFeature(requested, supported, shaderUniformTexelBufferArrayNonUniformIndexing) &&
+ CheckFeature(requested, supported, shaderStorageTexelBufferArrayNonUniformIndexing) &&
+ CheckFeature(requested, supported, descriptorBindingUniformBufferUpdateAfterBind) &&
+ CheckFeature(requested, supported, descriptorBindingSampledImageUpdateAfterBind) &&
+ CheckFeature(requested, supported, descriptorBindingStorageImageUpdateAfterBind) &&
+ CheckFeature(requested, supported, descriptorBindingStorageBufferUpdateAfterBind) &&
+ CheckFeature(requested, supported, descriptorBindingUniformTexelBufferUpdateAfterBind) &&
+ CheckFeature(requested, supported, descriptorBindingStorageTexelBufferUpdateAfterBind) &&
+ CheckFeature(requested, supported, descriptorBindingUpdateUnusedWhilePending) &&
+ CheckFeature(requested, supported, descriptorBindingPartiallyBound) &&
+ CheckFeature(requested, supported, descriptorBindingVariableDescriptorCount) &&
+ CheckFeature(requested, supported, runtimeDescriptorArray);
+}
#undef CheckFeature
void PhysicalDevice::GetFormatProperties(Format format, VkFormatProperties *pFormatProperties)
diff --git a/src/Vulkan/VkPhysicalDevice.hpp b/src/Vulkan/VkPhysicalDevice.hpp
index 4791f50..21a519d 100644
--- a/src/Vulkan/VkPhysicalDevice.hpp
+++ b/src/Vulkan/VkPhysicalDevice.hpp
@@ -55,6 +55,7 @@
bool hasExtendedFeatures(const VkPhysicalDeviceShaderIntegerDotProductFeatures *features) const;
bool hasExtendedFeatures(const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures *requested) const;
bool hasExtendedFeatures(const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *requested) const;
+ bool hasExtendedFeatures(const VkPhysicalDeviceDescriptorIndexingFeatures *requested) const;
const VkPhysicalDeviceProperties &getProperties() const;
void getProperties(VkPhysicalDeviceIDProperties *properties) const;
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index b6c7e572..14af446 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -409,6 +409,7 @@
{ { VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME, VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION } },
{ { VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_SPEC_VERSION } },
{ { VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME, VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_SPEC_VERSION } },
+ { { VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION } },
{ { VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME, VK_EXT_DEPTH_CLIP_ENABLE_SPEC_VERSION } },
{ { VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, VK_EXT_CUSTOM_BORDER_COLOR_SPEC_VERSION } },
{ { VK_EXT_LOAD_STORE_OP_NONE_EXTENSION_NAME, VK_EXT_LOAD_STORE_OP_NONE_SPEC_VERSION } },
@@ -1053,6 +1054,16 @@
}
}
break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
+ {
+ const auto *descriptorIndexingFeatures = reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures *>(extensionCreateInfo);
+ bool hasFeatures = vk::Cast(physicalDevice)->hasExtendedFeatures(descriptorIndexingFeatures);
+ if(!hasFeatures)
+ {
+ return VK_ERROR_FEATURE_NOT_PRESENT;
+ }
+ }
+ break;
// These structs are supported, but no behavior changes based on their feature bools
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: