Understood. Ultimately, this may not be such a big performance boost,
so if it's not easy to track down the issues, happy to table it.
Before you spend serious time investigating, check if it has any
effect on a benchmark. If not, we can move on - this is purely for
perf, not correctness.

On Mon, Nov 28, 2016 at 8:11 PM, Rowley, Timothy O
<timothy.o.row...@intel.com> wrote:
> This patch is showing some regressions on internal testing.  As we talked 
> about on irc, it appears to be a combination of crashes (probably missing 
> table entries) and possibly wrong clear values.  Will need to back to you 
> later about the errors, but for now we need to hold off on this patch.
>
> -Tim
>
>> On Nov 19, 2016, at 9:48 AM, Ilia Mirkin <imir...@alum.mit.edu> wrote:
>>
>> 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

Reply via email to