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:
commit
feea78cdd2
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue