[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