Make fragDepth clamping conditional

Per the spec: If VkPipelineRasterizationStateCreateInfo::depthClampEnable is enabled, before the sample’s zf is compared to za, zf is clamped to [min(n,f),max(n,f)], where n and f are the minDepth and maxDepth depth range values of the viewport used by this fragment, respectively. So when we read oDepth back from a shader that sets fragDepth, it should only be clamped when depth clamping is enabled, and it should be clamped to the viewport depth clamp values, not [0, 1]. Bug: b/184063472 Change-Id: I92e99b80f3929b8b8030f41f6a3afbfebda4e737 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/54408Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Presubmit-Ready: Alexis Hétu <sugoi@google.com> Commit-Queue: Sean Risser <srisser@google.com> Tested-by: 's avatarSean Risser <srisser@google.com>
parent 3b9a1a79
...@@ -235,7 +235,11 @@ void PixelProgram::applyShader(Int cMask[4], Int sMask[4], Int zMask[4], int sam ...@@ -235,7 +235,11 @@ void PixelProgram::applyShader(Int cMask[4], Int sMask[4], Int zMask[4], int sam
it = spirvShader->outputBuiltins.find(spv::BuiltInFragDepth); it = spirvShader->outputBuiltins.find(spv::BuiltInFragDepth);
if(it != spirvShader->outputBuiltins.end()) if(it != spirvShader->outputBuiltins.end())
{ {
oDepth = Min(Max(routine.getVariable(it->second.Id)[it->second.FirstComponent], Float4(0.0f)), Float4(1.0f)); oDepth = routine.getVariable(it->second.Id)[it->second.FirstComponent];
if(state.depthClamp)
{
oDepth = Min(Max(oDepth, Float4(state.minDepthClamp)), Float4(state.maxDepthClamp));
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment