summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZephyron <zephyron@citron-emu.org>2025-01-09 17:13:12 +1000
committerMike Lothian <mike@fireburn.co.uk>2025-05-11 12:17:03 +0100
commitc3a7aa41d8cb1fb2f02bf3eb9fb4b382d9880920 (patch)
tree76c035a1379bcb9ad14032c5fb174e81e880808b
parentd34cc695df75fd226530dea51020fc61f27ac5a1 (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.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 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)};