[Mesa-dev] [PATCH] swr: [rasterizer] Correctly select optimized primitive assembly.

Rowley, Timothy O timothy.o.rowley at intel.com
Wed May 25 16:55:04 UTC 2016


Reviewed-by: Tim Rowley <timothy.o.rowley at intel.com>

> On May 24, 2016, at 3:00 PM, Bruce Cherniak <bruce.cherniak at intel.com> wrote:
> 
> Indexed primitives were always using cut-aware primitive assembly,
> whether primitive_restart was enabled or not.  Correctly pass down
> primitive_restart and select optimized PA when possible.
> ---
> src/gallium/drivers/swr/rasterizer/core/api.cpp    |    2 ++
> .../drivers/swr/rasterizer/core/frontend.cpp       |    6 ++++--
> src/gallium/drivers/swr/rasterizer/core/frontend.h |    1 +
> src/gallium/drivers/swr/rasterizer/core/pa.h       |    4 ++--
> src/gallium/drivers/swr/rasterizer/core/state.h    |    3 ++-
> src/gallium/drivers/swr/swr_draw.cpp               |    6 ++++++
> src/gallium/drivers/swr/swr_state.cpp              |    4 ----
> 7 files changed, 17 insertions(+), 9 deletions(-)
> 
> diff --git a/src/gallium/drivers/swr/rasterizer/core/api.cpp b/src/gallium/drivers/swr/rasterizer/core/api.cpp
> index 8e0c1e1..2e6f8b3 100644
> --- a/src/gallium/drivers/swr/rasterizer/core/api.cpp
> +++ b/src/gallium/drivers/swr/rasterizer/core/api.cpp
> @@ -1069,6 +1069,7 @@ void DrawInstanced(
>         pDC->FeWork.type = DRAW;
>         pDC->FeWork.pfnWork = GetProcessDrawFunc(
>             false,  // IsIndexed
> +            false, // bEnableCutIndex
>             pState->tsState.tsEnable,
>             pState->gsState.gsEnable,
>             pState->soState.soEnable,
> @@ -1202,6 +1203,7 @@ void DrawIndexedInstance(
>         pDC->FeWork.type = DRAW;
>         pDC->FeWork.pfnWork = GetProcessDrawFunc(
>             true,   // IsIndexed
> +            pState->frontendState.bEnableCutIndex,
>             pState->tsState.tsEnable,
>             pState->gsState.gsEnable,
>             pState->soState.soEnable,
> diff --git a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
> index d6643c6..ef90a24 100644
> --- a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
> +++ b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
> @@ -1159,6 +1159,7 @@ static void TessellationStages(
> /// @param pUserData - Pointer to DRAW_WORK
> template <
>     typename IsIndexedT,
> +    typename IsCutIndexEnabledT,
>     typename HasTessellationT,
>     typename HasGeometryShaderT,
>     typename HasStreamOutT,
> @@ -1283,7 +1284,7 @@ void ProcessDraw(
>     }
> 
>     // choose primitive assembler
> -    PA_FACTORY<IsIndexedT> paFactory(pDC, state.topology, work.numVerts);
> +    PA_FACTORY<IsIndexedT, IsCutIndexEnabledT> paFactory(pDC, state.topology, work.numVerts);
>     PA_STATE& pa = paFactory.GetPA();
> 
>     /// @todo: temporarily move instance loop in the FE to ensure SO ordering
> @@ -1434,12 +1435,13 @@ struct FEDrawChooser
> // Selector for correct templated Draw front-end function
> PFN_FE_WORK_FUNC GetProcessDrawFunc(
>     bool IsIndexed,
> +    bool IsCutIndexEnabled,
>     bool HasTessellation,
>     bool HasGeometryShader,
>     bool HasStreamOut,
>     bool HasRasterization)
> {
> -    return TemplateArgUnroller<FEDrawChooser>::GetFunc(IsIndexed, HasTessellation, HasGeometryShader, HasStreamOut, HasRasterization);
> +    return TemplateArgUnroller<FEDrawChooser>::GetFunc(IsIndexed, IsCutIndexEnabled, HasTessellation, HasGeometryShader, HasStreamOut, HasRasterization);
> }
> 
> 
> diff --git a/src/gallium/drivers/swr/rasterizer/core/frontend.h b/src/gallium/drivers/swr/rasterizer/core/frontend.h
> index e1b0400..dfd3987 100644
> --- a/src/gallium/drivers/swr/rasterizer/core/frontend.h
> +++ b/src/gallium/drivers/swr/rasterizer/core/frontend.h
> @@ -322,6 +322,7 @@ uint32_t NumVertsPerPrim(PRIMITIVE_TOPOLOGY topology, bool includeAdjVerts);
> // ProcessDraw front-end function.  All combinations of parameter values are available
> PFN_FE_WORK_FUNC GetProcessDrawFunc(
>     bool IsIndexed,
> +    bool IsCutIndexEnabled,
>     bool HasTessellation,
>     bool HasGeometryShader,
>     bool HasStreamOut,
> diff --git a/src/gallium/drivers/swr/rasterizer/core/pa.h b/src/gallium/drivers/swr/rasterizer/core/pa.h
> index c98ea14..6aa73c1 100644
> --- a/src/gallium/drivers/swr/rasterizer/core/pa.h
> +++ b/src/gallium/drivers/swr/rasterizer/core/pa.h
> @@ -1149,14 +1149,14 @@ private:
> 
> // Primitive Assembler factory class, responsible for creating and initializing the correct assembler
> // based on state.
> -template <typename IsIndexedT>
> +template <typename IsIndexedT, typename IsCutIndexEnabledT>
> struct PA_FACTORY
> {
>     PA_FACTORY(DRAW_CONTEXT* pDC, PRIMITIVE_TOPOLOGY in_topo, uint32_t numVerts) : topo(in_topo)
>     {
> #if KNOB_ENABLE_CUT_AWARE_PA == TRUE
>         const API_STATE& state = GetApiState(pDC);
> -        if ((IsIndexedT::value && (
> +        if ((IsIndexedT::value && IsCutIndexEnabledT::value && (
>             topo == TOP_TRIANGLE_STRIP || topo == TOP_POINT_LIST ||
>             topo == TOP_LINE_LIST || topo == TOP_LINE_STRIP ||
>             topo == TOP_TRIANGLE_LIST || topo == TOP_LINE_LIST_ADJ ||
> diff --git a/src/gallium/drivers/swr/rasterizer/core/state.h b/src/gallium/drivers/swr/rasterizer/core/state.h
> index f4813e4..5156c6b 100644
> --- a/src/gallium/drivers/swr/rasterizer/core/state.h
> +++ b/src/gallium/drivers/swr/rasterizer/core/state.h
> @@ -799,6 +799,7 @@ struct SWR_FRONTEND_STATE
>     // skip clip test, perspective divide, and viewport transform
>     // intended for verts in screen space
>     bool vpTransformDisable;
> +    bool bEnableCutIndex;
>     union
>     {
>         struct
> @@ -808,7 +809,7 @@ struct SWR_FRONTEND_STATE
>             uint32_t triStripList : 2;
>         };
>         uint32_t bits;
> -    }provokingVertex;
> +    } provokingVertex;
>     uint32_t topologyProvokingVertex; // provoking vertex for the draw topology
> };
> 
> diff --git a/src/gallium/drivers/swr/swr_draw.cpp b/src/gallium/drivers/swr/swr_draw.cpp
> index 428bf78..7a4c896 100644
> --- a/src/gallium/drivers/swr/swr_draw.cpp
> +++ b/src/gallium/drivers/swr/swr_draw.cpp
> @@ -159,6 +159,12 @@ swr_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
> 
>    SwrSetFetchFunc(ctx->swrContext, velems->fsFunc);
> 
> +   /* Set up frontend state
> +    * XXX setup provokingVertex & topologyProvokingVertex */
> +   SWR_FRONTEND_STATE feState = {0};
> +   feState.bEnableCutIndex = info->primitive_restart;
> +   SwrSetFrontendState(ctx->swrContext, &feState);
> +
>    if (info->indexed)
>       SwrDrawIndexedInstanced(ctx->swrContext,
>                               swr_convert_prim_topology(info->mode),
> diff --git a/src/gallium/drivers/swr/swr_state.cpp b/src/gallium/drivers/swr/swr_state.cpp
> index a7ae9df..f9326f3 100644
> --- a/src/gallium/drivers/swr/swr_state.cpp
> +++ b/src/gallium/drivers/swr/swr_state.cpp
> @@ -1347,10 +1347,6 @@ swr_update_derived(struct pipe_context *pipe,
> 
>    SwrSetLinkage(ctx->swrContext, linkage, NULL);
> 
> -   // set up frontend state
> -   SWR_FRONTEND_STATE feState = {0};
> -   SwrSetFrontendState(ctx->swrContext, &feState);
> -
>    // set up backend state
>    SWR_BACKEND_STATE backendState = {0};
>    backendState.numAttributes = 1;
> -- 
> 1.7.1
> 
> _______________________________________________
> 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