mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2024-11-27 12:14:10 +08:00
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:
parent
978ab88858
commit
c8835a5924
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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 ||
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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),
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user