Clip distances need to be perspective-divided. This fixes all the interpolation-*-{distance,vertex} piglits.
Also take this opportunity to fix clip distances for points rasterized as triangles - the clip distance is not subject to sprite coord replacement, so there's no interpolation of it. We just take its value and put it in the "z" component of the barycentric-ready plane equation. (We could also just cull it at an earlier point in time, but that would require larger changes.) Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> --- src/gallium/drivers/swr/rasterizer/core/binner.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/core/binner.cpp b/src/gallium/drivers/swr/rasterizer/core/binner.cpp index 6f9259f..d5f2e97 100644 --- a/src/gallium/drivers/swr/rasterizer/core/binner.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/binner.cpp @@ -383,7 +383,7 @@ PFN_PROCESS_ATTRIBUTES GetProcessAttributesFunc(uint32_t NumVerts, bool IsSwizzl /// @param clipDistMask - mask of enabled clip distances /// @param pUserClipBuffer - buffer to store results template<uint32_t NumVerts> -void ProcessUserClipDist(PA_STATE& pa, uint32_t primIndex, uint8_t clipDistMask, float* pUserClipBuffer) +void ProcessUserClipDist(PA_STATE& pa, uint32_t primIndex, uint8_t clipDistMask, float *pRecipW, float* pUserClipBuffer) { DWORD clipDist; while (_BitScanForward(&clipDist, clipDistMask)) @@ -407,11 +407,12 @@ void ProcessUserClipDist(PA_STATE& pa, uint32_t primIndex, uint8_t clipDistMask, // 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] - vertClipDist[NumVerts - 1]; + baryCoeff[e] = vertClipDist[e] * pRecipW[e] - last; } - baryCoeff[NumVerts - 1] = vertClipDist[NumVerts - 1]; + baryCoeff[NumVerts - 1] = last; for (uint32_t e = 0; e < NumVerts; ++e) { @@ -834,7 +835,7 @@ endBinTriangles: { uint32_t numClipDist = _mm_popcnt_u32(rastState.clipDistanceMask); desc.pUserClipBuffer = (float*)pArena->Alloc(numClipDist * 3 * sizeof(float)); - ProcessUserClipDist<3>(pa, triIndex, rastState.clipDistanceMask, desc.pUserClipBuffer); + ProcessUserClipDist<3>(pa, triIndex, rastState.clipDistanceMask, &desc.pTriBuffer[12], desc.pUserClipBuffer); } for (uint32_t y = aMTTop[triIndex]; y <= aMTBottom[triIndex]; ++y) @@ -1184,8 +1185,15 @@ void BinPoints( if (rastState.clipDistanceMask) { uint32_t numClipDist = _mm_popcnt_u32(rastState.clipDistanceMask); - desc.pUserClipBuffer = (float*)pArena->Alloc(numClipDist * 2 * sizeof(float)); - ProcessUserClipDist<2>(pa, primIndex, rastState.clipDistanceMask, desc.pUserClipBuffer); + desc.pUserClipBuffer = (float*)pArena->Alloc(numClipDist * 3 * sizeof(float)); + float dists[8]; + float one = 1.0f; + ProcessUserClipDist<1>(pa, primIndex, rastState.clipDistanceMask, &one, dists); + for (uint32_t i = 0; i < numClipDist; i++) { + desc.pUserClipBuffer[3*i + 0] = 0.0f; + desc.pUserClipBuffer[3*i + 1] = 0.0f; + desc.pUserClipBuffer[3*i + 2] = dists[i]; + } } MacroTileMgr *pTileMgr = pDC->pTileMgr; @@ -1396,7 +1404,7 @@ void BinPostSetupLines( { uint32_t numClipDist = _mm_popcnt_u32(rastState.clipDistanceMask); desc.pUserClipBuffer = (float*)pArena->Alloc(numClipDist * 2 * sizeof(float)); - ProcessUserClipDist<2>(pa, primIndex, rastState.clipDistanceMask, desc.pUserClipBuffer); + ProcessUserClipDist<2>(pa, primIndex, rastState.clipDistanceMask, &desc.pTriBuffer[12], desc.pUserClipBuffer); } MacroTileMgr *pTileMgr = pDC->pTileMgr; -- 2.7.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev