From 6fe96d7d8247c78070588bb5bec92b37bec6b129 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Mon, 26 Sep 2022 11:19:52 +0200 Subject: [PATCH] [dxso] Support clamping Dref. --- src/d3d9/d3d9_spec_constants.h | 4 +++- src/dxso/dxso_compiler.cpp | 11 ++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/d3d9/d3d9_spec_constants.h b/src/d3d9/d3d9_spec_constants.h index 78a850301..cfe84473a 100644 --- a/src/d3d9/d3d9_spec_constants.h +++ b/src/d3d9/d3d9_spec_constants.h @@ -27,6 +27,7 @@ namespace dxvk { SpecVertexShaderBools, // 16 bools | Bits: 16 SpecPixelShaderBools, // 16 bools | Bits: 16 + SpecDrefClamp, // 1 bit for 16 PS samplers | Bits: 16 SpecFetch4, // 1 bit for 16 PS samplers | Bits: 16 SpecConstantCount, @@ -62,7 +63,8 @@ namespace dxvk { { 3, 0, 16 }, // VertexShaderBools { 3, 16, 16 }, // PixelShaderBools - { 4, 0, 16 }, // Fetch4 + { 4, 0, 16 }, // DrefClamp + { 4, 16, 16 }, // Fetch4 }}; template diff --git a/src/dxso/dxso_compiler.cpp b/src/dxso/dxso_compiler.cpp index cb1ce67dd..8b9b16dd3 100644 --- a/src/dxso/dxso_compiler.cpp +++ b/src/dxso/dxso_compiler.cpp @@ -2862,19 +2862,24 @@ void DxsoCompiler::emitControlFlowGenericLoop( texcoordVar.id = DoProjection(texcoordVar, true); } - uint32_t reference = 0; + uint32_t bool_t = m_module.defBoolType(); + uint32_t reference = 0; if (depth) { + uint32_t fType = m_module.defFloatType(32); uint32_t component = sampler.dimensions; reference = m_module.opCompositeExtract( - m_module.defFloatType(32), texcoordVar.id, 1, &component); + fType, texcoordVar.id, 1, &component); + uint32_t clampDref = m_spec.get(m_module, m_specUbo, SpecDrefClamp, samplerIdx, 1); + clampDref = m_module.opINotEqual(bool_t, clampDref, m_module.constu32(0)); + uint32_t clampedDref = m_module.opFClamp(fType, reference, m_module.constf32(0.0f), m_module.constf32(1.0f)); + reference = m_module.opSelect(fType, clampDref, clampedDref, reference); } uint32_t fetch4 = 0; if (m_programInfo.type() == DxsoProgramType::PixelShader && samplerType != SamplerTypeTexture3D) { fetch4 = m_spec.get(m_module, m_specUbo, SpecFetch4, samplerIdx, 1); - uint32_t bool_t = m_module.defBoolType(); fetch4 = m_module.opINotEqual(bool_t, fetch4, m_module.constu32(0)); uint32_t bvec4_t = m_module.defVectorType(bool_t, 4);