From edb198e0b12ed45b81a607cb3f92fd12078c8cdb Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 7 Apr 2023 14:20:06 +0200 Subject: [PATCH] radv: create a helper for copying VkPipelineShaderStageCreateInfo Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_pipeline.c | 83 +++++++++++++++++++++++++++++++++++++++ src/amd/vulkan/radv_pipeline_rt.c | 75 ++--------------------------------- src/amd/vulkan/radv_private.h | 4 ++ 3 files changed, 90 insertions(+), 72 deletions(-) diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 12468b4..a91691e 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -5668,3 +5668,86 @@ radv_GetPipelineExecutableInternalRepresentationsKHR( return result; } + +static void +vk_shader_module_finish(void *_module) +{ + struct vk_shader_module *module = _module; + vk_object_base_finish(&module->base); +} + +VkPipelineShaderStageCreateInfo * +radv_copy_shader_stage_create_info(struct radv_device *device, uint32_t stageCount, + const VkPipelineShaderStageCreateInfo *pStages, void *mem_ctx) +{ + VkPipelineShaderStageCreateInfo *new_stages; + + size_t size = sizeof(VkPipelineShaderStageCreateInfo) * stageCount; + new_stages = ralloc_size(mem_ctx, size); + if (!new_stages) + return NULL; + + memcpy(new_stages, pStages, size); + + for (uint32_t i = 0; i < stageCount; i++) { + RADV_FROM_HANDLE(vk_shader_module, module, new_stages[i].module); + + const VkShaderModuleCreateInfo *minfo = + vk_find_struct_const(pStages[i].pNext, SHADER_MODULE_CREATE_INFO); + + if (module) { + struct vk_shader_module *new_module = + ralloc_size(mem_ctx, sizeof(struct vk_shader_module) + module->size); + if (!new_module) + return NULL; + + ralloc_set_destructor(new_module, vk_shader_module_finish); + vk_object_base_init(&device->vk, &new_module->base, VK_OBJECT_TYPE_SHADER_MODULE); + + new_module->nir = NULL; + memcpy(new_module->sha1, module->sha1, sizeof(module->sha1)); + new_module->size = module->size; + memcpy(new_module->data, module->data, module->size); + + module = new_module; + } else if (minfo) { + module = ralloc_size(mem_ctx, sizeof(struct vk_shader_module) + minfo->codeSize); + if (!module) + return NULL; + + vk_shader_module_init(&device->vk, module, minfo); + } + + if (module) { + const VkSpecializationInfo *spec = new_stages[i].pSpecializationInfo; + if (spec) { + VkSpecializationInfo *new_spec = ralloc(mem_ctx, VkSpecializationInfo); + if (!new_spec) + return NULL; + + new_spec->mapEntryCount = spec->mapEntryCount; + uint32_t map_entries_size = sizeof(VkSpecializationMapEntry) * spec->mapEntryCount; + new_spec->pMapEntries = ralloc_size(mem_ctx, map_entries_size); + if (!new_spec->pMapEntries) + return NULL; + memcpy((void *)new_spec->pMapEntries, spec->pMapEntries, map_entries_size); + + new_spec->dataSize = spec->dataSize; + new_spec->pData = ralloc_size(mem_ctx, spec->dataSize); + if (!new_spec->pData) + return NULL; + memcpy((void *)new_spec->pData, spec->pData, spec->dataSize); + + new_stages[i].pSpecializationInfo = new_spec; + } + + new_stages[i].module = vk_shader_module_to_handle(module); + new_stages[i].pName = ralloc_strdup(mem_ctx, new_stages[i].pName); + if (!new_stages[i].pName) + return NULL; + new_stages[i].pNext = NULL; + } + } + + return new_stages; +} diff --git a/src/amd/vulkan/radv_pipeline_rt.c b/src/amd/vulkan/radv_pipeline_rt.c index 038c7dd..fdd54d5 100644 --- a/src/amd/vulkan/radv_pipeline_rt.c +++ b/src/amd/vulkan/radv_pipeline_rt.c @@ -201,13 +201,6 @@ radv_create_merged_rt_create_info(const VkRayTracingPipelineCreateInfoKHR *pCrea return local_create_info; } -static void -vk_shader_module_finish(void *_module) -{ - struct vk_shader_module *module = _module; - vk_object_base_finish(&module->base); -} - static VkResult radv_rt_pipeline_compile(struct radv_ray_tracing_pipeline *pipeline, struct radv_pipeline_layout *pipeline_layout, struct radv_device *device, @@ -364,74 +357,12 @@ radv_rt_pipeline_library_create(VkDevice _device, VkPipelineCache _cache, goto fail; if (local_create_info.stageCount) { - pipeline->stage_count = local_create_info.stageCount; - - size_t size = sizeof(VkPipelineShaderStageCreateInfo) * local_create_info.stageCount; - pipeline->stages = ralloc_size(pipeline->ctx, size); + pipeline->stages = radv_copy_shader_stage_create_info( + device, local_create_info.stageCount, local_create_info.pStages, pipeline->ctx); if (!pipeline->stages) goto fail; - memcpy(pipeline->stages, local_create_info.pStages, size); - - for (uint32_t i = 0; i < local_create_info.stageCount; i++) { - RADV_FROM_HANDLE(vk_shader_module, module, pipeline->stages[i].module); - - const VkShaderModuleCreateInfo *minfo = - vk_find_struct_const(local_create_info.pStages[i].pNext, SHADER_MODULE_CREATE_INFO); - - if (module) { - struct vk_shader_module *new_module = - ralloc_size(pipeline->ctx, sizeof(struct vk_shader_module) + module->size); - if (!new_module) - goto fail; - - ralloc_set_destructor(new_module, vk_shader_module_finish); - vk_object_base_init(&device->vk, &new_module->base, VK_OBJECT_TYPE_SHADER_MODULE); - - new_module->nir = NULL; - memcpy(new_module->sha1, module->sha1, sizeof(module->sha1)); - new_module->size = module->size; - memcpy(new_module->data, module->data, module->size); - - module = new_module; - } else if (minfo) { - module = ralloc_size(pipeline->ctx, sizeof(struct vk_shader_module) + minfo->codeSize); - if (!module) - goto fail; - - vk_shader_module_init(&device->vk, module, minfo); - } - - if (module) { - const VkSpecializationInfo *spec = pipeline->stages[i].pSpecializationInfo; - if (spec) { - VkSpecializationInfo *new_spec = ralloc(pipeline->ctx, VkSpecializationInfo); - if (!new_spec) - goto fail; - - new_spec->mapEntryCount = spec->mapEntryCount; - uint32_t map_entries_size = sizeof(VkSpecializationMapEntry) * spec->mapEntryCount; - new_spec->pMapEntries = ralloc_size(pipeline->ctx, map_entries_size); - if (!new_spec->pMapEntries) - goto fail; - memcpy((void *)new_spec->pMapEntries, spec->pMapEntries, map_entries_size); - - new_spec->dataSize = spec->dataSize; - new_spec->pData = ralloc_size(pipeline->ctx, spec->dataSize); - if (!new_spec->pData) - goto fail; - memcpy((void *)new_spec->pData, spec->pData, spec->dataSize); - - pipeline->stages[i].pSpecializationInfo = new_spec; - } - - pipeline->stages[i].module = vk_shader_module_to_handle(module); - pipeline->stages[i].pName = ralloc_strdup(pipeline->ctx, pipeline->stages[i].pName); - if (!pipeline->stages[i].pName) - goto fail; - pipeline->stages[i].pNext = NULL; - } - } + pipeline->stage_count = local_create_info.stageCount; } if (local_create_info.groupCount) { diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 3abdced..c263e0e 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -2443,6 +2443,10 @@ bool radv_pipeline_capture_shaders(const struct radv_device *device, VkPipelineC bool radv_pipeline_capture_shader_stats(const struct radv_device *device, VkPipelineCreateFlags flags); +VkPipelineShaderStageCreateInfo * +radv_copy_shader_stage_create_info(struct radv_device *device, uint32_t stageCount, + const VkPipelineShaderStageCreateInfo *pStages, void *mem_ctx); + void radv_pipeline_destroy(struct radv_device *device, struct radv_pipeline *pipeline, const VkAllocationCallbacks *allocator); -- 2.7.4