Commit 5ba372fa by Nicolas Capens Committed by Nicolas Capens

Fix depth clamping during 'very' early depth test.

We perform depth testing before computing scanline invariants, as an optimization. But it was not taking into account that the fixed-function depth value may require clamping due to the depth bias. Bug swiftshader:82 Change-Id: I6f8953f9d060c73b5fe209b8cbad70e7cb7588b4 Reviewed-on: https://swiftshader-review.googlesource.com/13088Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 9d56da27
......@@ -180,7 +180,7 @@ namespace sw
For(Int x = x0, x < x1, x += 2)
{
Float4 z = interpolate(xxxx, Dz[0], z, primitive + OFFSET(Primitive,z), false, false);
Float4 z = interpolate(xxxx, Dz[0], z, primitive + OFFSET(Primitive,z), false, false, state.depthClamp);
Float4 zValue;
......@@ -316,7 +316,7 @@ namespace sw
Until(y >= yMax)
}
Float4 QuadRasterizer::interpolate(Float4 &x, Float4 &D, Float4 &rhw, Pointer<Byte> planeEquation, bool flat, bool perspective)
Float4 QuadRasterizer::interpolate(Float4 &x, Float4 &D, Float4 &rhw, Pointer<Byte> planeEquation, bool flat, bool perspective, bool clamp)
{
Float4 interpolant = D;
......@@ -330,6 +330,11 @@ namespace sw
}
}
if(clamp)
{
interpolant = Min(Max(interpolant, Float4(0.0f)), Float4(1.0f));
}
return interpolant;
}
......
......@@ -49,7 +49,7 @@ namespace sw
bool interpolateZ() const;
bool interpolateW() const;
Float4 interpolate(Float4 &x, Float4 &D, Float4 &rhw, Pointer<Byte> planeEquation, bool flat, bool perspective);
Float4 interpolate(Float4 &x, Float4 &D, Float4 &rhw, Pointer<Byte> planeEquation, bool flat, bool perspective, bool clamp);
const PixelProcessor::State &state;
const PixelShader *const shader;
......
......@@ -94,12 +94,7 @@ namespace sw
x -= *Pointer<Float4>(constants + OFFSET(Constants,X) + q * sizeof(float4));
}
z[q] = interpolate(x, Dz[q], z[q], primitive + OFFSET(Primitive,z), false, false);
if(state.depthClamp)
{
z[q] = Min(Max(z[q], Float4(0.0f)), Float4(1.0f));
}
z[q] = interpolate(x, Dz[q], z[q], primitive + OFFSET(Primitive,z), false, false, state.depthClamp);
}
}
......@@ -146,7 +141,7 @@ namespace sw
if(interpolateW())
{
w = interpolate(xxxx, Dw, rhw, primitive + OFFSET(Primitive,w), false, false);
w = interpolate(xxxx, Dw, rhw, primitive + OFFSET(Primitive,w), false, false, false);
rhw = reciprocal(w, false, false, true);
if(state.centroid)
......@@ -163,7 +158,7 @@ namespace sw
{
if(!state.interpolant[interpolant].centroid)
{
v[interpolant][component] = interpolate(xxxx, Dv[interpolant][component], rhw, primitive + OFFSET(Primitive, V[interpolant][component]), (state.interpolant[interpolant].flat & (1 << component)) != 0, state.perspective);
v[interpolant][component] = interpolate(xxxx, Dv[interpolant][component], rhw, primitive + OFFSET(Primitive, V[interpolant][component]), (state.interpolant[interpolant].flat & (1 << component)) != 0, state.perspective, false);
}
else
{
......@@ -198,7 +193,7 @@ namespace sw
if(state.fog.component)
{
f = interpolate(xxxx, Df, rhw, primitive + OFFSET(Primitive,f), state.fog.flat & 0x01, state.perspective);
f = interpolate(xxxx, Df, rhw, primitive + OFFSET(Primitive,f), state.fog.flat & 0x01, state.perspective, false);
}
setBuiltins(x, y, z, w);
......
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