From 4802bbda7bee2fbb1b4ef2806d66a5155a9ca3de Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 16 Apr 2024 17:40:29 +0200 Subject: [PATCH] [dxbc] Take used components into account for PS inputs --- src/dxbc/dxbc_chunk_isgn.cpp | 6 +++++- src/dxbc/dxbc_chunk_isgn.h | 1 + src/dxbc/dxbc_compiler.cpp | 10 +++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/dxbc/dxbc_chunk_isgn.cpp b/src/dxbc/dxbc_chunk_isgn.cpp index 47f4eef4..d456a8c0 100644 --- a/src/dxbc/dxbc_chunk_isgn.cpp +++ b/src/dxbc/dxbc_chunk_isgn.cpp @@ -23,7 +23,11 @@ namespace dxvk { entry.systemValue = static_cast(reader.readu32()); entry.componentType = componentTypes.at(reader.readu32()); entry.registerId = reader.readu32(); - entry.componentMask = bit::extract(reader.readu32(), 0, 3); + + uint32_t mask = reader.readu32(); + + entry.componentMask = bit::extract(mask, 0, 3); + entry.componentUsed = bit::extract(mask, 8, 11); if (hasPrecision) reader.readu32(); diff --git a/src/dxbc/dxbc_chunk_isgn.h b/src/dxbc/dxbc_chunk_isgn.h index 1dce64ad..87684016 100644 --- a/src/dxbc/dxbc_chunk_isgn.h +++ b/src/dxbc/dxbc_chunk_isgn.h @@ -20,6 +20,7 @@ namespace dxvk { uint32_t semanticIndex; uint32_t registerId; DxbcRegMask componentMask; + DxbcRegMask componentUsed; DxbcScalarType componentType; DxbcSystemValue systemValue; uint32_t streamId; diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 6492671d..2fb15e26 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -7777,10 +7777,18 @@ namespace dxvk { return result; DxbcRegMask mask(0u); + DxbcRegMask used(0u); for (const auto& e : *m_isgn) { - if (e.registerId == regIdx && !ignoreInputSystemValue(e.systemValue)) + if (e.registerId == regIdx && !ignoreInputSystemValue(e.systemValue)) { mask |= e.componentMask; + used |= e.componentUsed; + } + } + + if (m_programInfo.type() == DxbcProgramType::PixelShader) { + if ((used.raw() & mask.raw()) == used.raw()) + mask = used; } result.ccount = mask.minComponents();