swr/rast: More precise user clip distance interpolation
authorGeorge Kyriazis <george.kyriazis@intel.com>
Fri, 2 Feb 2018 01:28:58 +0000 (19:28 -0600)
committerGeorge Kyriazis <george.kyriazis@intel.com>
Fri, 16 Feb 2018 16:54:00 +0000 (10:54 -0600)
Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
src/gallium/drivers/swr/rasterizer/core/backend_impl.h
src/gallium/drivers/swr/rasterizer/core/binner.cpp

index 2cfd52e829d29f53c46877d2e2aecbc736c5cc2f..454f473b47eee8ada810dea8e0688af2575d3a01 100644 (file)
@@ -62,8 +62,10 @@ static INLINE simdmask ComputeUserClipMask(uint8_t clipMask, float* pUserClipBuf
         simdscalar vB = _simd_broadcast_ss(pUserClipBuffer++);
         simdscalar vC = _simd_broadcast_ss(pUserClipBuffer++);
 
+        simdscalar vK = _simd_sub_ps(_simd_sub_ps(_simd_set1_ps(1.0f), vI), vJ);
+
         // interpolate
-        simdscalar vInterp = vplaneps(vA, vB, vC, vI, vJ);
+        simdscalar vInterp = vplaneps(vA, vB, _simd_mul_ps(vK, vC), vI, vJ);
 
         // clip if interpolated clip distance is < 0 || NAN
         simdscalar vCull = _simd_cmp_ps(_simd_setzero_ps(), vInterp, _CMP_NLE_UQ);
index 4510b13969cc7b0fa1d278e126b64ada4a94ed49..8447bc4dc292a7488a92caaa408b8ebcf4e89281 100644 (file)
@@ -256,27 +256,12 @@ void ProcessUserClipDist(const SWR_BACKEND_STATE& state, PA_STATE& pa, uint32_t
         simd4scalar primClipDist[3];
         pa.AssembleSingle(clipAttribSlot, primIndex, primClipDist);
 
-        float vertClipDist[NumVerts];
         for (uint32_t e = 0; e < NumVerts; ++e)
         {
             OSALIGNSIMD(float) aVertClipDist[4];
             SIMD128::store_ps(aVertClipDist, primClipDist[e]);
-            vertClipDist[e] = aVertClipDist[clipComp];
+            *(pUserClipBuffer++) = aVertClipDist[clipComp];
         };
-
-        // setup plane equations for barycentric interpolation in the backend
-        float baryCoeff[NumVerts];
-        float last = vertClipDist[NumVerts - 1] * pRecipW[NumVerts - 1];
-        for (uint32_t e = 0; e < NumVerts - 1; ++e)
-        {
-            baryCoeff[e] = vertClipDist[e] * pRecipW[e] - last;
-        }
-        baryCoeff[NumVerts - 1] = last;
-
-        for (uint32_t e = 0; e < NumVerts; ++e)
-        {
-            *(pUserClipBuffer++) = baryCoeff[e];
-        }
     }
 }