diff options
author | Zephyron <zephyron@citron-emu.org> | 2025-01-09 17:13:12 +1000 |
---|---|---|
committer | Zephyron <zephyron@citron-emu.org> | 2025-01-09 17:13:12 +1000 |
commit | 0cf545858d6b969be2df4d8b81f4baece3a8f175 (patch) | |
tree | 57f6cb35310fd693125bc06904758d43d04787c6 /src/video_core | |
parent | 08be9b0617f7109f147f0ae1fa7f87d9a65073b6 (diff) |
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.
Diffstat (limited to 'src/video_core')
-rw-r--r-- | src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 18 |
1 files 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<ComputePipeline> 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<u32> code{EmitSPIRV(profile, program)}; |