From: Tim Rowley Date: Tue, 22 Aug 2017 21:42:57 +0000 (-0500) Subject: swr/rast: Start to remove hardcoded clipcull_dist vertex attrib slot X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5471f65976f39299b9fec7e98fd3b122fa86b499;p=mesa.git swr/rast: Start to remove hardcoded clipcull_dist vertex attrib slot Add new field in SWR_BACKEND_STATE::vertexClipCullOffset to specify the start of the clip/cull section of the vertex header. Removed use of hardcoded slot from binner. Reviewed-by: Bruce Cherniak --- diff --git a/src/gallium/drivers/swr/rasterizer/core/binner.cpp b/src/gallium/drivers/swr/rasterizer/core/binner.cpp index 19afd1f292d..a6713e8c5d2 100644 --- a/src/gallium/drivers/swr/rasterizer/core/binner.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/binner.cpp @@ -366,16 +366,17 @@ PFN_PROCESS_ATTRIBUTES GetProcessAttributesFunc(uint32_t NumVerts, bool IsSwizzl /// @param clipDistMask - mask of enabled clip distances /// @param pUserClipBuffer - buffer to store results template -void ProcessUserClipDist(PA_STATE& pa, uint32_t primIndex, uint8_t clipDistMask, float *pRecipW, float* pUserClipBuffer) +void ProcessUserClipDist(const SWR_BACKEND_STATE& state, PA_STATE& pa, uint32_t primIndex, float *pRecipW, float* pUserClipBuffer) { DWORD clipDist; + uint32_t clipDistMask = state.clipDistanceMask; while (_BitScanForward(&clipDist, clipDistMask)) { clipDistMask &= ~(1 << clipDist); uint32_t clipSlot = clipDist >> 2; uint32_t clipComp = clipDist & 0x3; uint32_t clipAttribSlot = clipSlot == 0 ? - VERTEX_CLIPCULL_DIST_LO_SLOT : VERTEX_CLIPCULL_DIST_HI_SLOT; + state.vertexClipCullOffset : state.vertexClipCullOffset + 1; simd4scalar primClipDist[3]; pa.AssembleSingle(clipAttribSlot, primIndex, primClipDist); @@ -872,7 +873,7 @@ endBinTriangles: { uint32_t numClipDist = _mm_popcnt_u32(state.backendState.clipDistanceMask); desc.pUserClipBuffer = (float*)pArena->Alloc(numClipDist * 3 * sizeof(float)); - ProcessUserClipDist<3>(pa, triIndex, state.backendState.clipDistanceMask, &desc.pTriBuffer[12], desc.pUserClipBuffer); + ProcessUserClipDist<3>(state.backendState, pa, triIndex, &desc.pTriBuffer[12], desc.pUserClipBuffer); } for (uint32_t y = aMTTop[triIndex]; y <= aMTBottom[triIndex]; ++y) @@ -1248,7 +1249,7 @@ void BinPostSetupPointsImpl( desc.pUserClipBuffer = (float*)pArena->Alloc(numClipDist * 3 * sizeof(float)); float dists[8]; float one = 1.0f; - ProcessUserClipDist<1>(pa, primIndex, backendState.clipDistanceMask, &one, dists); + ProcessUserClipDist<1>(backendState, pa, primIndex, &one, dists); for (uint32_t i = 0; i < numClipDist; i++) { desc.pUserClipBuffer[3 * i + 0] = 0.0f; desc.pUserClipBuffer[3 * i + 1] = 0.0f; @@ -1577,7 +1578,7 @@ void BinPostSetupLinesImpl( { uint32_t numClipDist = _mm_popcnt_u32(state.backendState.clipDistanceMask); desc.pUserClipBuffer = (float*)pArena->Alloc(numClipDist * 2 * sizeof(float)); - ProcessUserClipDist<2>(pa, primIndex, state.backendState.clipDistanceMask, &desc.pTriBuffer[12], desc.pUserClipBuffer); + ProcessUserClipDist<2>(state.backendState, pa, primIndex, &desc.pTriBuffer[12], desc.pUserClipBuffer); } MacroTileMgr *pTileMgr = pDC->pTileMgr; diff --git a/src/gallium/drivers/swr/rasterizer/core/state.h b/src/gallium/drivers/swr/rasterizer/core/state.h index 284c523eba8..b0af663d50e 100644 --- a/src/gallium/drivers/swr/rasterizer/core/state.h +++ b/src/gallium/drivers/swr/rasterizer/core/state.h @@ -1070,12 +1070,15 @@ 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 + // Offset to the start of the attributes of the input vertices, in simdvector units + uint32_t vertexAttribOffset; + + // 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; + // Offset to clip/cull attrib section of the vertex, in simdvector units + uint32_t vertexClipCullOffset; }; diff --git a/src/gallium/drivers/swr/swr_state.cpp b/src/gallium/drivers/swr/swr_state.cpp index d5b553b21ab..69a447334fe 100644 --- a/src/gallium/drivers/swr/swr_state.cpp +++ b/src/gallium/drivers/swr/swr_state.cpp @@ -1766,6 +1766,9 @@ swr_update_derived(struct pipe_context *pipe, backendState.cullDistanceMask = ctx->vs->info.base.culldist_writemask << ctx->vs->info.base.num_written_clipdistance; + // Assume old layout of SGV, POSITION, CLIPCULL, ATTRIB + backendState.vertexClipCullOffset = backendState.vertexAttribOffset - 2; + ctx->api.pfnSwrSetBackendState(ctx->swrContext, &backendState); /* Ensure that any in-progress attachment change StoreTiles finish */