swr/rast: More precise user clip distance interpolation
Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
This commit is contained in:
parent
3e560b7c85
commit
8a64593bde
|
@ -62,8 +62,10 @@ static INLINE simdmask ComputeUserClipMask(uint8_t clipMask, float* pUserClipBuf
|
||||||
simdscalar vB = _simd_broadcast_ss(pUserClipBuffer++);
|
simdscalar vB = _simd_broadcast_ss(pUserClipBuffer++);
|
||||||
simdscalar vC = _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
|
// 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
|
// clip if interpolated clip distance is < 0 || NAN
|
||||||
simdscalar vCull = _simd_cmp_ps(_simd_setzero_ps(), vInterp, _CMP_NLE_UQ);
|
simdscalar vCull = _simd_cmp_ps(_simd_setzero_ps(), vInterp, _CMP_NLE_UQ);
|
||||||
|
|
|
@ -256,27 +256,12 @@ void ProcessUserClipDist(const SWR_BACKEND_STATE& state, PA_STATE& pa, uint32_t
|
||||||
simd4scalar primClipDist[3];
|
simd4scalar primClipDist[3];
|
||||||
pa.AssembleSingle(clipAttribSlot, primIndex, primClipDist);
|
pa.AssembleSingle(clipAttribSlot, primIndex, primClipDist);
|
||||||
|
|
||||||
float vertClipDist[NumVerts];
|
|
||||||
for (uint32_t e = 0; e < NumVerts; ++e)
|
for (uint32_t e = 0; e < NumVerts; ++e)
|
||||||
{
|
{
|
||||||
OSALIGNSIMD(float) aVertClipDist[4];
|
OSALIGNSIMD(float) aVertClipDist[4];
|
||||||
SIMD128::store_ps(aVertClipDist, primClipDist[e]);
|
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];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue