summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Rowley <[email protected]>2016-09-22 18:00:47 -0500
committerTim Rowley <[email protected]>2016-10-03 09:57:25 -0500
commit4198520a82463aa392762ec156231b95bf2685ac (patch)
tree0c28dc51c50b097c9cdd67bb1f3dd78d3fef6b94
parentaaeb07989ee30c589b034a551f71e23e7b8056b2 (diff)
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 <[email protected]>
-rw-r--r--src/gallium/drivers/swr/rasterizer/core/api.cpp12
-rw-r--r--src/gallium/drivers/swr/rasterizer/core/backend.cpp2
-rw-r--r--src/gallium/drivers/swr/rasterizer/core/frontend.cpp2
-rw-r--r--src/gallium/drivers/swr/rasterizer/core/threads.cpp5
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 63f764680d6..1702fa0dfdf 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 0a0001d0776..8b7ce6a75a3 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 5d549873f36..2bc11c8095f 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 4f331532111..f22f882a458 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;