[Mesa-dev] [PATCH v3 1/2] swr/rast: support polygonmode point
Cherniak, Bruce
bruce.cherniak at intel.com
Mon May 8 17:39:37 UTC 2017
Reviewed-by: Bruce Cherniak <bruce.cherniak at intel.com>
> On May 4, 2017, at 10:35 AM, George Kyriazis <george.kyriazis at intel.com> wrote:
>
> Add support for polygonmode point in the binner. This is done by
> splitting BinPostSetupPoints from BinPoints, so the earlier call can be
> called from BinTriangles. Setup has already been done at the time
> BinPostSetupPoints needs to be called.
>
> This checkin just adds support in the rasterizer. A separate checkin
> will add the appropriate driver support.
>
> v2: remove cc stable
> v3: modified commit message and subject line
> ---
> src/gallium/drivers/swr/rasterizer/core/binner.cpp | 168 ++++++++++++++-------
> 1 file changed, 116 insertions(+), 52 deletions(-)
>
> diff --git a/src/gallium/drivers/swr/rasterizer/core/binner.cpp b/src/gallium/drivers/swr/rasterizer/core/binner.cpp
> index d011741..4c6a5b1 100644
> --- a/src/gallium/drivers/swr/rasterizer/core/binner.cpp
> +++ b/src/gallium/drivers/swr/rasterizer/core/binner.cpp
> @@ -36,9 +36,11 @@
>
> // Function Prototype
> void BinPostSetupLines(DRAW_CONTEXT *pDC, PA_STATE& pa, uint32_t workerId, simdvector prims[3], simdscalar vRecipW[2], uint32_t primMask, simdscalari primID, simdscalari viewportIdx);
> +void BinPostSetupPoints(DRAW_CONTEXT *pDC, PA_STATE& pa, uint32_t workerId, simdvector prims[], uint32_t primMask, simdscalari primID, simdscalari viewportIdx);
>
> #if USE_SIMD16_FRONTEND
> void BinPostSetupLines_simd16(DRAW_CONTEXT *pDC, PA_STATE& pa, uint32_t workerId, simd16vector prims[3], simd16scalar vRecipW[2], uint32_t primMask, simd16scalari primID, simd16scalari viewportIdx);
> +void BinPostSetupPoints_simd16(DRAW_CONTEXT *pDC, PA_STATE& pa, uint32_t workerId, simdvector prims[], uint32_t primMask, simdscalari primID, simdscalari viewportIdx);
> #endif
>
> //////////////////////////////////////////////////////////////////////////
> @@ -745,6 +747,14 @@ void BinTriangles(
>
> AR_END(FEBinTriangles, 1);
> return;
> + } else if (rastState.fillMode == SWR_FILLMODE_POINT)
> + {
> + // bin 3 points
> +
> + BinPostSetupPoints(pDC, pa, workerId, &tri[0], triMask, primID, viewportIdx);
> + BinPostSetupPoints(pDC, pa, workerId, &tri[1], triMask, primID, viewportIdx);
> + BinPostSetupPoints(pDC, pa, workerId, &tri[2], triMask, primID, viewportIdx);
> + return;
> }
>
> /// Note: these variable initializations must stay above any 'goto endBenTriangles'
> @@ -1494,14 +1504,7 @@ PFN_PROCESS_PRIMS_SIMD16 GetBinTrianglesFunc_simd16(bool IsConservative)
>
> #endif
>
> -//////////////////////////////////////////////////////////////////////////
> -/// @brief Bin SIMD points to the backend. Only supports point size of 1
> -/// @param pDC - pointer to draw context.
> -/// @param pa - The primitive assembly object.
> -/// @param workerId - thread's worker id. Even thread has a unique id.
> -/// @param tri - Contains point position data for SIMDs worth of points.
> -/// @param primID - Primitive ID for each point.
> -void BinPoints(
> +void BinPostSetupPoints(
> DRAW_CONTEXT *pDC,
> PA_STATE& pa,
> uint32_t workerId,
> @@ -1517,7 +1520,6 @@ void BinPoints(
> simdvector& primVerts = prim[0];
>
> const API_STATE& state = GetApiState(pDC);
> - const SWR_FRONTEND_STATE& feState = state.frontendState;
> const SWR_GS_STATE& gsState = state.gsState;
> const SWR_RASTSTATE& rastState = state.rastState;
> const uint32_t *pViewportIndex = (uint32_t *)&viewportIdx;
> @@ -1526,25 +1528,6 @@ void BinPoints(
> PFN_PROCESS_ATTRIBUTES pfnProcessAttribs = GetProcessAttributesFunc(1,
> state.backendState.swizzleEnable, state.backendState.constantInterpolationMask);
>
> - if (!feState.vpTransformDisable)
> - {
> - // perspective divide
> - simdscalar vRecipW0 = _simd_div_ps(_simd_set1_ps(1.0f), primVerts.w);
> - primVerts.x = _simd_mul_ps(primVerts.x, vRecipW0);
> - primVerts.y = _simd_mul_ps(primVerts.y, vRecipW0);
> - primVerts.z = _simd_mul_ps(primVerts.z, vRecipW0);
> -
> - // viewport transform to screen coords
> - if (state.gsState.emitsViewportArrayIndex)
> - {
> - viewportTransform<1>(&primVerts, state.vpMatrices, viewportIdx);
> - }
> - else
> - {
> - viewportTransform<1>(&primVerts, state.vpMatrices);
> - }
> - }
> -
> // adjust for pixel center location
> simdscalar offset = g_pixelOffsets[rastState.pixelLocation];
> primVerts.x = _simd_add_ps(primVerts.x, offset);
> @@ -1837,40 +1820,35 @@ void BinPoints(
> AR_END(FEBinPoints, 1);
> }
>
> -#if USE_SIMD16_FRONTEND
> -void SIMDAPI BinPoints_simd16(
> +//////////////////////////////////////////////////////////////////////////
> +/// @brief Bin SIMD points to the backend. Only supports point size of 1
> +/// @param pDC - pointer to draw context.
> +/// @param pa - The primitive assembly object.
> +/// @param workerId - thread's worker id. Even thread has a unique id.
> +/// @param tri - Contains point position data for SIMDs worth of points.
> +/// @param primID - Primitive ID for each point.
> +void BinPoints(
> DRAW_CONTEXT *pDC,
> PA_STATE& pa,
> uint32_t workerId,
> - simd16vector prim[3],
> + simdvector prim[3],
> uint32_t primMask,
> - simd16scalari primID,
> - simd16scalari viewportIdx)
> + simdscalari primID,
> + simdscalari viewportIdx)
> {
> - SWR_CONTEXT *pContext = pDC->pContext;
> -
> - AR_BEGIN(FEBinPoints, pDC->drawId);
> -
> - simd16vector& primVerts = prim[0];
> + simdvector& primVerts = prim[0];
>
> const API_STATE& state = GetApiState(pDC);
> const SWR_FRONTEND_STATE& feState = state.frontendState;
> - const SWR_GS_STATE& gsState = state.gsState;
> const SWR_RASTSTATE& rastState = state.rastState;
> - const uint32_t *pViewportIndex = (uint32_t *)&viewportIdx;
> -
> - // Select attribute processor
> - PFN_PROCESS_ATTRIBUTES pfnProcessAttribs = GetProcessAttributesFunc(1,
> - state.backendState.swizzleEnable, state.backendState.constantInterpolationMask);
>
> if (!feState.vpTransformDisable)
> {
> // perspective divide
> - simd16scalar vRecipW0 = _simd16_div_ps(_simd16_set1_ps(1.0f), primVerts.w);
> -
> - primVerts.x = _simd16_mul_ps(primVerts.x, vRecipW0);
> - primVerts.y = _simd16_mul_ps(primVerts.y, vRecipW0);
> - primVerts.z = _simd16_mul_ps(primVerts.z, vRecipW0);
> + simdscalar vRecipW0 = _simd_div_ps(_simd_set1_ps(1.0f), primVerts.w);
> + primVerts.x = _simd_mul_ps(primVerts.x, vRecipW0);
> + primVerts.y = _simd_mul_ps(primVerts.y, vRecipW0);
> + primVerts.z = _simd_mul_ps(primVerts.z, vRecipW0);
>
> // viewport transform to screen coords
> if (state.gsState.emitsViewportArrayIndex)
> @@ -1883,10 +1861,45 @@ void SIMDAPI BinPoints_simd16(
> }
> }
>
> - const simd16scalar offset = g_pixelOffsets_simd16[rastState.pixelLocation];
> + // adjust for pixel center location
> + simdscalar offset = g_pixelOffsets[rastState.pixelLocation];
> + primVerts.x = _simd_add_ps(primVerts.x, offset);
> + primVerts.y = _simd_add_ps(primVerts.y, offset);
>
> - primVerts.x = _simd16_add_ps(primVerts.x, offset);
> - primVerts.y = _simd16_add_ps(primVerts.y, offset);
> + BinPostSetupPoints(
> + pDC,
> + pa,
> + workerId,
> + prim,
> + primMask,
> + primID,
> + viewportIdx);
> +}
> +
> +#if USE_SIMD16_FRONTEND
> +void BinPostSetupPoints_simd16(
> + DRAW_CONTEXT *pDC,
> + PA_STATE& pa,
> + uint32_t workerId,
> + simd16vector prim[3],
> + uint32_t primMask,
> + simd16scalari primID,
> + simd16scalari viewportIdx)
> +{
> + SWR_CONTEXT *pContext = pDC->pContext;
> +
> + AR_BEGIN(FEBinPoints, pDC->drawId);
> +
> + simd16vector& primVerts = prim[0];
> +
> + const API_STATE& state = GetApiState(pDC);
> + const SWR_GS_STATE& gsState = state.gsState;
> + const SWR_RASTSTATE& rastState = state.rastState;
> + const uint32_t *pViewportIndex = (uint32_t *)&viewportIdx;
> +
> + // Select attribute processor
> + PFN_PROCESS_ATTRIBUTES pfnProcessAttribs = GetProcessAttributesFunc(1,
> + state.backendState.swizzleEnable, state.backendState.constantInterpolationMask);
>
> // convert to fixed point
> simd16scalari vXi, vYi;
> @@ -2184,6 +2197,57 @@ void SIMDAPI BinPoints_simd16(
> AR_END(FEBinPoints, 1);
> }
>
> +
> +void SIMDAPI BinPoints_simd16(
> + DRAW_CONTEXT *pDC,
> + PA_STATE& pa,
> + uint32_t workerId,
> + simd16vector prim[3],
> + uint32_t primMask,
> + simd16scalari primID,
> + simd16scalari viewportIdx)
> +{
> + simd16vector& primVerts = prim[0];
> +
> + const API_STATE& state = GetApiState(pDC);
> + const SWR_FRONTEND_STATE& feState = state.frontendState;
> + const SWR_RASTSTATE& rastState = state.rastState;
> +
> + if (!feState.vpTransformDisable)
> + {
> + // perspective divide
> + simd16scalar vRecipW0 = _simd16_div_ps(_simd16_set1_ps(1.0f), primVerts.w);
> +
> + primVerts.x = _simd16_mul_ps(primVerts.x, vRecipW0);
> + primVerts.y = _simd16_mul_ps(primVerts.y, vRecipW0);
> + primVerts.z = _simd16_mul_ps(primVerts.z, vRecipW0);
> +
> + // viewport transform to screen coords
> + if (state.gsState.emitsViewportArrayIndex)
> + {
> + viewportTransform<1>(&primVerts, state.vpMatrices, viewportIdx);
> + }
> + else
> + {
> + viewportTransform<1>(&primVerts, state.vpMatrices);
> + }
> + }
> +
> + const simd16scalar offset = g_pixelOffsets_simd16[rastState.pixelLocation];
> +
> + primVerts.x = _simd16_add_ps(primVerts.x, offset);
> + primVerts.y = _simd16_add_ps(primVerts.y, offset);
> +
> + BinPostSetupPoints_simd16(
> + pDC,
> + pa,
> + workerId,
> + prim,
> + primMask,
> + primID,
> + viewportIdx);
> +}
> +
> #endif
> //////////////////////////////////////////////////////////////////////////
> /// @brief Bin SIMD lines to the backend.
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list