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;
+}
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,
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) {
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);