[Mesa-dev] [PATCH] swr: perform perspective division on clip distances

Ilia Mirkin imirkin at alum.mit.edu
Thu Dec 8 21:11:21 UTC 2016


On Thu, Dec 8, 2016 at 3:43 PM, Rowley, Timothy O
<timothy.o.rowley at intel.com> wrote:
>
>> On Nov 24, 2016, at 2:29 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>>
>> 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.)
>>
>
> Would prefer this second change moved to a separate commit.  I’ve spent the most time looking at that, and still not convinced it’s correct.

OK. I think the current situation is that we feed it 2 points per clip
distance, but the rasterizer expects 3 since they're being fed in as
triangles. I'll split them up though. And try to come up with a
concrete piglit this fixes.

>
>> Signed-off-by: Ilia Mirkin <imirkin at 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
>>
>


More information about the mesa-dev mailing list