[Mesa-dev] [PATCH] swr: [rasterizer] Correctly select optimized primitive assembly.
Bruce Cherniak
bruce.cherniak at intel.com
Tue May 24 20:00:17 UTC 2016
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
More information about the mesa-dev
mailing list