From 5a593bec16b1e5830bc57462abc0b056342ac876 Mon Sep 17 00:00:00 2001 From: Krzysztof Raszkowski Date: Thu, 13 Feb 2020 14:41:41 +0100 Subject: [PATCH] gallium/swr: fix rdtsc debug statistics mechanism Reviewed-by: Jan Zielinski Tested-by: Marge Bot Part-of: --- src/gallium/drivers/swr/rasterizer/core/api.h | 8 +++--- .../drivers/swr/rasterizer/core/backend.cpp | 2 +- .../drivers/swr/rasterizer/core/tilemgr.cpp | 10 +++---- .../swr/rasterizer/memory/InitMemory.h | 2 ++ .../swr/rasterizer/memory/LoadTile.cpp | 26 ++++++------------- .../drivers/swr/rasterizer/memory/LoadTile.h | 3 ++- .../swr/rasterizer/memory/StoreTile.cpp | 26 +++++++------------ .../drivers/swr/rasterizer/memory/StoreTile.h | 3 ++- src/gallium/drivers/swr/swr_memory.h | 22 ++++++++-------- 9 files changed, 44 insertions(+), 58 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/core/api.h b/src/gallium/drivers/swr/rasterizer/core/api.h index 29651c9beed..77f20e5834b 100644 --- a/src/gallium/drivers/swr/rasterizer/core/api.h +++ b/src/gallium/drivers/swr/rasterizer/core/api.h @@ -97,13 +97,13 @@ struct SWR_RECT ////////////////////////////////////////////////////////////////////////// /// @brief Function signature for load hot tiles -/// @param hPrivateContext - handle to private data +/// @param hDC - handle to DRAW_CONTEXT /// @param dstFormat - format of the hot tile /// @param renderTargetIndex - render target to store, can be color, depth or stencil /// @param x - destination x coordinate /// @param y - destination y coordinate /// @param pDstHotTile - pointer to the hot tile surface -typedef void(SWR_API* PFN_LOAD_TILE)(HANDLE hPrivateContext, +typedef void(SWR_API* PFN_LOAD_TILE)(HANDLE hDC, HANDLE hWorkerPrivateData, SWR_FORMAT dstFormat, SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, @@ -114,13 +114,13 @@ typedef void(SWR_API* PFN_LOAD_TILE)(HANDLE hPrivateContext ////////////////////////////////////////////////////////////////////////// /// @brief Function signature for store hot tiles -/// @param hPrivateContext - handle to private data +/// @param hDC - handle to DRAW_CONTEXT /// @param srcFormat - format of the hot tile /// @param renderTargetIndex - render target to store, can be color, depth or stencil /// @param x - destination x coordinate /// @param y - destination y coordinate /// @param pSrcHotTile - pointer to the hot tile surface -typedef void(SWR_API* PFN_STORE_TILE)(HANDLE hPrivateContext, +typedef void(SWR_API* PFN_STORE_TILE)(HANDLE hDC, HANDLE hWorkerPrivateData, SWR_FORMAT srcFormat, SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, diff --git a/src/gallium/drivers/swr/rasterizer/core/backend.cpp b/src/gallium/drivers/swr/rasterizer/core/backend.cpp index 49b163ee6ae..bb9d6f7dc52 100644 --- a/src/gallium/drivers/swr/rasterizer/core/backend.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/backend.cpp @@ -175,7 +175,7 @@ void ProcessStoreTileBE(DRAW_CONTEXT* pDC, int32_t destX = KNOB_MACROTILE_X_DIM * x; int32_t destY = KNOB_MACROTILE_Y_DIM * y; - pContext->pfnStoreTile(GetPrivateState(pDC), + pContext->pfnStoreTile(pDC, hWorkerPrivateData, srcFormat, attachment, diff --git a/src/gallium/drivers/swr/rasterizer/core/tilemgr.cpp b/src/gallium/drivers/swr/rasterizer/core/tilemgr.cpp index a23de56a0a5..a02fa336277 100644 --- a/src/gallium/drivers/swr/rasterizer/core/tilemgr.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/tilemgr.cpp @@ -184,7 +184,7 @@ HOTTILE* HotTileMgr::GetHotTile(SWR_CONTEXT* pContext, if (hotTile.state == HOTTILE_DIRTY) { - pContext->pfnStoreTile(GetPrivateState(pDC), + pContext->pfnStoreTile(pDC, hWorkerPrivateData, format, attachment, @@ -194,7 +194,7 @@ HOTTILE* HotTileMgr::GetHotTile(SWR_CONTEXT* pContext, hotTile.pBuffer); } - pContext->pfnLoadTile(GetPrivateState(pDC), + pContext->pfnLoadTile(pDC, hWorkerPrivateData, format, attachment, @@ -370,7 +370,7 @@ void HotTileMgr::InitializeHotTiles(SWR_CONTEXT* pContext, { RDTSC_BEGIN(pContext->pBucketMgr, BELoadTiles, pDC->drawId); // invalid hottile before draw requires a load from surface before we can draw to it - pContext->pfnLoadTile(GetPrivateState(pDC), + pContext->pfnLoadTile(pDC, hWorkerPrivateData, KNOB_COLOR_HOT_TILE_FORMAT, (SWR_RENDERTARGET_ATTACHMENT)(SWR_ATTACHMENT_COLOR0 + rtSlot), @@ -401,7 +401,7 @@ void HotTileMgr::InitializeHotTiles(SWR_CONTEXT* pContext, { RDTSC_BEGIN(pContext->pBucketMgr, BELoadTiles, pDC->drawId); // invalid hottile before draw requires a load from surface before we can draw to it - pContext->pfnLoadTile(GetPrivateState(pDC), + pContext->pfnLoadTile(pDC, hWorkerPrivateData, KNOB_DEPTH_HOT_TILE_FORMAT, SWR_ATTACHMENT_DEPTH, @@ -431,7 +431,7 @@ void HotTileMgr::InitializeHotTiles(SWR_CONTEXT* pContext, { RDTSC_BEGIN(pContext->pBucketMgr, BELoadTiles, pDC->drawId); // invalid hottile before draw requires a load from surface before we can draw to it - pContext->pfnLoadTile(GetPrivateState(pDC), + pContext->pfnLoadTile(pDC, hWorkerPrivateData, KNOB_STENCIL_HOT_TILE_FORMAT, SWR_ATTACHMENT_STENCIL, diff --git a/src/gallium/drivers/swr/rasterizer/memory/InitMemory.h b/src/gallium/drivers/swr/rasterizer/memory/InitMemory.h index 6838ddc701d..a3ed7b3cbdb 100644 --- a/src/gallium/drivers/swr/rasterizer/memory/InitMemory.h +++ b/src/gallium/drivers/swr/rasterizer/memory/InitMemory.h @@ -42,6 +42,7 @@ SWR_FUNC(void, SwrLoadHotTile, HANDLE hWorkerPrivateData, const SWR_SURFACE_STATE* pSrcSurface, + BucketManager* pBucketManager, SWR_FORMAT dstFormat, SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, uint32_t x, @@ -60,6 +61,7 @@ SWR_FUNC(void, SwrStoreHotTileToSurface, HANDLE hWorkerPrivateData, SWR_SURFACE_STATE* pDstSurface, + BucketManager* pBucketManager, SWR_FORMAT srcFormat, SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, uint32_t x, diff --git a/src/gallium/drivers/swr/rasterizer/memory/LoadTile.cpp b/src/gallium/drivers/swr/rasterizer/memory/LoadTile.cpp index 8033304d20c..a26d45d130f 100644 --- a/src/gallium/drivers/swr/rasterizer/memory/LoadTile.cpp +++ b/src/gallium/drivers/swr/rasterizer/memory/LoadTile.cpp @@ -27,21 +27,6 @@ ******************************************************************************/ #include "LoadTile.h" - -static void BUCKETS_START(UINT id) -{ -#ifdef KNOB_ENABLE_RDTSC - gBucketMgr.StartBucket(id); -#endif -} - -static void BUCKETS_STOP(UINT id) -{ -#ifdef KNOB_ENABLE_RDTSC - gBucketMgr.StopBucket(id); -#endif -} - // on demand buckets for load tiles static std::vector sBuckets(NUM_SWR_FORMATS, -1); static std::mutex sBucketMutex; @@ -56,6 +41,7 @@ static std::mutex sBucketMutex; void SwrLoadHotTile( HANDLE hWorkerPrivateData, const SWR_SURFACE_STATE *pSrcSurface, + BucketManager* pBucketMgr, SWR_FORMAT dstFormat, SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, uint32_t x, uint32_t y, uint32_t renderTargetArrayIndex, @@ -147,15 +133,19 @@ void SwrLoadHotTile( { const SWR_FORMAT_INFO& info = GetFormatInfo(pSrcSurface->format); BUCKET_DESC desc{ info.name, "", false, 0xffffffff }; - sBuckets[pSrcSurface->format] = gBucketMgr.RegisterBucket(desc); + sBuckets[pSrcSurface->format] = pBucketMgr->RegisterBucket(desc); } sBucketMutex.unlock(); } #endif - BUCKETS_START(sBuckets[pSrcSurface->format]); +#ifdef KNOB_ENABLE_RDTSC + pBucketMgr->StartBucket(sBuckets[pSrcSurface->format]); +#endif pfnLoadTiles(pSrcSurface, pDstHotTile, x, y, renderTargetArrayIndex); - BUCKETS_STOP(sBuckets[pSrcSurface->format]); +#ifdef KNOB_ENABLE_RDTSC + pBucketMgr->StopBucket(sBuckets[pSrcSurface->format]); +#endif } diff --git a/src/gallium/drivers/swr/rasterizer/memory/LoadTile.h b/src/gallium/drivers/swr/rasterizer/memory/LoadTile.h index 37be28c5ec7..f74c3fdf4b0 100644 --- a/src/gallium/drivers/swr/rasterizer/memory/LoadTile.h +++ b/src/gallium/drivers/swr/rasterizer/memory/LoadTile.h @@ -347,7 +347,8 @@ static INLINE void InitLoadTileDepthTable(PFN_LOAD_TILES(&table)[NUM_SWR_FORMATS void SwrLoadHotTile( HANDLE hWorkerPrivateData, const SWR_SURFACE_STATE *pSrcSurface, + BucketManager* pBucketMgr, SWR_FORMAT dstFormat, SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, uint32_t x, uint32_t y, uint32_t renderTargetArrayIndex, - uint8_t *pDstHotTile); \ No newline at end of file + uint8_t *pDstHotTile); diff --git a/src/gallium/drivers/swr/rasterizer/memory/StoreTile.cpp b/src/gallium/drivers/swr/rasterizer/memory/StoreTile.cpp index 53b82c4c12c..9fee13a045a 100644 --- a/src/gallium/drivers/swr/rasterizer/memory/StoreTile.cpp +++ b/src/gallium/drivers/swr/rasterizer/memory/StoreTile.cpp @@ -33,20 +33,6 @@ PFN_STORE_TILES sStoreTilesTableColor[SWR_TILE_MODE_COUNT][NUM_SWR_FORMATS] = {} PFN_STORE_TILES sStoreTilesTableDepth[SWR_TILE_MODE_COUNT][NUM_SWR_FORMATS] = {}; PFN_STORE_TILES sStoreTilesTableStencil[SWR_TILE_MODE_COUNT][NUM_SWR_FORMATS] = {}; -static void BUCKETS_START(UINT id) -{ -#ifdef KNOB_ENABLE_RDTSC - gBucketMgr.StartBucket(id); -#endif -} - -static void BUCKETS_STOP(UINT id) -{ -#ifdef KNOB_ENABLE_RDTSC - gBucketMgr.StopBucket(id); -#endif -} - // on demand buckets for store tiles static std::mutex sBucketMutex; static std::vector sBuckets(NUM_SWR_FORMATS, -1); @@ -61,6 +47,7 @@ static std::vector sBuckets(NUM_SWR_FORMATS, -1); void SwrStoreHotTileToSurface( HANDLE hWorkerPrivateData, SWR_SURFACE_STATE *pDstSurface, + BucketManager* pBucketMgr, SWR_FORMAT srcFormat, SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, uint32_t x, uint32_t y, uint32_t renderTargetArrayIndex, @@ -108,15 +95,20 @@ void SwrStoreHotTileToSurface( { const SWR_FORMAT_INFO& info = GetFormatInfo(pDstSurface->format); BUCKET_DESC desc{info.name, "", false, 0xffffffff}; - sBuckets[pDstSurface->format] = gBucketMgr.RegisterBucket(desc); + sBuckets[pDstSurface->format] = pBucketMgr->RegisterBucket(desc); } sBucketMutex.unlock(); } #endif - BUCKETS_START(sBuckets[pDstSurface->format]); +#ifdef KNOB_ENABLE_RDTSC + pBucketMgr->StartBucket(sBuckets[pDstSurface->format]); +#endif pfnStoreTiles(pSrcHotTile, pDstSurface, x, y, renderTargetArrayIndex); - BUCKETS_STOP(sBuckets[pDstSurface->format]); +#ifdef KNOB_ENABLE_RDTSC + pBucketMgr->StopBucket(sBuckets[pDstSurface->format]); +#endif + } diff --git a/src/gallium/drivers/swr/rasterizer/memory/StoreTile.h b/src/gallium/drivers/swr/rasterizer/memory/StoreTile.h index 9b7f5aa3efc..2d32e90330e 100644 --- a/src/gallium/drivers/swr/rasterizer/memory/StoreTile.h +++ b/src/gallium/drivers/swr/rasterizer/memory/StoreTile.h @@ -2044,7 +2044,8 @@ void InitStoreTilesTableStencil( void SwrStoreHotTileToSurface( HANDLE hWorkerPrivateData, SWR_SURFACE_STATE *pDstSurface, + BucketManager* pBucketMgr, SWR_FORMAT srcFormat, SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, uint32_t x, uint32_t y, uint32_t renderTargetArrayIndex, - uint8_t *pSrcHotTile); \ No newline at end of file + uint8_t *pSrcHotTile); diff --git a/src/gallium/drivers/swr/swr_memory.h b/src/gallium/drivers/swr/swr_memory.h index c7c05fb7c65..bf6eaa34758 100644 --- a/src/gallium/drivers/swr/swr_memory.h +++ b/src/gallium/drivers/swr/swr_memory.h @@ -22,35 +22,35 @@ ***************************************************************************/ #pragma once - +#include "rasterizer/core/context.h" INLINE void -swr_LoadHotTile(HANDLE hPrivateContext, +swr_LoadHotTile(HANDLE hDC, HANDLE hWorkerPrivateData, SWR_FORMAT dstFormat, SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, UINT x, UINT y, uint32_t renderTargetArrayIndex, uint8_t* pDstHotTile) { - // Grab source surface state from private context - swr_draw_context *pDC = (swr_draw_context*)hPrivateContext; - SWR_SURFACE_STATE *pSrcSurface = &pDC->renderTargets[renderTargetIndex]; + DRAW_CONTEXT *pDC = (DRAW_CONTEXT*)hDC; + swr_draw_context *pSDC = (swr_draw_context*)GetPrivateState(pDC); + SWR_SURFACE_STATE *pSrcSurface = &pSDC->renderTargets[renderTargetIndex]; - pDC->pTileAPI->pfnSwrLoadHotTile(hWorkerPrivateData, pSrcSurface, dstFormat, renderTargetIndex, x, y, renderTargetArrayIndex, pDstHotTile); + pSDC->pTileAPI->pfnSwrLoadHotTile(hWorkerPrivateData, pSrcSurface, pDC->pContext->pBucketMgr, dstFormat, renderTargetIndex, x, y, renderTargetArrayIndex, pDstHotTile); } INLINE void -swr_StoreHotTile(HANDLE hPrivateContext, +swr_StoreHotTile(HANDLE hDC, HANDLE hWorkerPrivateData, SWR_FORMAT srcFormat, SWR_RENDERTARGET_ATTACHMENT renderTargetIndex, UINT x, UINT y, uint32_t renderTargetArrayIndex, uint8_t* pSrcHotTile) { - // Grab destination surface state from private context - swr_draw_context *pDC = (swr_draw_context*)hPrivateContext; - SWR_SURFACE_STATE *pDstSurface = &pDC->renderTargets[renderTargetIndex]; + DRAW_CONTEXT *pDC = (DRAW_CONTEXT*)hDC; + swr_draw_context *pSDC = (swr_draw_context*)GetPrivateState(pDC); + SWR_SURFACE_STATE *pDstSurface = &pSDC->renderTargets[renderTargetIndex]; - pDC->pTileAPI->pfnSwrStoreHotTileToSurface(hWorkerPrivateData, pDstSurface, srcFormat, renderTargetIndex, x, y, renderTargetArrayIndex, pSrcHotTile); + pSDC->pTileAPI->pfnSwrStoreHotTileToSurface(hWorkerPrivateData, pDstSurface, pDC->pContext->pBucketMgr, srcFormat, renderTargetIndex, x, y, renderTargetArrayIndex, pSrcHotTile); } INLINE gfxptr_t