Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
swr/rast: More precise user clip distance interpolation
Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
  • Loading branch information
gkyriazis committed Feb 16, 2018
1 parent 3e560b7 commit 8a64593
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 17 deletions.
4 changes: 3 additions & 1 deletion src/gallium/drivers/swr/rasterizer/core/backend_impl.h
Expand Up @@ -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);
Expand Down
17 changes: 1 addition & 16 deletions src/gallium/drivers/swr/rasterizer/core/binner.cpp
Expand Up @@ -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];
}
}
}

Expand Down

0 comments on commit 8a64593

Please sign in to comment.