[Mesa-dev] [PATCH] gallium: add flush_resource context function

Roland Scheidegger sroland at vmware.com
Wed Jul 17 07:58:44 PDT 2013


Ahh with some documentation and another name this looks much better now.
I don't really deal with dri interfacing much so someone else should
probably give it a look but looks reasonable. I wonder though if we
still need the flush_frontbuffer stuff or if that should go and be
replaced with this plus "something".

Roland

Am 16.07.2013 13:35, schrieb Marek Olšák:
> r600g needs explicit flushing before DRI2 buffers are presented on the screen.
> A complete implementation in all drivers will follow once this is acked.
> ---
>  src/gallium/docs/source/context.rst                  | 13 +++++++++++++
>  src/gallium/include/pipe/p_context.h                 | 13 +++++++++++++
>  src/gallium/state_trackers/dri/common/dri_drawable.c |  4 ++++
>  src/gallium/state_trackers/dri/drm/dri2.c            |  7 ++++---
>  4 files changed, 34 insertions(+), 3 deletions(-)
> 
> diff --git a/src/gallium/docs/source/context.rst b/src/gallium/docs/source/context.rst
> index bfd58a4..9ef0f5f 100644
> --- a/src/gallium/docs/source/context.rst
> +++ b/src/gallium/docs/source/context.rst
> @@ -421,6 +421,19 @@ Flushing
>  ``flush``
>  
>  
> +``flush_resource``
> +
> +Flush the resource cache, so that the resource can be used
> +by an external client. Possible usage:
> +- flushing a resource before presenting it on the screen
> +- flushing a resource if some other process or device wants to use it
> +This shouldn't be used to flush caches if the resource is only managed
> +by a single pipe_screen and is not shared with another process.
> +(i.e. you shouldn't use it to flush caches explicitly if you want to e.g.
> +use the resource for texturing)
> +
> +
> +
>  Resource Busy Queries
>  ^^^^^^^^^^^^^^^^^^^^^
>  
> diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
> index aa18cbf..63ba16f 100644
> --- a/src/gallium/include/pipe/p_context.h
> +++ b/src/gallium/include/pipe/p_context.h
> @@ -541,6 +541,19 @@ struct pipe_context {
>                                 unsigned sample_count,
>                                 unsigned sample_index,
>                                 float *out_value);
> +
> +   /**
> +    * Flush the resource cache, so that the resource can be used
> +    * by an external client. Possible usage:
> +    * - flushing a resource before presenting it on the screen
> +    * - flushing a resource if some other process or device wants to use it
> +    * This shouldn't be used to flush caches if the resource is only managed
> +    * by a single pipe_screen and is not shared with another process.
> +    * (i.e. you shouldn't use it to flush caches explicitly if you want to e.g.
> +    * use the resource for texturing)
> +    */
> +   void (*flush_resource)(struct pipe_context *ctx,
> +                          struct pipe_resource *resource);
>  };
>  
>  
> diff --git a/src/gallium/state_trackers/dri/common/dri_drawable.c b/src/gallium/state_trackers/dri/common/dri_drawable.c
> index 18d8d89..6e5794d 100644
> --- a/src/gallium/state_trackers/dri/common/dri_drawable.c
> +++ b/src/gallium/state_trackers/dri/common/dri_drawable.c
> @@ -435,6 +435,8 @@ dri_flush(__DRIcontext *cPriv,
>     /* Flush the drawable. */
>     if ((flags & __DRI2_FLUSH_DRAWABLE) &&
>         drawable->textures[ST_ATTACHMENT_BACK_LEFT]) {
> +      struct pipe_context *pipe = ctx->st->pipe;
> +
>        if (drawable->stvis.samples > 1 &&
>            reason == __DRI2_THROTTLE_SWAPBUFFER) {
>           /* Resolve the MSAA back buffer. */
> @@ -455,6 +457,8 @@ dri_flush(__DRIcontext *cPriv,
>        if (ctx->hud) {
>           hud_draw(ctx->hud, drawable->textures[ST_ATTACHMENT_BACK_LEFT]);
>        }
> +
> +      pipe->flush_resource(pipe, drawable->textures[ST_ATTACHMENT_BACK_LEFT]);
>     }
>  
>     flush_flags = 0;
> diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
> index 1dcc1f7..8bb0f3d 100644
> --- a/src/gallium/state_trackers/dri/drm/dri2.c
> +++ b/src/gallium/state_trackers/dri/drm/dri2.c
> @@ -490,20 +490,21 @@ dri2_flush_frontbuffer(struct dri_context *ctx,
>  {
>     __DRIdrawable *dri_drawable = drawable->dPriv;
>     struct __DRIdri2LoaderExtensionRec *loader = drawable->sPriv->dri2.loader;
> +   struct pipe_context *pipe = ctx->st->pipe;
>  
>     if (statt != ST_ATTACHMENT_FRONT_LEFT)
>        return;
>  
>     if (drawable->stvis.samples > 1) {
> -      struct pipe_context *pipe = ctx->st->pipe;
> -
>        /* Resolve the front buffer. */
>        dri_pipe_blit(ctx->st->pipe,
>                      drawable->textures[ST_ATTACHMENT_FRONT_LEFT],
>                      drawable->msaa_textures[ST_ATTACHMENT_FRONT_LEFT]);
> -      pipe->flush(pipe, NULL, 0);
>     }
>  
> +   pipe->flush_resource(pipe, drawable->textures[ST_ATTACHMENT_FRONT_LEFT]);
> +   pipe->flush(pipe, NULL, 0);
> +
>     if (loader->flushFrontBuffer) {
>        loader->flushFrontBuffer(dri_drawable, dri_drawable->loaderPrivate);
>     }
> 


More information about the mesa-dev mailing list