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 <timothy.o.rowley@intel.com>
This commit is contained in:
Bruce Cherniak 2016-05-24 15:00:17 -05:00 committed by Tim Rowley
parent 978ab88858
commit c8835a5924
7 changed files with 17 additions and 9 deletions

View File

@ -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,

View File

@ -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);
}

View File

@ -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,

View File

@ -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 ||

View File

@ -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
};

View File

@ -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),

View File

@ -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;