[Mesa-dev] [PATCH 02/10] swr/rast: Move clip/cull enables in API

Tim Rowley timothy.o.rowley at intel.com
Mon Sep 11 19:28:22 UTC 2017


Moved from from SWR_RASTSTATE to SWR_BACKEND_STATE.
---
 .../drivers/swr/rasterizer/core/backend.cpp        |  4 ++--
 .../drivers/swr/rasterizer/core/backend_impl.h     |  2 +-
 .../drivers/swr/rasterizer/core/backend_sample.cpp |  4 ++--
 .../swr/rasterizer/core/backend_singlesample.cpp   |  4 ++--
 src/gallium/drivers/swr/rasterizer/core/binner.cpp | 18 +++++++++---------
 src/gallium/drivers/swr/rasterizer/core/clip.h     | 22 +++++++++++-----------
 .../drivers/swr/rasterizer/core/rasterizer.cpp     |  2 +-
 src/gallium/drivers/swr/rasterizer/core/state.h    |  8 ++++----
 src/gallium/drivers/swr/swr_state.cpp              | 16 ++++++++--------
 9 files changed, 40 insertions(+), 40 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/core/backend.cpp b/src/gallium/drivers/swr/rasterizer/core/backend.cpp
index 363349f..6282e87 100644
--- a/src/gallium/drivers/swr/rasterizer/core/backend.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/backend.cpp
@@ -272,9 +272,9 @@ void BackendNullPS(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t x, uint32_t y,
                     AR_END(BEBarycentric, 0);
 
                     // interpolate user clip distance if available
-                    if (state.rastState.clipDistanceMask)
+                    if (state.backendState.clipDistanceMask)
                     {
-                        coverageMask &= ~ComputeUserClipMask(state.rastState.clipDistanceMask, work.pUserClipBuffer, psContext.vI.sample, psContext.vJ.sample);
+                        coverageMask &= ~ComputeUserClipMask(state.backendState.clipDistanceMask, work.pUserClipBuffer, psContext.vI.sample, psContext.vJ.sample);
                     }
 
                     simdscalar vCoverageMask = _simd_vmask_ps(coverageMask);
diff --git a/src/gallium/drivers/swr/rasterizer/core/backend_impl.h b/src/gallium/drivers/swr/rasterizer/core/backend_impl.h
index 0f430ef..593082b 100644
--- a/src/gallium/drivers/swr/rasterizer/core/backend_impl.h
+++ b/src/gallium/drivers/swr/rasterizer/core/backend_impl.h
@@ -886,7 +886,7 @@ void BackendPixelRate(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t x, uint32_t
 
     AR_END(BESetup, 0);
 
-    PixelRateZTestLoop<T> PixelRateZTest(pDC, workerId, work, coeffs, state, pDepthBuffer, pStencilBuffer, state.rastState.clipDistanceMask);
+    PixelRateZTestLoop<T> PixelRateZTest(pDC, workerId, work, coeffs, state, pDepthBuffer, pStencilBuffer, state.backendState.clipDistanceMask);
 
     psContext.vY.UL     = _simd_add_ps(vULOffsetsY,     _simd_set1_ps(static_cast<float>(y)));
     psContext.vY.center = _simd_add_ps(vCenterOffsetsY, _simd_set1_ps(static_cast<float>(y)));
diff --git a/src/gallium/drivers/swr/rasterizer/core/backend_sample.cpp b/src/gallium/drivers/swr/rasterizer/core/backend_sample.cpp
index bb2e9a9..04e34aa 100644
--- a/src/gallium/drivers/swr/rasterizer/core/backend_sample.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/backend_sample.cpp
@@ -128,9 +128,9 @@ void BackendSampleRate(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t x, uint32_
                     AR_END(BEBarycentric, 0);
 
                     // interpolate user clip distance if available
-                    if (state.rastState.clipDistanceMask)
+                    if (state.backendState.clipDistanceMask)
                     {
-                        coverageMask &= ~ComputeUserClipMask(state.rastState.clipDistanceMask, work.pUserClipBuffer, psContext.vI.sample, psContext.vJ.sample);
+                        coverageMask &= ~ComputeUserClipMask(state.backendState.clipDistanceMask, work.pUserClipBuffer, psContext.vI.sample, psContext.vJ.sample);
                     }
 
                     simdscalar vCoverageMask = _simd_vmask_ps(coverageMask);
diff --git a/src/gallium/drivers/swr/rasterizer/core/backend_singlesample.cpp b/src/gallium/drivers/swr/rasterizer/core/backend_singlesample.cpp
index 18f4299..686b979 100644
--- a/src/gallium/drivers/swr/rasterizer/core/backend_singlesample.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/backend_singlesample.cpp
@@ -112,9 +112,9 @@ void BackendSingleSample(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t x, uint3
                 AR_END(BEBarycentric, 1);
 
                 // interpolate user clip distance if available
-                if (state.rastState.clipDistanceMask)
+                if (state.backendState.clipDistanceMask)
                 {
-                    coverageMask &= ~ComputeUserClipMask(state.rastState.clipDistanceMask, work.pUserClipBuffer, psContext.vI.center, psContext.vJ.center);
+                    coverageMask &= ~ComputeUserClipMask(state.backendState.clipDistanceMask, work.pUserClipBuffer, psContext.vI.center, psContext.vJ.center);
                 }
 
                 simdscalar vCoverageMask = _simd_vmask_ps(coverageMask);
diff --git a/src/gallium/drivers/swr/rasterizer/core/binner.cpp b/src/gallium/drivers/swr/rasterizer/core/binner.cpp
index 01c2f8f..19afd1f 100644
--- a/src/gallium/drivers/swr/rasterizer/core/binner.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/binner.cpp
@@ -868,11 +868,11 @@ endBinTriangles:
         SIMD128::store_ps(&desc.pTriBuffer[12], vHorizW[triIndex]);
 
         // store user clip distances
-        if (rastState.clipDistanceMask)
+        if (state.backendState.clipDistanceMask)
         {
-            uint32_t numClipDist = _mm_popcnt_u32(rastState.clipDistanceMask);
+            uint32_t numClipDist = _mm_popcnt_u32(state.backendState.clipDistanceMask);
             desc.pUserClipBuffer = (float*)pArena->Alloc(numClipDist * 3 * sizeof(float));
-            ProcessUserClipDist<3>(pa, triIndex, rastState.clipDistanceMask, &desc.pTriBuffer[12], desc.pUserClipBuffer);
+            ProcessUserClipDist<3>(pa, triIndex, state.backendState.clipDistanceMask, &desc.pTriBuffer[12], desc.pUserClipBuffer);
         }
 
         for (uint32_t y = aMTTop[triIndex]; y <= aMTBottom[triIndex]; ++y)
@@ -1242,13 +1242,13 @@ void BinPostSetupPointsImpl(
             *pTriBuffer = aPrimVertsZ[primIndex];
 
             // store user clip distances
-            if (rastState.clipDistanceMask)
+            if (backendState.clipDistanceMask)
             {
-                uint32_t numClipDist = _mm_popcnt_u32(rastState.clipDistanceMask);
+                uint32_t numClipDist = _mm_popcnt_u32(backendState.clipDistanceMask);
                 desc.pUserClipBuffer = (float*)pArena->Alloc(numClipDist * 3 * sizeof(float));
                 float dists[8];
                 float one = 1.0f;
-                ProcessUserClipDist<1>(pa, primIndex, rastState.clipDistanceMask, &one, dists);
+                ProcessUserClipDist<1>(pa, primIndex, backendState.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;
@@ -1573,11 +1573,11 @@ void BinPostSetupLinesImpl(
         _mm_store_ps(&desc.pTriBuffer[12], vHorizW[primIndex]);
 
         // store user clip distances
-        if (rastState.clipDistanceMask)
+        if (state.backendState.clipDistanceMask)
         {
-            uint32_t numClipDist = _mm_popcnt_u32(rastState.clipDistanceMask);
+            uint32_t numClipDist = _mm_popcnt_u32(state.backendState.clipDistanceMask);
             desc.pUserClipBuffer = (float*)pArena->Alloc(numClipDist * 2 * sizeof(float));
-            ProcessUserClipDist<2>(pa, primIndex, rastState.clipDistanceMask, &desc.pTriBuffer[12], desc.pUserClipBuffer);
+            ProcessUserClipDist<2>(pa, primIndex, state.backendState.clipDistanceMask, &desc.pTriBuffer[12], desc.pUserClipBuffer);
         }
 
         MacroTileMgr *pTileMgr = pDC->pTileMgr;
diff --git a/src/gallium/drivers/swr/rasterizer/core/clip.h b/src/gallium/drivers/swr/rasterizer/core/clip.h
index d7b559b..e0aaf81 100644
--- a/src/gallium/drivers/swr/rasterizer/core/clip.h
+++ b/src/gallium/drivers/swr/rasterizer/core/clip.h
@@ -371,7 +371,7 @@ public:
 
     int ComputeUserClipCullMask(PA_STATE &pa, typename SIMD_T::Vec4 prim[])
     {
-        uint8_t cullMask = state.rastState.cullDistanceMask;
+        uint8_t cullMask = state.backendState.cullDistanceMask;
         typename SIMD_T::Float vClipCullMask = SIMD_T::setzero_ps();
 
         typename SIMD_T::Vec4 vClipCullDistLo[3];
@@ -408,7 +408,7 @@ public:
         }
 
         // clipper should also discard any primitive with NAN clip distance
-        uint8_t clipMask = state.rastState.clipDistanceMask;
+        uint8_t clipMask = state.backendState.clipDistanceMask;
         while (_BitScanForward(&index, clipMask))
         {
             clipMask &= ~(1 << index);
@@ -488,7 +488,7 @@ public:
         }
 
         // assemble user clip distances if enabled
-        if (state.rastState.clipDistanceMask & 0xf)
+        if (state.backendState.clipDistanceMask & 0xf)
         {
             pa.Assemble(VERTEX_CLIPCULL_DIST_LO_SLOT, tmpVector);
             for (uint32_t i = 0; i < NumVertsPerPrim; ++i)
@@ -497,7 +497,7 @@ public:
             }
         }
 
-        if (state.rastState.clipDistanceMask & 0xf0)
+        if (state.backendState.clipDistanceMask & 0xf0)
         {
             pa.Assemble(VERTEX_CLIPCULL_DIST_HI_SLOT, tmpVector);
             for (uint32_t i = 0; i < NumVertsPerPrim; ++i)
@@ -613,7 +613,7 @@ public:
             }
 
             // transpose user clip distances if enabled
-            if (state.rastState.clipDistanceMask & 0x0f)
+            if (state.backendState.clipDistanceMask & 0x0f)
             {
                 pBase = reinterpret_cast<uint8_t *>(&vertices[0].attrib[VERTEX_CLIPCULL_DIST_LO_SLOT]) + sizeof(float) * inputPrim;
 
@@ -625,7 +625,7 @@ public:
                 }
             }
 
-            if (state.rastState.clipDistanceMask & 0xf0)
+            if (state.backendState.clipDistanceMask & 0xf0)
             {
                 pBase = reinterpret_cast<uint8_t *>(&vertices[0].attrib[VERTEX_CLIPCULL_DIST_HI_SLOT]) + sizeof(float) * inputPrim;
 
@@ -703,7 +703,7 @@ public:
         primMask &= ~ComputeNaNMask(prim);
 
         // user cull distance cull 
-        if (this->state.rastState.cullDistanceMask)
+        if (state.backendState.cullDistanceMask)
         {
             primMask &= ~ComputeUserClipCullMask(pa, prim);
         }
@@ -867,7 +867,7 @@ private:
         }
 
         // interpolate clip distance if enabled
-        if (this->state.rastState.clipDistanceMask & 0xf)
+        if (this->state.backendState.clipDistanceMask & 0xf)
         {
             uint32_t attribSlot = VERTEX_CLIPCULL_DIST_LO_SLOT;
             for (uint32_t c = 0; c < 4; ++c)
@@ -879,7 +879,7 @@ private:
             }
         }
 
-        if (this->state.rastState.clipDistanceMask & 0xf0)
+        if (this->state.backendState.clipDistanceMask & 0xf0)
         {
             uint32_t attribSlot = VERTEX_CLIPCULL_DIST_HI_SLOT;
             for (uint32_t c = 0; c < 4; ++c)
@@ -963,7 +963,7 @@ private:
                 }
 
                 // store clip distance if enabled
-                if (this->state.rastState.clipDistanceMask & 0xf)
+                if (this->state.backendState.clipDistanceMask & 0xf)
                 {
                     uint32_t attribSlot = VERTEX_CLIPCULL_DIST_LO_SLOT;
                     for (uint32_t c = 0; c < 4; ++c)
@@ -973,7 +973,7 @@ private:
                     }
                 }
 
-                if (this->state.rastState.clipDistanceMask & 0xf0)
+                if (this->state.backendState.clipDistanceMask & 0xf0)
                 {
                     uint32_t attribSlot = VERTEX_CLIPCULL_DIST_HI_SLOT;
                     for (uint32_t c = 0; c < 4; ++c)
diff --git a/src/gallium/drivers/swr/rasterizer/core/rasterizer.cpp b/src/gallium/drivers/swr/rasterizer/core/rasterizer.cpp
index a3ff557..ae1e9c7 100644
--- a/src/gallium/drivers/swr/rasterizer/core/rasterizer.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/rasterizer.cpp
@@ -125,7 +125,7 @@ void RasterizeLine(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t macroTile, voi
 
     // Store user clip distances for triangle 0
     float newClipBuffer[3 * 8];
-    uint32_t numClipDist = _mm_popcnt_u32(state.rastState.clipDistanceMask);
+    uint32_t numClipDist = _mm_popcnt_u32(state.backendState.clipDistanceMask);
     if (numClipDist)
     {
         newWorkDesc.pUserClipBuffer = newClipBuffer;
diff --git a/src/gallium/drivers/swr/rasterizer/core/state.h b/src/gallium/drivers/swr/rasterizer/core/state.h
index ed49134..284c523 100644
--- a/src/gallium/drivers/swr/rasterizer/core/state.h
+++ b/src/gallium/drivers/swr/rasterizer/core/state.h
@@ -1035,10 +1035,6 @@ struct SWR_RASTSTATE
     uint32_t pixelLocation;     // UL or Center
     SWR_MULTISAMPLE_POS samplePositions;    // @llvm_struct
     bool bIsCenterPattern;   // @llvm_enum
-
-    // user clip/cull distance enables
-    uint8_t cullDistanceMask;
-    uint8_t clipDistanceMask;
 };
 
 
@@ -1074,6 +1070,10 @@ struct SWR_BACKEND_STATE
     bool readRenderTargetArrayIndex;    // Forward render target array index from last FE stage to the backend
     bool readViewportArrayIndex;        // Read viewport array index from last FE stage during binning
     
+    // user clip/cull distance enables
+    uint8_t cullDistanceMask;
+    uint8_t clipDistanceMask;
+
 	// Offset to the start of the attributes of the input vertices, in simdvector units
     uint32_t vertexAttribOffset;
 };
diff --git a/src/gallium/drivers/swr/swr_state.cpp b/src/gallium/drivers/swr/swr_state.cpp
index 47ab445..d5b553b 100644
--- a/src/gallium/drivers/swr/swr_state.cpp
+++ b/src/gallium/drivers/swr/swr_state.cpp
@@ -1158,14 +1158,6 @@ swr_update_derived(struct pipe_context *pipe,
       rastState->depthClipEnable = rasterizer->depth_clip;
       rastState->clipHalfZ = rasterizer->clip_halfz;
 
-      rastState->clipDistanceMask =
-         ctx->vs->info.base.num_written_clipdistance ?
-         ctx->vs->info.base.clipdist_writemask & rasterizer->clip_plane_enable :
-         rasterizer->clip_plane_enable;
-
-      rastState->cullDistanceMask =
-         ctx->vs->info.base.culldist_writemask << ctx->vs->info.base.num_written_clipdistance;
-
       ctx->api.pfnSwrSetRastState(ctx->swrContext, rastState);
    }
 
@@ -1766,6 +1758,14 @@ swr_update_derived(struct pipe_context *pipe,
    backendState.readViewportArrayIndex = pLastFE->writes_viewport_index;
    backendState.vertexAttribOffset = VERTEX_ATTRIB_START_SLOT; // TODO: optimize
 
+   backendState.clipDistanceMask =
+      ctx->vs->info.base.num_written_clipdistance ?
+      ctx->vs->info.base.clipdist_writemask & ctx->rasterizer->clip_plane_enable :
+      ctx->rasterizer->clip_plane_enable;
+
+   backendState.cullDistanceMask =
+      ctx->vs->info.base.culldist_writemask << ctx->vs->info.base.num_written_clipdistance;
+
    ctx->api.pfnSwrSetBackendState(ctx->swrContext, &backendState);
 
    /* Ensure that any in-progress attachment change StoreTiles finish */
-- 
2.7.4



More information about the mesa-dev mailing list