[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