From 6dd82dfe0317387458c6788dcf51a717422fdb48 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 22 Nov 2018 17:39:10 +0100 Subject: [PATCH] [dxbc] Clamp written depth value to (0.0, 1.0) Fixes shadow issue in Overwatch (#738). --- src/dxbc/dxbc_compiler.cpp | 24 ++++++++++++++++++++++++ src/dxbc/dxbc_compiler.h | 1 + 2 files changed, 25 insertions(+) diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index c675f5267..730b0b30e 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -5392,6 +5392,29 @@ namespace dxvk { DxbcRegMask::firstN(vector.type.ccount)); } } + + + void DxbcCompiler::emitOutputDepthClamp() { + // HACK: Some drivers do not clamp FragDepth to [minDepth..maxDepth] + // before writing to the depth attachment, but we do not have acccess + // to those. Clamp to [0..1] instead. + if (m_ps.builtinDepth) { + DxbcRegisterPointer ptr; + ptr.type = { DxbcScalarType::Float32, 1 }; + ptr.id = m_ps.builtinDepth; + + DxbcRegisterValue value = emitValueLoad(ptr); + + value.id = m_module.opFClamp( + getVectorTypeId(ptr.type), + value.id, + m_module.constf32(0.0f), + m_module.constf32(1.0f)); + + emitValueStore(ptr, value, + DxbcRegMask::firstN(1)); + } + } DxbcRegisterValue DxbcCompiler::emitVsSystemValueLoad( @@ -6321,6 +6344,7 @@ namespace dxvk { this->emitOutputSetup(); this->emitOutputMapping(); + this->emitOutputDepthClamp(); this->emitFunctionEnd(); } diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h index d1aff00f5..a7dd4fcaf 100644 --- a/src/dxbc/dxbc_compiler.h +++ b/src/dxbc/dxbc_compiler.h @@ -985,6 +985,7 @@ namespace dxvk { void emitOutputSetup(); void emitOutputMapping(); + void emitOutputDepthClamp(); ////////////////////////////////////////// // System value load methods (per shader)