Merge pull request #2198 from XairRrR/fix/rect-list-fault-binding

fix(recompiler): bind the rect-list fault buffer in the tessellation control group
This commit is contained in:
Adrià 2026-10-10 08:14:27 +02:00 committed by GitHub
commit feea78cdd2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 6 additions and 7 deletions

View File

@ -2348,6 +2348,10 @@ void rectListTests() {
target.spirvVersion = 0x00010300u;
target.supportedCapabilities = capabilities;
target.tessellation = TessellationTargetLimits{32, 128, 128, 120, 4096, 128, 128};
vertex.bindings = {{DescriptorKind::StorageBuffer, DescriptorRole::GuestBuffers, 0, 0, 1, {}}};
const auto faultAuxiliary = BuildRectListShaders(vertex, fragment, target);
Require(faultAuxiliary.control.bindings.size() == 1 && faultAuxiliary.control.bindings[0].role == DescriptorRole::FaultBuffer && faultAuxiliary.control.bindings[0].binding == RuntimeAbi::BindingNumber(RuntimeAbi::Stage::TessellationControl, RuntimeAbi::Binding::FaultBuffer), "the rect-list control shader's fault buffer is not in the tessellation control binding group");
vertex.bindings.clear();
for (const auto version : {0x00010300u, 0x00010400u}) {
target.spirvVersion = version;
auto auxiliary = BuildRectListShaders(vertex, fragment, target);

View File

@ -1,5 +1,6 @@
#include "Recompiler.hpp"
#include "BdaAbi.hpp"
#include "RuntimeAbi.hpp"
#include "SpirvBackend/SpirvModule.hpp"
#if ANYPS5_ENABLE_SPIRV_TOOLS
#include "SpirvBackend/SpirvOptimizer.hpp"
@ -393,13 +394,7 @@ RectListShaders BuildRectListShaders(const RecompileResult& vertex, const Recomp
}
const auto components = static_cast<std::uint32_t>((parameters.size() + 1) * 4);
require(limits.maxPatchSize >= 4 && components <= limits.maxControlPerVertexInputComponents && components <= limits.maxControlPerVertexOutputComponents && components <= limits.maxEvaluationInputComponents && components <= limits.maxEvaluationOutputComponents && limits.maxControlPerPatchOutputComponents >= 6 && components * 4 + 6 <= limits.maxControlTotalOutputComponents, "tessellation interface exceeds device limits");
std::uint32_t faultBinding = 0;
for (const auto* shader : {&vertex, &fragment}) {
for (const auto& binding : shader->bindings) {
require(binding.binding < std::numeric_limits<std::uint32_t>::max(), "descriptor binding overflow");
faultBinding = std::max(faultBinding, binding.binding + 1);
}
}
const auto faultBinding = RuntimeAbi::BindingNumber(RuntimeAbi::Stage::TessellationControl, RuntimeAbi::Binding::FaultBuffer);
RectListEmitter control(parameters, spv::ExecutionModelTessellationControl, target.spirvVersion, faultBinding);
RectListEmitter evaluation(parameters, spv::ExecutionModelTessellationEvaluation, target.spirvVersion, faultBinding);
RectListShaders shaders;