[Mesa-dev] [PATCH 3/5] swr: [rasterizer] buckets cleanup

Tim Rowley timothy.o.rowley at intel.com
Wed Jul 6 21:51:45 UTC 2016


---
 .../swr/rasterizer/common/rdtsc_buckets.cpp        | 16 ++++++++++-
 .../drivers/swr/rasterizer/common/rdtsc_buckets.h  | 33 ++++++++++++++++------
 .../swr/rasterizer/common/rdtsc_buckets_shared.h   |  2 ++
 .../drivers/swr/rasterizer/core/rdtsc_core.h       |  4 +--
 4 files changed, 43 insertions(+), 12 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/common/rdtsc_buckets.cpp b/src/gallium/drivers/swr/rasterizer/common/rdtsc_buckets.cpp
index 412182f..288b071 100644
--- a/src/gallium/drivers/swr/rasterizer/common/rdtsc_buckets.cpp
+++ b/src/gallium/drivers/swr/rasterizer/common/rdtsc_buckets.cpp
@@ -40,6 +40,10 @@
 
 THREAD UINT tlsThreadId = 0;
 
+BucketManager::~BucketManager()
+{
+}
+
 void BucketManager::RegisterThread(const std::string& name)
 {
     // lazy evaluate threadviz knob
@@ -51,7 +55,7 @@ void BucketManager::RegisterThread(const std::string& name)
         mThreadVizDir = str.str();
         CreateDirectory(mThreadVizDir.c_str(), NULL);
 
-        mThreadViz = true;
+        mThreadViz = KNOB_BUCKETS_ENABLE_THREADVIZ;
     }
 
     BUCKET_THREAD newThread;
@@ -207,12 +211,22 @@ void BucketManager::PrintReport(const std::string& filename)
             PrintThread(f, thread);
             fprintf(f, "\n");
         }
+
         mThreadMutex.unlock();
 
         fclose(f);
     }
 }
 
+
+void BucketManager::StartCapture()
+{
+
+    printf("Capture Starting\n");
+
+    mCapturing = true;
+}
+
 void BucketManager_StartBucket(BucketManager* pBucketMgr, uint32_t id)
 {
     pBucketMgr->StartBucket(id);
diff --git a/src/gallium/drivers/swr/rasterizer/common/rdtsc_buckets.h b/src/gallium/drivers/swr/rasterizer/common/rdtsc_buckets.h
index fe25e77..e50a8a5 100644
--- a/src/gallium/drivers/swr/rasterizer/common/rdtsc_buckets.h
+++ b/src/gallium/drivers/swr/rasterizer/common/rdtsc_buckets.h
@@ -36,6 +36,7 @@
 
 #include "rdtsc_buckets_shared.h"
 
+
 // unique thread id stored in thread local storage
 extern THREAD UINT tlsThreadId;
 
@@ -48,6 +49,7 @@ class BucketManager
 {
 public:
     BucketManager() { }
+    ~BucketManager();
 
     // removes all registered thread data
     void ClearThreads()
@@ -92,11 +94,9 @@ public:
     // print report
     void PrintReport(const std::string& filename);
 
+
     // start capturing
-    INLINE void StartCapture()
-    {
-        mCapturing = true;
-    }
+    void StartCapture();
 
     // stop capturing
     INLINE void StopCapture()
@@ -117,6 +117,9 @@ public:
                 }
             }
         }
+
+        mDoneCapturing = true;
+        printf("Capture Stopped\n");
     }
 
     // start a bucket
@@ -129,13 +132,15 @@ public:
 
         BUCKET_THREAD& bt = mThreads[tlsThreadId];
 
+        uint64_t tsc = __rdtsc();
+
         // if threadviz is enabled, only need to dump start info to threads viz file
         if (mThreadViz)
         {
             SWR_ASSERT(bt.vizFile != nullptr);
             if (mBuckets[id].enableThreadViz)
             {
-                VIZ_START_DATA data{ VIZ_START, id, __rdtsc() };
+                VIZ_START_DATA data{ VIZ_START, id, tsc };
                 Serialize(bt.vizFile, data);
             }
         }
@@ -148,12 +153,13 @@ public:
             BUCKET &child = bt.pCurrent->children[id];
             child.pParent = bt.pCurrent;
             child.id = id;
-            child.start = __rdtsc();
+            child.start = tsc;
 
             // update thread's currently executing bucket
             bt.pCurrent = &child;
         }
 
+
         bt.level++;
     }
 
@@ -163,14 +169,19 @@ public:
         SWR_ASSERT(tlsThreadId < mThreads.size());
         BUCKET_THREAD &bt = mThreads[tlsThreadId];
 
-        if (bt.level == 0) return;
+        if (bt.level == 0)
+        {
+            return;
+        }
+
+        uint64_t tsc = __rdtsc();
 
         if (mThreadViz)
         {
             SWR_ASSERT(bt.vizFile != nullptr);
             if (mBuckets[id].enableThreadViz)
             {
-                VIZ_STOP_DATA data{ VIZ_STOP, __rdtsc() };
+                VIZ_STOP_DATA data{ VIZ_STOP, tsc };
                 Serialize(bt.vizFile, data);
             }
         }
@@ -179,7 +190,7 @@ public:
             if (bt.pCurrent->start == 0) return;
             SWR_ASSERT(bt.pCurrent->id == id, "Mismatched buckets detected");
 
-            bt.pCurrent->elapsed += (__rdtsc() - bt.pCurrent->start);
+            bt.pCurrent->elapsed += (tsc - bt.pCurrent->start);
             bt.pCurrent->count++;
 
             // pop to parent
@@ -224,11 +235,15 @@ private:
     // is capturing currently enabled
     volatile bool mCapturing{ false };
 
+    // has capturing completed
+    volatile bool mDoneCapturing{ false };
+
     std::mutex mThreadMutex;
 
     // enable threadviz
     bool mThreadViz{ false };
     std::string mThreadVizDir;
+
 };
 
 
diff --git a/src/gallium/drivers/swr/rasterizer/common/rdtsc_buckets_shared.h b/src/gallium/drivers/swr/rasterizer/common/rdtsc_buckets_shared.h
index 34c322e..f6e75cd 100644
--- a/src/gallium/drivers/swr/rasterizer/common/rdtsc_buckets_shared.h
+++ b/src/gallium/drivers/swr/rasterizer/common/rdtsc_buckets_shared.h
@@ -58,6 +58,7 @@ struct BUCKET_DESC
     uint32_t color;
 };
 
+
 struct BUCKET_THREAD
 {
     // name of thread, used in reports
@@ -78,6 +79,7 @@ struct BUCKET_THREAD
     // threadviz file object
     FILE* vizFile{ nullptr };
 
+
     BUCKET_THREAD() {}
     BUCKET_THREAD(const BUCKET_THREAD& that)
     {
diff --git a/src/gallium/drivers/swr/rasterizer/core/rdtsc_core.h b/src/gallium/drivers/swr/rasterizer/core/rdtsc_core.h
index 36f36ab..11b3eae 100644
--- a/src/gallium/drivers/swr/rasterizer/core/rdtsc_core.h
+++ b/src/gallium/drivers/swr/rasterizer/core/rdtsc_core.h
@@ -169,12 +169,12 @@ INLINE void rdtscEndFrame()
 {
     gCurrentFrame++;
 
-    if (gCurrentFrame == KNOB_BUCKETS_START_FRAME)
+    if (gCurrentFrame == KNOB_BUCKETS_START_FRAME && KNOB_BUCKETS_START_FRAME < KNOB_BUCKETS_END_FRAME)
     {
         gBucketMgr.StartCapture();
     }
 
-    if (gCurrentFrame == KNOB_BUCKETS_END_FRAME)
+    if (gCurrentFrame == KNOB_BUCKETS_END_FRAME && KNOB_BUCKETS_START_FRAME < KNOB_BUCKETS_END_FRAME)
     {
         gBucketMgr.StopCapture();
         gBucketMgr.PrintReport("rdtsc.txt");
-- 
1.9.1



More information about the mesa-dev mailing list