[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