diff options
| author | Zephyron <zephyron@citron-emu.org> | 2025-01-09 17:13:12 +1000 |
|---|---|---|
| committer | Mike Lothian <mike@fireburn.co.uk> | 2025-05-11 12:17:03 +0100 |
| commit | c3a7aa41d8cb1fb2f02bf3eb9fb4b382d9880920 (patch) | |
| tree | 76c035a1379bcb9ad14032c5fb174e81e880808b | |
| parent | d34cc695df75fd226530dea51020fc61f27ac5a1 (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.
| -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 1cb7764e9..106d39e06 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -773,12 +773,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, this->optimize_spirv_output)}; |
