Reviewed-by: Tim Rowley <timothy.o.row...@intel.com> > On May 24, 2016, at 3:00 PM, Bruce Cherniak <bruce.chern...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev