[Mesa-dev] [PATCH 14/31] swr/rast: More precise user clip distance interpolation
George Kyriazis
george.kyriazis at intel.com
Tue Feb 13 22:42:32 UTC 2018
---
src/gallium/drivers/swr/rasterizer/core/backend_impl.h | 4 +++-
src/gallium/drivers/swr/rasterizer/core/binner.cpp | 17 +----------------
2 files changed, 4 insertions(+), 17 deletions(-)
diff --git a/src/gallium/drivers/swr/rasterizer/core/backend_impl.h b/src/gallium/drivers/swr/rasterizer/core/backend_impl.h
index 2cfd52e..454f473 100644
--- a/src/gallium/drivers/swr/rasterizer/core/backend_impl.h
+++ b/src/gallium/drivers/swr/rasterizer/core/backend_impl.h
@@ -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);
diff --git a/src/gallium/drivers/swr/rasterizer/core/binner.cpp b/src/gallium/drivers/swr/rasterizer/core/binner.cpp
index 4510b13..8447bc4 100644
--- a/src/gallium/drivers/swr/rasterizer/core/binner.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/binner.cpp
@@ -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];
- }
}
}
--
2.7.4
More information about the mesa-dev
mailing list