From a01d5e371269eed50fb5f478b98ace5b64490001 Mon Sep 17 00:00:00 2001 From: George Kyriazis Date: Tue, 20 Feb 2018 00:07:57 -0600 Subject: [PATCH] swr/rast: revert clip distance precision Fixes piglit tests that broke with 8a64593bde Reviewed-By: Bruce Cherniak --- .../drivers/swr/rasterizer/core/backend_impl.h | 4 +--- .../drivers/swr/rasterizer/core/binner.cpp | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/core/backend_impl.h b/src/gallium/drivers/swr/rasterizer/core/backend_impl.h index 454f473b47e..2cfd52e829d 100644 --- a/src/gallium/drivers/swr/rasterizer/core/backend_impl.h +++ b/src/gallium/drivers/swr/rasterizer/core/backend_impl.h @@ -62,10 +62,8 @@ 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, _simd_mul_ps(vK, vC), vI, vJ); + simdscalar vInterp = vplaneps(vA, vB, vC, vI, vJ); // clip if interpolated clip distance is < 0 || NAN simdscalar vCull = _simd_cmp_ps(_simd_setzero_ps(), vInterp, _CMP_NLE_UQ); diff --git a/src/gallium/drivers/swr/rasterizer/core/binner.cpp b/src/gallium/drivers/swr/rasterizer/core/binner.cpp index 3b093cefc04..c9a37cb17ae 100644 --- a/src/gallium/drivers/swr/rasterizer/core/binner.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/binner.cpp @@ -256,12 +256,27 @@ 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]); - *(pUserClipBuffer++) = aVertClipDist[clipComp]; + vertClipDist[e] = 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]; + } } } -- 2.30.2