From 630fee59fca09db2fd85081a49c85896173cec6c Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Wed, 16 Mar 2022 14:02:30 +0100 Subject: [PATCH] [dxso] Implement zerowins for Lerp. Fixes #2545. --- src/dxso/dxso_compiler.cpp | 27 +++++++++++++++++++++++---- src/dxso/dxso_compiler.h | 5 +++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/dxso/dxso_compiler.cpp b/src/dxso/dxso_compiler.cpp index 6bf722d25..0ff260ab5 100644 --- a/src/dxso/dxso_compiler.cpp +++ b/src/dxso/dxso_compiler.cpp @@ -1500,6 +1500,25 @@ namespace dxvk { return dot; } + DxsoRegisterValue DxsoCompiler::emitMix( + DxsoRegisterValue x, + DxsoRegisterValue y, + DxsoRegisterValue a) { + uint32_t typeId = getVectorTypeId(x.type); + + if (m_moduleInfo.options.d3d9FloatEmulation != D3D9FloatEmulation::Strict) + return {x.type, m_module.opFMix(typeId, x.id, y.id, a.id)}; + + uint32_t oneId = m_module.constfReplicant(1.0f, a.type.ccount); + + DxsoRegisterValue revA; + revA.type = a.type; + revA.id = m_module.opFSub(typeId, oneId, a.id); + + DxsoRegisterValue xRevA = emitMul(x, revA); + return emitFma(a, y, xRevA); + } + DxsoRegisterValue DxsoCompiler::emitCross( DxsoRegisterValue a, @@ -2226,10 +2245,10 @@ namespace dxvk { } break; case DxsoOpcode::Lrp: - result.id = m_module.opFMix(typeId, - emitRegisterLoad(src[2], mask).id, - emitRegisterLoad(src[1], mask).id, - emitRegisterLoad(src[0], mask).id); + result.id = emitMix( + emitRegisterLoad(src[2], mask), + emitRegisterLoad(src[1], mask), + emitRegisterLoad(src[0], mask)).id; break; case DxsoOpcode::Frc: result.id = m_module.opFract(typeId, diff --git a/src/dxso/dxso_compiler.h b/src/dxso/dxso_compiler.h index a25fcd2e3..0cacbb77f 100644 --- a/src/dxso/dxso_compiler.h +++ b/src/dxso/dxso_compiler.h @@ -562,6 +562,11 @@ namespace dxvk { DxsoRegisterValue a, DxsoRegisterValue b); + DxsoRegisterValue emitMix( + DxsoRegisterValue x, + DxsoRegisterValue y, + DxsoRegisterValue a); + DxsoRegisterValue emitCross( DxsoRegisterValue a, DxsoRegisterValue b);