diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index ffe8fbb7ad0..de01e106092 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -1080,6 +1080,28 @@ vk_shader_module_finish(void *_module) vk_object_base_finish(&module->base); } +VkShaderDescriptorSetAndBindingMappingInfoEXT * +radv_copy_descriptor_heap_mapping_info(const VkShaderDescriptorSetAndBindingMappingInfoEXT *mapping, void *mem_ctx) +{ + VkShaderDescriptorSetAndBindingMappingInfoEXT *new_mapping = + ralloc(mem_ctx, VkShaderDescriptorSetAndBindingMappingInfoEXT); + if (!new_mapping) + return NULL; + + new_mapping->sType = mapping->sType; + new_mapping->pNext = NULL; + new_mapping->mappingCount = mapping->mappingCount; + + const uint32_t mappings_size = sizeof(VkDescriptorSetAndBindingMappingEXT) * mapping->mappingCount; + new_mapping->pMappings = ralloc_size(mem_ctx, mappings_size); + if (!new_mapping->pMappings) + return NULL; + + memcpy((void *)new_mapping->pMappings, mapping->pMappings, mappings_size); + + return new_mapping; +} + VkPipelineShaderStageCreateInfo * radv_copy_shader_stage_create_info(struct radv_device *device, uint32_t stageCount, const VkPipelineShaderStageCreateInfo *pStages, void *mem_ctx) @@ -1150,6 +1172,17 @@ radv_copy_shader_stage_create_info(struct radv_device *device, uint32_t stageCou return NULL; new_stages[i].pNext = NULL; } + + const VkShaderDescriptorSetAndBindingMappingInfoEXT *mapping = + vk_find_struct_const(pStages[i].pNext, SHADER_DESCRIPTOR_SET_AND_BINDING_MAPPING_INFO_EXT); + if (mapping) { + VkShaderDescriptorSetAndBindingMappingInfoEXT *copied_mapping = + radv_copy_descriptor_heap_mapping_info(mapping, mem_ctx); + if (!copied_mapping) + return NULL; + + new_stages[i].pNext = copied_mapping; + } } return new_stages; diff --git a/src/amd/vulkan/radv_pipeline.h b/src/amd/vulkan/radv_pipeline.h index 3e8399ecbe8..e41b0f57ade 100644 --- a/src/amd/vulkan/radv_pipeline.h +++ b/src/amd/vulkan/radv_pipeline.h @@ -105,6 +105,9 @@ VkPipelineShaderStageCreateInfo *radv_copy_shader_stage_create_info(struct radv_ const VkPipelineShaderStageCreateInfo *pStages, void *mem_ctx); +VkShaderDescriptorSetAndBindingMappingInfoEXT * +radv_copy_descriptor_heap_mapping_info(const VkShaderDescriptorSetAndBindingMappingInfoEXT *mapping, void *mem_ctx); + void radv_pipeline_hash(const struct radv_device *device, const struct radv_pipeline_layout *pipeline_layout, blake3_hasher *ctx);