From 899917280537539bd63b7dd0f9a9bf07fb7145c8 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 12 Jun 2026 02:19:54 +0200 Subject: [PATCH] Handle VkPipelineCreateFlags2 in disasm. Vk*PipelineCreateInfo::flags is ignored if a Flags2 chain is present. --- cli/fossilize_disasm.cpp | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/cli/fossilize_disasm.cpp b/cli/fossilize_disasm.cpp index 47998471..6e8400ea 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;