Mesa (master): swr: [rasterizer core] archrast fixes

Tim Rowley torowley at kemper.freedesktop.org
Mon Oct 3 16:29:37 UTC 2016


Module: Mesa
Branch: master
Commit: 4198520a82463aa392762ec156231b95bf2685ac
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4198520a82463aa392762ec156231b95bf2685ac

Author: Tim Rowley <timothy.o.rowley at intel.com>
Date:   Thu Sep 22 18:00:47 2016 -0500

swr: [rasterizer core] archrast fixes

- Immediately sleep threads until thread data is initialized
- Fix some compile bugs with AR enabled

Signed-off-by: Tim Rowley <timothy.o.rowley at intel.com>

---

 src/gallium/drivers/swr/rasterizer/core/api.cpp      | 12 +++++++-----
 src/gallium/drivers/swr/rasterizer/core/backend.cpp  |  2 +-
 src/gallium/drivers/swr/rasterizer/core/frontend.cpp |  2 +-
 src/gallium/drivers/swr/rasterizer/core/threads.cpp  |  5 +++++
 4 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/core/api.cpp b/src/gallium/drivers/swr/rasterizer/core/api.cpp
index 63f7646..1702fa0 100644
--- a/src/gallium/drivers/swr/rasterizer/core/api.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/api.cpp
@@ -55,6 +55,11 @@ static INLINE SWR_CONTEXT* GetContext(HANDLE hContext)
     return (SWR_CONTEXT*)hContext;
 }
 
+void WakeAllThreads(SWR_CONTEXT *pContext)
+{
+    pContext->FifosNotEmpty.notify_all();
+}
+
 //////////////////////////////////////////////////////////////////////////
 /// @brief Create SWR Context.
 /// @param pCreateInfo - pointer to creation info.
@@ -154,6 +159,8 @@ HANDLE SwrCreateContext(
 
     pCreateInfo->contextSaveSize = sizeof(API_STATE);
 
+    WakeAllThreads(pContext);
+
     return (HANDLE)pContext;
 }
 
@@ -162,11 +169,6 @@ void CopyState(DRAW_STATE& dst, const DRAW_STATE& src)
     memcpy(&dst.state, &src.state, sizeof(API_STATE));
 }
 
-void WakeAllThreads(SWR_CONTEXT *pContext)
-{
-    pContext->FifosNotEmpty.notify_all();
-}
-
 template<bool IsDraw>
 void QueueWork(SWR_CONTEXT *pContext)
 {
diff --git a/src/gallium/drivers/swr/rasterizer/core/backend.cpp b/src/gallium/drivers/swr/rasterizer/core/backend.cpp
index 0a0001d..8b7ce6a 100644
--- a/src/gallium/drivers/swr/rasterizer/core/backend.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/backend.cpp
@@ -288,7 +288,7 @@ void ProcessStoreTileBE(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t macroTile
 
     AR_BEGIN(BEStoreTiles, pDC->drawId);
 
-#ifdef KNOB_ENABLE_RDTSC
+#if defined(KNOB_ENABLE_RDTSC) || defined(KNOB_ENABLE_AR)
     uint32_t numTiles = 0;
 #endif
     SWR_FORMAT srcFormat;
diff --git a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
index 5d54987..2bc11c8 100644
--- a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
@@ -1295,7 +1295,7 @@ void ProcessDraw(
         fetchInfo.StartVertex = work.startVertex;
     }
 
-#ifdef KNOB_ENABLE_RDTSC
+#if defined(KNOB_ENABLE_RDTSC) || defined(KNOB_ENABLE_AR)
     uint32_t numPrims = GetNumPrims(state.topology, work.numVerts);
 #endif
 
diff --git a/src/gallium/drivers/swr/rasterizer/core/threads.cpp b/src/gallium/drivers/swr/rasterizer/core/threads.cpp
index 4f33153..f22f882 100644
--- a/src/gallium/drivers/swr/rasterizer/core/threads.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/threads.cpp
@@ -718,6 +718,11 @@ DWORD workerThreadMain(LPVOID pData)
     //    the worker can safely increment its oldestDraw counter and move on to the next draw.
     std::unique_lock<std::mutex> lock(pContext->WaitLock, std::defer_lock);
 
+    // Suspend thread immediately. SwrCreateContext or QueueWork will wake this up again.
+    lock.lock();
+    pContext->FifosNotEmpty.wait(lock);
+    lock.unlock();
+
     auto threadHasWork = [&](uint32_t curDraw) { return curDraw != pContext->dcRing.GetHead(); };
 
     uint32_t curDrawBE = 0;




More information about the mesa-commit mailing list