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

Marek Olšák maraeo at gmail.com
Fri Jul 19 02:31:19 PDT 2013


FWIW, I don't think flush_frontbuffer belongs to the interface,
because it's only used by software rasterizers.

Marek

On Wed, Jul 17, 2013 at 4:58 PM, Roland Scheidegger <sroland at vmware.com> wrote:
> 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);
>>     }
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list