From 7441137a33bca1414f52dadeb848083b446e29b1 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 16 Apr 2024 14:48:52 +0200 Subject: [PATCH] [dxbc] Ignore system value components when declaring inputs --- src/dxbc/dxbc_compiler.cpp | 28 ++++++++++++++++++++++++++-- src/dxbc/dxbc_compiler.h | 3 +++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 8391d9f4..6492671d 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -7728,6 +7728,21 @@ namespace dxvk { return DxbcRegMask::firstN(getTexCoordDim(imageType)); } + + bool DxbcCompiler::ignoreInputSystemValue(DxbcSystemValue sv) const { + switch (sv) { + case DxbcSystemValue::Position: + case DxbcSystemValue::IsFrontFace: + case DxbcSystemValue::SampleIndex: + case DxbcSystemValue::PrimitiveId: + case DxbcSystemValue::Coverage: + return m_programInfo.type() == DxbcProgramType::PixelShader; + + default: + return false; + } + } + DxbcVectorType DxbcCompiler::getInputRegType(uint32_t regIdx) const { switch (m_programInfo.type()) { @@ -7758,8 +7773,17 @@ namespace dxvk { result.ctype = DxbcScalarType::Float32; result.ccount = 4; - if (m_isgn->findByRegister(regIdx)) - result.ccount = m_isgn->regMask(regIdx).minComponents(); + if (m_isgn == nullptr || !m_isgn->findByRegister(regIdx)) + return result; + + DxbcRegMask mask(0u); + + for (const auto& e : *m_isgn) { + if (e.registerId == regIdx && !ignoreInputSystemValue(e.systemValue)) + mask |= e.componentMask; + } + + result.ccount = mask.minComponents(); return result; } } diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h index d23bc59f..935c683d 100644 --- a/src/dxbc/dxbc_compiler.h +++ b/src/dxbc/dxbc_compiler.h @@ -1221,6 +1221,9 @@ namespace dxvk { uint32_t getUavCoherence( uint32_t registerId, DxbcUavFlags flags); + + bool ignoreInputSystemValue( + DxbcSystemValue sv) const; /////////////////////////// // Type definition methods