From 0cf545858d6b969be2df4d8b81f4baece3a8f175 Mon Sep 17 00:00:00 2001 From: Zephyron Date: Thu, 9 Jan 2025 17:13:12 +1000 Subject: [PATCH] vulkan: Fix crashes with bindless texture constant buffer handling Previously, the code would unconditionally add a constant buffer descriptor at index 0 whenever storage buffers were present, which could cause conflicts and crashes. This change: - Adds validation to check if constant buffer 0 already exists - Only adds the descriptor if it's not already present - Prevents potential descriptor conflicts in shaders This should resolve crashes in Vulkan games related to invalid descriptor layouts and resource binding conflicts. --- .../renderer_vulkan/vk_pipeline_cache.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index d1f06ce50..17583249f 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -768,12 +768,20 @@ std::unique_ptr PipelineCache::CreateComputePipeline( auto program{TranslateProgram(pools.inst, pools.block, env, cfg, host_info)}; - // Add support for bindless texture constant buffer + // Add support for bindless texture constant buffer only if needed if (program.info.storage_buffers_descriptors.size() > 0) { - Shader::ConstantBufferDescriptor desc; - desc.index = 0; - desc.count = 1; - program.info.constant_buffer_descriptors.push_back(desc); + // Check if a constant buffer at index 0 already exists + const bool has_cb0 = std::any_of(program.info.constant_buffer_descriptors.begin(), + program.info.constant_buffer_descriptors.end(), + [](const auto& cb) { return cb.index == 0; }); + + // Only add if not already present + if (!has_cb0) { + Shader::ConstantBufferDescriptor desc; + desc.index = 0; + desc.count = 1; + program.info.constant_buffer_descriptors.push_back(desc); + } } const std::vector code{EmitSPIRV(profile, program)};