diff options
author | Tim Rowley <[email protected]> | 2016-09-22 18:00:47 -0500 |
---|---|---|
committer | Tim Rowley <[email protected]> | 2016-10-03 09:57:25 -0500 |
commit | 4198520a82463aa392762ec156231b95bf2685ac (patch) | |
tree | 0c28dc51c50b097c9cdd67bb1f3dd78d3fef6b94 | |
parent | aaeb07989ee30c589b034a551f71e23e7b8056b2 (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]>
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; |