OSDN Git Service

Fix depth clamping during 'very' early depth test.
authorNicolas Capens <capn@google.com>
Thu, 5 Oct 2017 20:05:47 +0000 (16:05 -0400)
committerNicolas Capens <nicolascapens@google.com>
Fri, 6 Oct 2017 14:36:10 +0000 (14:36 +0000)
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/13088
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
src/Renderer/QuadRasterizer.cpp
src/Renderer/QuadRasterizer.hpp
src/Shader/PixelRoutine.cpp

index 2855e16..795e1ee 100644 (file)
@@ -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;
        }
 
index 5616112..4dfe527 100644 (file)
@@ -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;
index 90e2073..e681fb4 100644 (file)
@@ -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);