[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