[Mesa-dev] [PATCH 10/31] swr/rast: Add clipper stats.

George Kyriazis george.kyriazis at intel.com
Tue Feb 13 22:42:28 UTC 2018


Clipper event is now:

event ClipperEvent
{
    uint32_t drawId;
    uint32_t trivialRejectCount;
    uint32_t trivialAcceptCount;
    uint32_t mustClipCount;
};
---
 .../drivers/swr/rasterizer/archrast/archrast.cpp       | 18 +++++++++++-------
 .../drivers/swr/rasterizer/archrast/events.proto       | 10 ++++++----
 .../swr/rasterizer/archrast/events_private.proto       | 18 ++++++++++++------
 src/gallium/drivers/swr/rasterizer/core/clip.h         |  2 ++
 4 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/archrast/archrast.cpp b/src/gallium/drivers/swr/rasterizer/archrast/archrast.cpp
index afea1d3..49e7764 100644
--- a/src/gallium/drivers/swr/rasterizer/archrast/archrast.cpp
+++ b/src/gallium/drivers/swr/rasterizer/archrast/archrast.cpp
@@ -50,7 +50,9 @@ namespace ArchRast
 
     struct CStats
     {
-        uint32_t clippedVerts = 0;
+        uint32_t trivialRejectCount;
+        uint32_t trivialAcceptCount;
+        uint32_t mustClipCount;
     };
 
     struct TEStats
@@ -164,6 +166,13 @@ namespace ArchRast
         }
 
 
+        virtual void Handle(const ClipInfoEvent& event)
+        {
+            mClipper.mustClipCount += _mm_popcnt_u32(event.data.clipMask);
+            mClipper.trivialRejectCount += event.data.numInvocations - _mm_popcnt_u32(event.data.validMask);
+            mClipper.trivialAcceptCount += _mm_popcnt_u32(event.data.validMask & ~event.data.clipMask);
+        }
+
         // Flush cached events for this draw
         virtual void FlushDraw(uint32_t drawId)
         {
@@ -202,7 +211,7 @@ namespace ArchRast
         virtual void Handle(const FrontendDrawEndEvent& event)
         {
             //Clipper
-            EventHandlerFile::Handle(VertsClipped(event.data.drawId, mClipper.clippedVerts));
+            EventHandlerFile::Handle(ClipperEvent(event.data.drawId, mClipper.trivialRejectCount, mClipper.trivialAcceptCount, mClipper.mustClipCount));
 
             //Tesselator
             EventHandlerFile::Handle(TessPrims(event.data.drawId, mTS.inputPrims));
@@ -225,11 +234,6 @@ namespace ArchRast
             mGS.vertsInput += event.data.vertsInput;
         }
 
-        virtual void Handle(const ClipVertexCount& event)
-        {
-            mClipper.clippedVerts += (_mm_popcnt_u32(event.data.primMask) * event.data.vertsPerPrim);
-        }
-
         virtual void Handle(const TessPrimCount& event)
         {
             mTS.inputPrims += event.data.primCount;
diff --git a/src/gallium/drivers/swr/rasterizer/archrast/events.proto b/src/gallium/drivers/swr/rasterizer/archrast/events.proto
index f9be584..c96e7a1 100644
--- a/src/gallium/drivers/swr/rasterizer/archrast/events.proto
+++ b/src/gallium/drivers/swr/rasterizer/archrast/events.proto
@@ -262,14 +262,16 @@ event GSVertsInput
     uint64_t vertsInput;
 };
 
-event VertsClipped
+event TessPrims
 {
     uint32_t drawId;
-    uint64_t clipCount;
+    uint64_t primCount;
 };
 
-event TessPrims
+event ClipperEvent
 {
     uint32_t drawId;
-    uint64_t primCount;
+    uint32_t trivialRejectCount;
+    uint32_t trivialAcceptCount;
+    uint32_t mustClipCount;
 };
diff --git a/src/gallium/drivers/swr/rasterizer/archrast/events_private.proto b/src/gallium/drivers/swr/rasterizer/archrast/events_private.proto
index e0fe9b9..f6dde33 100644
--- a/src/gallium/drivers/swr/rasterizer/archrast/events_private.proto
+++ b/src/gallium/drivers/swr/rasterizer/archrast/events_private.proto
@@ -90,12 +90,6 @@ event FrontendDrawEndEvent
     uint32_t drawId;
 };
 
-event ClipVertexCount
-{
-    uint64_t vertsPerPrim;
-    uint64_t primMask;
-};
-
 event TessPrimCount
 {
     uint64_t primCount;
@@ -107,3 +101,15 @@ event GSPrimInfo
     uint64_t primGeneratedCount;
     uint64_t vertsInput;
 };
+
+// validMask is primitives that still need to be clipped. They weren't rejected due to trivial reject or nan.
+// clipMask is primitives that need to be clipped. So trivial accepts will be 0 while validMask for that is 1.
+// Trivial reject is numInvocations - pop_cnt32(validMask)
+// Trivial accept is validMask & ~clipMask
+// Must clip count is pop_cnt32(clipMask)
+event ClipInfoEvent
+{
+    uint32_t numInvocations;
+    uint32_t validMask;
+    uint32_t clipMask;
+};
diff --git a/src/gallium/drivers/swr/rasterizer/core/clip.h b/src/gallium/drivers/swr/rasterizer/core/clip.h
index f47b4b0..1d336b6 100644
--- a/src/gallium/drivers/swr/rasterizer/core/clip.h
+++ b/src/gallium/drivers/swr/rasterizer/core/clip.h
@@ -715,6 +715,8 @@ public:
             clipMask = primMask & ComputeClipMask();
         }
 
+        AR_EVENT(ClipInfoEvent(numInvoc, validMask, clipMask));
+
         if (clipMask)
         {
             RDTSC_BEGIN(FEGuardbandClip, pa.pDC->drawId);
-- 
2.7.4



More information about the mesa-dev mailing list