radv: create a helper for copying VkPipelineShaderStageCreateInfo
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 7 Apr 2023 12:20:06 +0000 (14:20 +0200)
committerMarge Bot <emma+marge@anholt.net>
Fri, 7 Apr 2023 19:43:05 +0000 (19:43 +0000)
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22327>

src/amd/vulkan/radv_pipeline.c
src/amd/vulkan/radv_pipeline_rt.c
src/amd/vulkan/radv_private.h

index 12468b4..a91691e 100644 (file)
@@ -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;
+}
index 038c7dd..fdd54d5 100644 (file)
@@ -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) {
index 3abdced..c263e0e 100644 (file)
@@ -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);