Fix test_vulkan_interop_buffer validation errors for missing vkUpdateDescriptorSets (#2606)

Fixes vulkan validation layer error:

Vulkan validation layer: Validation Error: [
VUID-vkCmdDispatch-None-08114 ] Object 0: handle = 0xb9181f0000000029,
type = VK_OBJECT_TYPE_DESCRIPTOR_SET; | MessageID = 0x30b6e267 |
vkCmdDispatch(): the descriptor VkDescriptorSet 0xb9181f0000000029[]
[Set 0, Binding 1, Index 1, variable "bufferPtrList"] is being used in
dispatch but has never been updated via vkUpdateDescriptorSets() or a
similar call. The Vulkan spec states: Descriptors in each bound
descriptor set, specified via vkCmdBindDescriptorSets, must be valid as
described by descriptor validity if they are statically used by the
VkPipeline bound to the pipeline bind point used by this command and the
bound VkPipeline was not created with
VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT
(https://vulkan.lunarg.com/doc/view/1.4.304.0/windows/1.4-extensions/vkspec.html#VUID-vkCmdDispatch-None-08114)
This commit is contained in:
Marcin Hajder
2026-03-03 17:39:56 +01:00
committed by GitHub
parent 5673883005
commit 1e9f2f6aa2
4 changed files with 93 additions and 41 deletions

View File

@@ -1121,7 +1121,8 @@ VulkanComputePipeline::VulkanComputePipeline(
VulkanComputePipeline::VulkanComputePipeline( VulkanComputePipeline::VulkanComputePipeline(
const VulkanDevice &device, const VulkanPipelineLayout &pipelineLayout, const VulkanDevice &device, const VulkanPipelineLayout &pipelineLayout,
const VulkanShaderModule &shaderModule, const std::string &entryFuncName) const VulkanShaderModule &shaderModule, const std::string &entryFuncName,
const VkSpecializationInfo *spec)
: VulkanPipeline(device) : VulkanPipeline(device)
{ {
VkPipelineShaderStageCreateInfo vkPipelineShaderStageCreateInfo = {}; VkPipelineShaderStageCreateInfo vkPipelineShaderStageCreateInfo = {};
@@ -1134,6 +1135,8 @@ VulkanComputePipeline::VulkanComputePipeline(
vkPipelineShaderStageCreateInfo.pName = entryFuncName.c_str(); vkPipelineShaderStageCreateInfo.pName = entryFuncName.c_str();
vkPipelineShaderStageCreateInfo.pSpecializationInfo = NULL; vkPipelineShaderStageCreateInfo.pSpecializationInfo = NULL;
if (spec) vkPipelineShaderStageCreateInfo.pSpecializationInfo = spec;
VkComputePipelineCreateInfo vkComputePipelineCreateInfo = {}; VkComputePipelineCreateInfo vkComputePipelineCreateInfo = {};
vkComputePipelineCreateInfo.sType = vkComputePipelineCreateInfo.sType =
VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;

View File

@@ -297,7 +297,8 @@ public:
VulkanComputePipeline(const VulkanDevice &device, VulkanComputePipeline(const VulkanDevice &device,
const VulkanPipelineLayout &pipelineLayout, const VulkanPipelineLayout &pipelineLayout,
const VulkanShaderModule &shaderModule, const VulkanShaderModule &shaderModule,
const std::string &entryFuncName = "main"); const std::string &entryFuncName = "main",
const VkSpecializationInfo *spec = nullptr);
virtual ~VulkanComputePipeline(); virtual ~VulkanComputePipeline();
VulkanPipelineBindPoint getPipelineBindPoint() const; VulkanPipelineBindPoint getPipelineBindPoint() const;
}; };

View File

@@ -3,7 +3,7 @@
#extension GL_EXT_shader_explicit_arithmetic_types_int8 : enable #extension GL_EXT_shader_explicit_arithmetic_types_int8 : enable
#extension GL_EXT_shader_explicit_arithmetic_types_int32 : enable #extension GL_EXT_shader_explicit_arithmetic_types_int32 : enable
#define MAX_BUFFERS 5 layout(constant_id = 0) const uint MAX_BUFFERS = 5;
layout(binding = 0) buffer Params layout(binding = 0) buffer Params
{ {

View File

@@ -128,12 +128,24 @@ int run_test_with_two_queue(
vkDescriptorSetLayoutBindingList.addBinding( vkDescriptorSetLayoutBindingList.addBinding(
0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1); 0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1);
vkDescriptorSetLayoutBindingList.addBinding( vkDescriptorSetLayoutBindingList.addBinding(
1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, MAX_BUFFERS); 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, numBuffers);
VulkanDescriptorSetLayout vkDescriptorSetLayout( VulkanDescriptorSetLayout vkDescriptorSetLayout(
vkDevice, vkDescriptorSetLayoutBindingList); vkDevice, vkDescriptorSetLayoutBindingList);
VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout); VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout);
VulkanComputePipeline vkComputePipeline(vkDevice, vkPipelineLayout,
vkBufferShaderModule); VkSpecializationMapEntry entry;
entry.constantID = 0;
entry.offset = 0;
entry.size = sizeof(uint32_t);
VkSpecializationInfo spec;
spec.mapEntryCount = 1;
spec.pMapEntries = &entry;
spec.dataSize = sizeof(uint32_t);
spec.pData = &numBuffers;
VulkanComputePipeline vkComputePipeline(
vkDevice, vkPipelineLayout, vkBufferShaderModule, "main", &spec);
VulkanDescriptorPool vkDescriptorPool(vkDevice, VulkanDescriptorPool vkDescriptorPool(vkDevice,
vkDescriptorSetLayoutBindingList); vkDescriptorSetLayoutBindingList);
@@ -461,12 +473,24 @@ int run_test_with_one_queue(
vkDescriptorSetLayoutBindingList.addBinding( vkDescriptorSetLayoutBindingList.addBinding(
0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1); 0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1);
vkDescriptorSetLayoutBindingList.addBinding( vkDescriptorSetLayoutBindingList.addBinding(
1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, MAX_BUFFERS); 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, numBuffers);
VulkanDescriptorSetLayout vkDescriptorSetLayout( VulkanDescriptorSetLayout vkDescriptorSetLayout(
vkDevice, vkDescriptorSetLayoutBindingList); vkDevice, vkDescriptorSetLayoutBindingList);
VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout); VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout);
VulkanComputePipeline vkComputePipeline(vkDevice, vkPipelineLayout,
vkBufferShaderModule); VkSpecializationMapEntry entry;
entry.constantID = 0;
entry.offset = 0;
entry.size = sizeof(uint32_t);
VkSpecializationInfo spec;
spec.mapEntryCount = 1;
spec.pMapEntries = &entry;
spec.dataSize = sizeof(uint32_t);
spec.pData = &numBuffers;
VulkanComputePipeline vkComputePipeline(
vkDevice, vkPipelineLayout, vkBufferShaderModule, "main", &spec);
VulkanDescriptorPool vkDescriptorPool(vkDevice, VulkanDescriptorPool vkDescriptorPool(vkDevice,
vkDescriptorSetLayoutBindingList); vkDescriptorSetLayoutBindingList);
@@ -764,12 +788,24 @@ int run_test_with_multi_import_same_ctx(
vkDescriptorSetLayoutBindingList.addBinding( vkDescriptorSetLayoutBindingList.addBinding(
0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1); 0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1);
vkDescriptorSetLayoutBindingList.addBinding( vkDescriptorSetLayoutBindingList.addBinding(
1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, MAX_BUFFERS); 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, numBuffers);
VulkanDescriptorSetLayout vkDescriptorSetLayout( VulkanDescriptorSetLayout vkDescriptorSetLayout(
vkDevice, vkDescriptorSetLayoutBindingList); vkDevice, vkDescriptorSetLayoutBindingList);
VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout); VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout);
VulkanComputePipeline vkComputePipeline(vkDevice, vkPipelineLayout,
vkBufferShaderModule); VkSpecializationMapEntry entry;
entry.constantID = 0;
entry.offset = 0;
entry.size = sizeof(uint32_t);
VkSpecializationInfo spec;
spec.mapEntryCount = 1;
spec.pMapEntries = &entry;
spec.dataSize = sizeof(uint32_t);
spec.pData = &numBuffers;
VulkanComputePipeline vkComputePipeline(
vkDevice, vkPipelineLayout, vkBufferShaderModule, "main", &spec);
VulkanDescriptorPool vkDescriptorPool(vkDevice, VulkanDescriptorPool vkDescriptorPool(vkDevice,
vkDescriptorSetLayoutBindingList); vkDescriptorSetLayoutBindingList);
@@ -1103,12 +1139,24 @@ int run_test_with_multi_import_diff_ctx(
vkDescriptorSetLayoutBindingList.addBinding( vkDescriptorSetLayoutBindingList.addBinding(
0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1); 0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1);
vkDescriptorSetLayoutBindingList.addBinding( vkDescriptorSetLayoutBindingList.addBinding(
1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, MAX_BUFFERS); 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, numBuffers);
VulkanDescriptorSetLayout vkDescriptorSetLayout( VulkanDescriptorSetLayout vkDescriptorSetLayout(
vkDevice, vkDescriptorSetLayoutBindingList); vkDevice, vkDescriptorSetLayoutBindingList);
VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout); VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout);
VulkanComputePipeline vkComputePipeline(vkDevice, vkPipelineLayout,
vkBufferShaderModule); VkSpecializationMapEntry entry;
entry.constantID = 0;
entry.offset = 0;
entry.size = sizeof(uint32_t);
VkSpecializationInfo spec;
spec.mapEntryCount = 1;
spec.pMapEntries = &entry;
spec.dataSize = sizeof(uint32_t);
spec.pData = &numBuffers;
VulkanComputePipeline vkComputePipeline(
vkDevice, vkPipelineLayout, vkBufferShaderModule, "main", &spec);
VulkanDescriptorPool vkDescriptorPool(vkDevice, VulkanDescriptorPool vkDescriptorPool(vkDevice,
vkDescriptorSetLayoutBindingList); vkDescriptorSetLayoutBindingList);