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.
This commit is contained in:
Zephyron 2025-01-09 17:13:12 +10:00
parent 08be9b0617
commit 0cf545858d
No known key found for this signature in database
GPG key ID: 8DA271B6A74353F1

View file

@ -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)};