From 2c1c52a8c843a89954172639dbaa6d4a182c7baa Mon Sep 17 00:00:00 2001 From: Valentine Burley Date: Wed, 22 Oct 2025 16:31:35 +0200 Subject: [PATCH] tu: Fix indexing with variable descriptor count Based on RADV. The Vulkan spec says: "If bindingCount is zero or if this structure is not included in the pNext chain, the VkDescriptorBindingFlags for each descriptor set layout binding is considered to be zero. Otherwise, the descriptor set layout binding at VkDescriptorSetLayoutCreateInfo::pBindings[i] uses the flags in pBindingFlags[i]." Fixes dEQP-VK.api.maintenance3_check.* in VKCTS 1.4.4.0. Cc: mesa-stable Signed-off-by: Valentine Burley (cherry picked from commit 17e25b4983dc333d971c7b6eed4bdae741a9bf03) Part-of: --- .pick_status.json | 2 +- src/freedreno/vulkan/tu_descriptor_set.cc | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 355b7eb46ea..bf8e02c23b8 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1044,7 +1044,7 @@ "description": "tu: Fix indexing with variable descriptor count", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/freedreno/vulkan/tu_descriptor_set.cc b/src/freedreno/vulkan/tu_descriptor_set.cc index a35986cdaa1..ebd7e323e1b 100644 --- a/src/freedreno/vulkan/tu_descriptor_set.cc +++ b/src/freedreno/vulkan/tu_descriptor_set.cc @@ -208,8 +208,8 @@ tu_CreateDescriptorSetLayout( if (binding->descriptorType == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK) set_layout->has_inline_uniforms = true; - if (variable_flags && binding->binding < variable_flags->bindingCount && - (variable_flags->pBindingFlags[binding->binding] & + if (variable_flags && j < variable_flags->bindingCount && + (variable_flags->pBindingFlags[j] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT)) { assert(!binding->pImmutableSamplers); /* Terribly ill defined how many samplers are valid */ @@ -388,9 +388,9 @@ tu_GetDescriptorSetLayoutSupport( supported = false; } - if (variable_flags && binding->binding < variable_flags->bindingCount && + if (variable_flags && i < variable_flags->bindingCount && variable_count && - (variable_flags->pBindingFlags[binding->binding] & + (variable_flags->pBindingFlags[i] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT)) { variable_count->maxVariableDescriptorCount = MIN2(UINT32_MAX, max_count);