swr: [rasterizer core] centroid correction
authorTim Rowley <timothy.o.rowley@intel.com>
Wed, 13 Jul 2016 23:34:03 +0000 (17:34 -0600)
committerTim Rowley <timothy.o.rowley@intel.com>
Wed, 20 Jul 2016 15:22:15 +0000 (10:22 -0500)
Signed-off-by: Tim Rowley <timothy.o.rowley@intel.com>
src/gallium/drivers/swr/rasterizer/core/backend.cpp

index b492810b81221c2e66548ccd33b720b078ee5641..5d83baf391c3c7b4781e36fa7f86e8ab77ebfc8d 100644 (file)
@@ -513,15 +513,12 @@ void BackendSingleSample(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t x, uint3
                 RDTSC_START(BEBarycentric);
                 CalcPixelBarycentrics(coeffs, psContext);
 
-                if(T::bCentroidPos)
-                {
-                    // for 1x case, centroid is pixel center
-                    psContext.vX.centroid = psContext.vX.center;
-                    psContext.vY.centroid = psContext.vY.center;
-                    psContext.vI.centroid = psContext.vI.center;
-                    psContext.vJ.centroid = psContext.vJ.center;
-                    psContext.vOneOverW.centroid = psContext.vOneOverW.center;
-                }
+                // for 1x case, centroid is pixel center
+                psContext.vX.centroid = psContext.vX.center;
+                psContext.vY.centroid = psContext.vY.center;
+                psContext.vI.centroid = psContext.vI.center;
+                psContext.vJ.centroid = psContext.vJ.center;
+                psContext.vOneOverW.centroid = psContext.vOneOverW.center;
 
                 // interpolate and quantize z
                 psContext.vZ = vplaneps(coeffs.vZa, coeffs.vZb, coeffs.vZc, psContext.vI.center, psContext.vJ.center);
@@ -715,6 +712,11 @@ void BackendSampleRate(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t x, uint32_
                 CalcCentroidBarycentrics(coeffs, psContext, psContext.vX.UL, psContext.vY.UL);
                 RDTSC_STOP(BEBarycentric, 0, 0);
             }
+            else
+            {
+                psContext.vX.centroid = psContext.vX.sample;
+                psContext.vY.centroid = psContext.vY.sample;
+            }
 
             for(uint32_t sample = 0; sample < T::MultisampleT::numSamples; sample++)
             {
@@ -925,9 +927,15 @@ void BackendPixelRate(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t x, uint32_t
                     psContext.vX.centroid = _simd_add_ps(psContext.vX.UL, _simd_set1_ps(0.5f));
                     psContext.vY.centroid = _simd_add_ps(psContext.vY.UL, _simd_set1_ps(0.5f));
                 }
+
                 CalcCentroidBarycentrics(coeffs, psContext, psContext.vX.UL, psContext.vY.UL);
                 RDTSC_STOP(BEBarycentric, 0, 0);
             }
+            else
+            {
+                psContext.vX.centroid = _simd_add_ps(psContext.vX.UL, _simd_set1_ps(0.5f));
+                psContext.vY.centroid = _simd_add_ps(psContext.vY.UL, _simd_set1_ps(0.5f));
+            }
 
             if(T::bForcedSampleCount)
             {