diff options
author | Tim Rowley <[email protected]> | 2016-07-25 16:24:58 -0600 |
---|---|---|
committer | Tim Rowley <[email protected]> | 2016-08-04 14:38:34 -0500 |
commit | 57b07498d239745c13d4b8db0e9bf32516a770c0 (patch) | |
tree | d4465e43b61996b304fd1b5066c5e01868a284b9 /src | |
parent | 191786d0f473de32d025e94ef1eb2bc45296255f (diff) |
swr: [rasterizer core] update sync handling
Sync now uses a callback to ensure that it's called by the last
thread moving past a DC. This will help with the new counter
handling.
Signed-off-by: Tim Rowley <[email protected]>
Diffstat (limited to 'src')
5 files changed, 15 insertions, 15 deletions
diff --git a/src/gallium/drivers/swr/rasterizer/core/api.cpp b/src/gallium/drivers/swr/rasterizer/core/api.cpp index 8a2787beb7e..21b9e3f8c7d 100644 --- a/src/gallium/drivers/swr/rasterizer/core/api.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/api.cpp @@ -334,6 +334,7 @@ DRAW_CONTEXT* GetDrawContext(SWR_CONTEXT *pContext, bool isSplitDraw = false) pCurDrawContext->doneFE = false; pCurDrawContext->FeLock = 0; pCurDrawContext->threadsDone = 0; + pCurDrawContext->retireCallback.pfnCallbackFunc = nullptr; // Assign unique drawId for this DC pCurDrawContext->drawId = pContext->dcRing.GetHead(); @@ -400,13 +401,12 @@ void SwrSync(HANDLE hContext, PFN_CALLBACK_FUNC pfnFunc, uint64_t userData, uint pDC->FeWork.type = SYNC; pDC->FeWork.pfnWork = ProcessSync; - pDC->FeWork.desc.sync.pfnCallbackFunc = pfnFunc; - pDC->FeWork.desc.sync.userData = userData; - pDC->FeWork.desc.sync.userData2 = userData2; - pDC->FeWork.desc.sync.userData3 = userData3; - // cannot execute until all previous draws have completed - pDC->dependent = true; + // Setup callback function + pDC->retireCallback.pfnCallbackFunc = pfnFunc; + pDC->retireCallback.userData = userData; + pDC->retireCallback.userData2 = userData2; + pDC->retireCallback.userData3 = userData3; //enqueue QueueDraw(pContext); diff --git a/src/gallium/drivers/swr/rasterizer/core/backend.cpp b/src/gallium/drivers/swr/rasterizer/core/backend.cpp index 81abb29e892..e0392d056d5 100644 --- a/src/gallium/drivers/swr/rasterizer/core/backend.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/backend.cpp @@ -80,16 +80,9 @@ void ProcessComputeBE(DRAW_CONTEXT* pDC, uint32_t workerId, uint32_t threadGroup void ProcessSyncBE(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t macroTile, void *pUserData) { - SYNC_DESC *pSync = (SYNC_DESC*)pUserData; - uint32_t x, y; MacroTileMgr::getTileIndices(macroTile, x, y); SWR_ASSERT(x == 0 && y == 0); - - if (pSync->pfnCallbackFunc != nullptr) - { - pSync->pfnCallbackFunc(pSync->userData, pSync->userData2, pSync->userData3); - } } void ProcessQueryStatsBE(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t macroTile, void *pUserData) diff --git a/src/gallium/drivers/swr/rasterizer/core/context.h b/src/gallium/drivers/swr/rasterizer/core/context.h index 13dcdfca2ee..70472b4bf98 100644 --- a/src/gallium/drivers/swr/rasterizer/core/context.h +++ b/src/gallium/drivers/swr/rasterizer/core/context.h @@ -392,6 +392,8 @@ struct DRAW_CONTEXT volatile OSALIGNLINE(uint32_t) FeLock; volatile int64_t threadsDone; + + SYNC_DESC retireCallback; // Call this func when this DC is retired. }; static_assert((sizeof(DRAW_CONTEXT) & 63) == 0, "Invalid size for DRAW_CONTEXT"); diff --git a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp index c797c042d1c..61119d986dd 100644 --- a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp @@ -72,11 +72,9 @@ void ProcessSync( uint32_t workerId, void *pUserData) { - SYNC_DESC *pSync = (SYNC_DESC*)pUserData; BE_WORK work; work.type = SYNC; work.pfnWork = ProcessSyncBE; - work.desc.sync = *pSync; MacroTileMgr *pTileMgr = pDC->pTileMgr; pTileMgr->enqueue(0, 0, &work); diff --git a/src/gallium/drivers/swr/rasterizer/core/threads.cpp b/src/gallium/drivers/swr/rasterizer/core/threads.cpp index 7e76c4bdda7..0800d17aec2 100644 --- a/src/gallium/drivers/swr/rasterizer/core/threads.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/threads.cpp @@ -328,6 +328,13 @@ INLINE int64_t CompleteDrawContextInl(SWR_CONTEXT* pContext, DRAW_CONTEXT* pDC) if (result == 0) { + if (pDC->retireCallback.pfnCallbackFunc) + { + pDC->retireCallback.pfnCallbackFunc(pDC->retireCallback.userData, + pDC->retireCallback.userData2, + pDC->retireCallback.userData3); + } + // Cleanup memory allocations pDC->pArena->Reset(true); if (!pDC->isCompute) |