summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZephyron <zephyron@citron-emu.org>2025-01-09 17:13:12 +1000
committerZephyron <zephyron@citron-emu.org>2025-01-09 17:13:12 +1000
commit0cf545858d6b969be2df4d8b81f4baece3a8f175 (patch)
tree57f6cb35310fd693125bc06904758d43d04787c6 /src
parent08be9b0617f7109f147f0ae1fa7f87d9a65073b6 (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')
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.cpp18
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)};