mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 13:28:06 +02:00
swr/rast: Move clip/cull enables in API
Moved from from SWR_RASTSTATE to SWR_BACKEND_STATE. Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
This commit is contained in:
parent
f5031fb952
commit
9669972692
9 changed files with 40 additions and 40 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue