From c8835a592471a0238e296f6529b5dadb431cc622 Mon Sep 17 00:00:00 2001 From: Bruce Cherniak Date: Tue, 24 May 2016 15:00:17 -0500 Subject: [PATCH] swr: [rasterizer] Correctly select optimized primitive assembly. 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. Reviewed-by: Tim Rowley --- src/gallium/drivers/swr/rasterizer/core/api.cpp | 2 ++ src/gallium/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 paFactory(pDC, state.topology, work.numVerts); + PA_FACTORY 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::GetFunc(IsIndexed, HasTessellation, HasGeometryShader, HasStreamOut, HasRasterization); + return TemplateArgUnroller::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 +template 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; -- 2.7.4