From 813e89c0cc0ea6a6ed4b69303073995b4c4c7666 Mon Sep 17 00:00:00 2001 From: Tim Rowley Date: Tue, 22 Mar 2016 15:13:29 -0600 Subject: [PATCH] swr: [rasterizer core] Cleanup state ring arena after last draw that references it completes Rather than waiting for the API thread to re-use it. --- src/gallium/drivers/swr/rasterizer/core/api.cpp | 6 ++++++ src/gallium/drivers/swr/rasterizer/core/context.h | 2 ++ src/gallium/drivers/swr/rasterizer/core/threads.cpp | 8 ++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/core/api.cpp b/src/gallium/drivers/swr/rasterizer/core/api.cpp index 6ebb3f87f7a..591342239d3 100644 --- a/src/gallium/drivers/swr/rasterizer/core/api.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/api.cpp @@ -297,6 +297,8 @@ DRAW_CONTEXT* GetDrawContext(SWR_CONTEXT *pContext, bool isSplitDraw = false) // Assign unique drawId for this DC pCurDrawContext->drawId = pContext->dcRing.GetHead(); + + pCurDrawContext->cleanupState = true; } else { @@ -1076,6 +1078,8 @@ void DrawInstanced( pDC->FeWork.desc.draw.startPrimID = draw * primsPerDraw; pDC->FeWork.desc.draw.startVertexID = draw * maxVertsPerDraw; + pDC->cleanupState = (remainingVerts == numVertsForDraw); + //enqueue DC QueueDraw(pContext); @@ -1210,6 +1214,8 @@ void DrawIndexedInstance( pDC->FeWork.desc.draw.baseVertex = baseVertex; pDC->FeWork.desc.draw.startPrimID = draw * primsPerDraw; + pDC->cleanupState = (remainingIndices == numIndicesForDraw); + //enqueue DC QueueDraw(pContext); diff --git a/src/gallium/drivers/swr/rasterizer/core/context.h b/src/gallium/drivers/swr/rasterizer/core/context.h index b8f15cae4a3..39f23372a18 100644 --- a/src/gallium/drivers/swr/rasterizer/core/context.h +++ b/src/gallium/drivers/swr/rasterizer/core/context.h @@ -402,6 +402,8 @@ struct DRAW_CONTEXT CachingArena* pArena; uint8_t* pSpillFill[KNOB_MAX_NUM_THREADS]; // Scratch space used for spill fills. + + bool cleanupState; // True if this is the last draw using an entry in the state ring. }; INLINE const API_STATE& GetApiState(const DRAW_CONTEXT* pDC) diff --git a/src/gallium/drivers/swr/rasterizer/core/threads.cpp b/src/gallium/drivers/swr/rasterizer/core/threads.cpp index ce8646fb28d..521a306b96e 100644 --- a/src/gallium/drivers/swr/rasterizer/core/threads.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/threads.cpp @@ -287,11 +287,15 @@ INLINE void CompleteDrawContext(SWR_CONTEXT* pContext, DRAW_CONTEXT* pDC) if (result == 0) { - _ReadWriteBarrier(); - // Cleanup memory allocations pDC->pArena->Reset(true); pDC->pTileMgr->initialize(); + if (pDC->cleanupState) + { + pDC->pState->pArena->Reset(true); + } + + _ReadWriteBarrier(); pContext->dcRing.Dequeue(); // Remove from tail } -- 2.30.2