[Mesa-dev] [PATCH 5/6][RFC] Gallium/dri2: implement blitImage
Axel Davy
axel.davy at ens.fr
Mon Jan 6 11:23:58 PST 2014
On 06/01/2014, Marek Olšák wrote :
> On Sun, Jan 5, 2014 at 10:26 PM, Axel Davy <axel.davy at ens.fr> wrote:
>> Signed-off-by: Axel Davy <axel.davy at ens.fr>
>> ---
>> src/gallium/state_trackers/dri/drm/dri2.c | 49 +++++++++++++++++++++++++++++--
>> 1 file changed, 47 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
>> index 2a5b7b4..89d9040 100644
>> --- a/src/gallium/state_trackers/dri/drm/dri2.c
>> +++ b/src/gallium/state_trackers/dri/drm/dri2.c
>> @@ -985,6 +985,49 @@ dri2_from_fds(__DRIscreen *screen, int width, int height, int fourcc,
>> }
>>
>> static void
>> +dri2_blit_image(__DRIcontext *context, __DRIimage *dst, __DRIimage *src,
>> + int dstx0, int dsty0, int dstwidth, int dstheight,
>> + int srcx0, int srcy0, int srcwidth, int srcheight,
>> + int flags)
>> +{
>> + struct dri_context *ctx = dri_context(context);
>> + struct pipe_context *pipe = ctx->st->pipe;
>> + struct pipe_screen* screen = dri_screen(ctx->sPriv)->base.screen;
>> + struct pipe_fence_handle *fence;
>> + struct pipe_blit_info blit;
>> +
>> + if (!dst || !src)
>> + return;
>> +
>> + memset(&blit, 0, sizeof(blit));
>> + blit.dst.resource = dst->texture;
>> + blit.dst.box.x = dstx0;
>> + blit.dst.box.y = dsty0;
>> + blit.dst.box.width = dstwidth;
>> + blit.dst.box.height = dstheight;
>> + blit.dst.box.depth = 1;
>> + blit.dst.format = dst->texture->format;
>> + blit.src.resource = src->texture;
>> + blit.src.box.x = srcx0;
>> + blit.src.box.y = srcy0;
>> + blit.src.box.width = srcwidth;
>> + blit.src.box.height = srcheight;
>> + blit.src.box.depth = 1;
>> + blit.src.format = src->texture->format;
>> + blit.mask = PIPE_MASK_RGBA;
>> + blit.filter = PIPE_TEX_FILTER_NEAREST;
>> +
>> + pipe->blit(pipe, &blit);
>> +
>> + pipe->flush_resource(pipe, dst->texture);
>> +
>> + ctx->st->flush(ctx->st, 0, &fence);
>> +
>> + if (flags & __BLIT_FLAG_FINISH)
>> + (void) screen->fence_finish(screen, fence, PIPE_TIMEOUT_INFINITE);
>> + screen->fence_reference(screen, &fence, NULL);
> Fences might not be implemented by some drivers. I recommend setting
> the fence pointer to NULL, then calling flush and then checking if
> it's not NULL. Also, getting a fence incurs some overhead, so if
> __BLIT_FLAG_FINISH is not set, the last parameter of st->flush should
> be NULL.
>
> Who can call this function? The X server?
>
> Marek
>
Thanks for the comment.
the __BLIT_FLAG_FINISH flag is to glFinish before exporting the buffer
when rendering on a different card than the compositor. This use case
will disappear with dma-buf fences.
I'm hesitating to remove this flag, and bet that dma-buf fences will
land soon.
The blitImage function would be called for Wayland when on a different
device than the Wayland compositor,
but it can be used fro X dri3 too (when on the dedicated device).
The work done for prime support for Wayland can be taken for X dri3.
About the flush done in the function: do you think it is ok to flush
here, or that it sould be optional to flush?
Axel Davy
More information about the mesa-dev
mailing list