[Mesa-dev] [PATCH] swr: invalidate attachment on transition change
Kyriazis, George
george.kyriazis at intel.com
Fri Jul 7 21:32:21 UTC 2017
+Bruce
Andres,
VTK/Kitware has already modified their code to enable dual depth peeling for Mesa version >= 17.2. From that perspective, it doesn’t matter if the change goes into the 17.1.x releases or 17.2.
Having said that, we haven’t seen any issues with that check-in, so if it makes it to a release branch earlier than 17.2, it’s still a good thing for us.
Thanks!
George
> On Jul 7, 2017, at 4:11 PM, Andres Gomez <agomez at igalia.com> wrote:
>
> George, would we want this patch in -stable or we shouldn't bother ?
>
> On Tue, 2017-06-20 at 11:42 -0500, George Kyriazis wrote:
>> Consider the following RT attachment order:
>> 1. Attach surfaces attachments 0 & 1, and render with them
>> 2. Detach 0 & 1
>> 3. Re-attach 0 & 1 to different surfaces
>> 4. Render with the new attachment
>>
>> The definition of a tile being resolved is that local changes have been
>> flushed out to the surface, hence there is no need to reload the tile before
>> it's written to. For an invalid tile, the tile has to be reloaded from
>> the surface before rendering.
>>
>> Stage (2) was marking hot tiles for attachements 0 & 1 as RESOLVED,
>> which means that the hot tiles can be written out to memory with no
>> need to read them back in (they are "clean"). They need to be marked as
>> resolved here, because a surface may be destroyed after a detach, and we
>> don't want to have un-resolved tiles that may force a readback from a
>> NULL (destroyed) surface. (Part of a destroy is detach all attachments first)
>>
>> Stage (3), during the no att -> att transition, we need to realize that the
>> "new" surface tiles need to be fetched fresh from the new surface, instead
>> of using the resolved tiles, that belong to a stale attachment.
>>
>> This is done by marking the hot tiles as invalid in stage (3), when we realize
>> that a new attachment is being made, so that they are re-fetched during
>> rendering in stage (4).
>>
>> Also note that hot tiles are indexed by attachment.
>>
>> - Fixes VTK dual depth-peeling tests.
>> - No piglit changes
>> ---
>> src/gallium/drivers/swr/swr_draw.cpp | 19 +++++++++++++++++++
>> src/gallium/drivers/swr/swr_resource.h | 4 ++++
>> src/gallium/drivers/swr/swr_state.cpp | 5 +++++
>> 3 files changed, 28 insertions(+)
>>
>> diff --git a/src/gallium/drivers/swr/swr_draw.cpp b/src/gallium/drivers/swr/swr_draw.cpp
>> index 03c82a7..ac300e2 100644
>> --- a/src/gallium/drivers/swr/swr_draw.cpp
>> +++ b/src/gallium/drivers/swr/swr_draw.cpp
>> @@ -215,6 +215,25 @@ swr_finish(struct pipe_context *pipe)
>> swr_fence_reference(pipe->screen, &fence, NULL);
>> }
>>
>> +/*
>> + * Invalidate tiles so they can be reloaded back when needed
>> + */
>> +void
>> +swr_invalidate_render_target(struct pipe_context *pipe,
>> + uint32_t attachment,
>> + uint16_t width, uint16_t height)
>> +{
>> + struct swr_context *ctx = swr_context(pipe);
>> +
>> + /* grab the rect from the passed in arguments */
>> + swr_update_draw_context(ctx);
>> + SWR_RECT full_rect =
>> + {0, 0, (int32_t)width, (int32_t)height};
>> + SwrInvalidateTiles(ctx->swrContext,
>> + 1 << attachment,
>> + full_rect);
>> +}
>> +
>>
>> /*
>> * Store SWR HotTiles back to renderTarget surface.
>> diff --git a/src/gallium/drivers/swr/swr_resource.h b/src/gallium/drivers/swr/swr_resource.h
>> index ae9954c..4effd46 100644
>> --- a/src/gallium/drivers/swr/swr_resource.h
>> +++ b/src/gallium/drivers/swr/swr_resource.h
>> @@ -96,6 +96,10 @@ swr_resource_data(struct pipe_resource *resource)
>> }
>>
>>
>> +void swr_invalidate_render_target(struct pipe_context *pipe,
>> + uint32_t attachment,
>> + uint16_t width, uint16_t height);
>> +
>> void swr_store_render_target(struct pipe_context *pipe,
>> uint32_t attachment,
>> enum SWR_TILE_STATE post_tile_state);
>> diff --git a/src/gallium/drivers/swr/swr_state.cpp b/src/gallium/drivers/swr/swr_state.cpp
>> index 08549e5..deae4e6 100644
>> --- a/src/gallium/drivers/swr/swr_state.cpp
>> +++ b/src/gallium/drivers/swr/swr_state.cpp
>> @@ -933,6 +933,11 @@ swr_change_rt(struct swr_context *ctx,
>> * INVALID so they are reloaded from surface. */
>> swr_store_render_target(&ctx->pipe, attachment, SWR_TILE_INVALID);
>> need_fence = true;
>> + } else {
>> + /* if no previous attachment, invalidate tiles that may be marked
>> + * RESOLVED because of an old attachment */
>> + swr_invalidate_render_target(&ctx->pipe, attachment, sf->width, sf->height);
>> + /* no need to set fence here */
>> }
>>
>> /* Make new attachment */
> --
> Br,
>
> Andres
More information about the mesa-dev
mailing list