[Mesa-dev] [PATCH] swr: invalidate attachment on transition change

Andres Gomez agomez at igalia.com
Fri Jul 7 21:11:10 UTC 2017


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