diff --git a/cli/fossilize_disasm.cpp b/cli/fossilize_disasm.cpp index 4799847..6e8400e 100644 --- a/cli/fossilize_disasm.cpp +++ b/cli/fossilize_disasm.cpp @@ -369,8 +369,8 @@ struct DisasmReplayer : StateCreatorInterface if (device) { if (device->has_pipeline_stats()) - const_cast(create_info)->flags |= - VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR | VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR; + add_pipeline_flags(create_info, + VK_PIPELINE_CREATE_2_CAPTURE_STATISTICS_BIT_KHR | VK_PIPELINE_CREATE_2_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR); LOGI("Creating compute pipeline %0" PRIX64 "\n", hash); if (vkCreateComputePipelines(device->get_device(), pipeline_cache, 1, create_info, nullptr, pipeline) != @@ -401,8 +401,8 @@ struct DisasmReplayer : StateCreatorInterface if (device) { if (device->has_pipeline_stats()) - const_cast(create_info)->flags |= - VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR | VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR; + add_pipeline_flags(create_info, + VK_PIPELINE_CREATE_2_CAPTURE_STATISTICS_BIT_KHR | VK_PIPELINE_CREATE_2_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR); LOGI("Creating graphics pipeline %0" PRIX64 "\n", hash); if (vkCreateGraphicsPipelines(device->get_device(), pipeline_cache, 1, create_info, nullptr, pipeline) != @@ -434,8 +434,8 @@ struct DisasmReplayer : StateCreatorInterface { if (device->has_pipeline_stats()) { - const_cast(create_info)->flags |= - VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR | VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR; + add_pipeline_flags(create_info, + VK_PIPELINE_CREATE_2_CAPTURE_STATISTICS_BIT_KHR | VK_PIPELINE_CREATE_2_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR); } LOGI("Creating raytracing pipeline %0" PRIX64 "\n", hash); @@ -482,6 +482,25 @@ struct DisasmReplayer : StateCreatorInterface !filter_raytracing.empty() || !filter_modules.empty(); } + template + static void add_pipeline_flags(const T* create_info, VkPipelineCreateFlags2 flags) + { + auto next = reinterpret_cast(create_info->pNext); + + while (next->sType != VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO) + next = next->pNext; + + if (next) + { + auto flags2_info = reinterpret_cast(next); + const_cast(flags2_info)->flags |= flags; + } + else + { + const_cast(create_info)->flags |= VkPipelineCreateFlags(flags); + } + } + VulkanDevice *device; vector sampler_infos;