No point in clearing the hot tile and then storing that - may as well just store the clear color to the surface directly. Use the helper that already exists for this purpose.
Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> --- My theory is that this is going to be a very modest perf improvement. Instead of first clearing the hot tile and then storing it, we store the clear color directly. It does bring up a rare case where a tile might be cleared, stored, and then re-used with the same buffer. In that case, the former logic would avoid the load while the new logic will end up reloading the clear color/etc. There was a grand total of one piglit that was hit by this: fbo-attachments-blit-scaled-linear (and that is the reason that we have to set the hottile to INVALID rather than the post state when storing.) src/gallium/drivers/swr/rasterizer/core/backend.cpp | 17 ++++++++++------- src/gallium/drivers/swr/rasterizer/core/tilemgr.cpp | 15 +++++---------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/core/backend.cpp b/src/gallium/drivers/swr/rasterizer/core/backend.cpp index c45c0a7..ff08233 100644 --- a/src/gallium/drivers/swr/rasterizer/core/backend.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/backend.cpp @@ -358,16 +358,19 @@ void ProcessStoreTileBE(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t macroTile HOTTILE *pHotTile = pContext->pHotTileMgr->GetHotTileNoLoad(pContext, pDC, macroTile, attachment, false); if (pHotTile) { - // clear if clear is pending (i.e., not rendered to), then mark as dirty for store. + // clear the surface directly if (pHotTile->state == HOTTILE_CLEAR) { - PFN_CLEAR_TILES pfnClearTiles = sClearTilesTable[srcFormat]; - SWR_ASSERT(pfnClearTiles != nullptr); - - pfnClearTiles(pDC, attachment, macroTile, pHotTile->renderTargetArrayIndex, pHotTile->clearData, pDesc->rect); + pContext->pfnClearTile(GetPrivateState(pDC), attachment, + x * KNOB_MACROTILE_X_DIM, y * KNOB_MACROTILE_Y_DIM, + pHotTile->renderTargetArrayIndex, + (const float *)pHotTile->clearData); + + // Since the state is effectively uninitialized, make sure that we + // reload any data. + pHotTile->state = HOTTILE_INVALID; } - - if (pHotTile->state == HOTTILE_DIRTY || pDesc->postStoreTileState == (SWR_TILE_STATE)HOTTILE_DIRTY) + else if (pHotTile->state == HOTTILE_DIRTY || pDesc->postStoreTileState == (SWR_TILE_STATE)HOTTILE_DIRTY) { int32_t destX = KNOB_MACROTILE_X_DIM * x; int32_t destY = KNOB_MACROTILE_Y_DIM * y; diff --git a/src/gallium/drivers/swr/rasterizer/core/tilemgr.cpp b/src/gallium/drivers/swr/rasterizer/core/tilemgr.cpp index f398667..a4a6152 100644 --- a/src/gallium/drivers/swr/rasterizer/core/tilemgr.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/tilemgr.cpp @@ -151,17 +151,12 @@ HOTTILE* HotTileMgr::GetHotTile(SWR_CONTEXT* pContext, DRAW_CONTEXT* pDC, uint32 if (hotTile.state == HOTTILE_CLEAR) { - if (attachment == SWR_ATTACHMENT_STENCIL) - ClearStencilHotTile(&hotTile); - else if (attachment == SWR_ATTACHMENT_DEPTH) - ClearDepthHotTile(&hotTile); - else - ClearColorHotTile(&hotTile); - - hotTile.state = HOTTILE_DIRTY; + pContext->pfnClearTile(GetPrivateState(pDC), attachment, + x * KNOB_MACROTILE_X_DIM, y * KNOB_MACROTILE_Y_DIM, + hotTile.renderTargetArrayIndex, + (const float *)hotTile.clearData); } - - if (hotTile.state == HOTTILE_DIRTY) + else if (hotTile.state == HOTTILE_DIRTY) { pContext->pfnStoreTile(GetPrivateState(pDC), format, attachment, x * KNOB_MACROTILE_X_DIM, y * KNOB_MACROTILE_Y_DIM, hotTile.renderTargetArrayIndex, hotTile.pBuffer); -- 2.7.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev