[Mesa-dev] [PATCH 5/6][RFC] Gallium/dri2: implement blitImage

Marek Olšák maraeo at gmail.com
Mon Jan 6 03:50:42 PST 2014


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


More information about the mesa-dev mailing list