[Mesa-dev] [PATCH 07/11] Gallium/dri2: implement blitImage

Marek Olšák maraeo at gmail.com
Tue Jun 24 16:23:01 PDT 2014


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Thu, Jun 19, 2014 at 5:27 AM, Axel Davy <axel.davy at ens.fr> wrote:
> V3: call flush_resource before flush
> V4: Add new flags
>
> Signed-off-by: Axel Davy <axel.davy at ens.fr>
> ---
>  src/gallium/state_trackers/dri/drm/dri2.c | 55 +++++++++++++++++++++++++++++--
>  1 file changed, 52 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
> index 124d91b..9753ce0 100644
> --- a/src/gallium/state_trackers/dri/drm/dri2.c
> +++ b/src/gallium/state_trackers/dri/drm/dri2.c
> @@ -1132,6 +1132,54 @@ dri2_from_dma_bufs(__DRIscreen *screen,
>  }
>
>  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 flush_flag)
> +{
> +   struct dri_context *ctx = dri_context(context);
> +   struct pipe_context *pipe = ctx->st->pipe;
> +   struct pipe_screen *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);
> +
> +   if (flush_flag == __BLIT_FLAG_FLUSH) {
> +      pipe->flush_resource(pipe, dst->texture);
> +      ctx->st->flush(ctx->st, 0, NULL);
> +   }
> +   else if (flush_flag == __BLIT_FLAG_FINISH) {
> +      screen = dri_screen(ctx->sPriv)->base.screen;
> +      pipe->flush_resource(pipe, dst->texture);
> +      ctx->st->flush(ctx->st, 0, &fence);
> +      (void) screen->fence_finish(screen, fence, PIPE_TIMEOUT_INFINITE);
> +      screen->fence_reference(screen, &fence, NULL);
> +   }
> +}
> +
> +static void
>  dri2_destroy_image(__DRIimage *img)
>  {
>     pipe_resource_reference(&img->texture, NULL);
> @@ -1140,7 +1188,7 @@ dri2_destroy_image(__DRIimage *img)
>
>  /* The extension is modified during runtime if DRI_PRIME is detected */
>  static __DRIimageExtension dri2ImageExtension = {
> -    .base = { __DRI_IMAGE, 6 },
> +    .base = { __DRI_IMAGE, 9 },
>
>      .createImageFromName          = dri2_create_image_from_name,
>      .createImageFromRenderbuffer  = dri2_create_image_from_renderbuffer,
> @@ -1152,6 +1200,9 @@ static __DRIimageExtension dri2ImageExtension = {
>      .createImageFromNames         = dri2_from_names,
>      .fromPlanar                   = dri2_from_planar,
>      .createImageFromTexture       = dri2_create_from_texture,
> +    .createImageFromFds           = NULL,
> +    .createImageFromDmaBufs       = NULL,
> +    .blitImage                    = dri2_blit_image,
>  };
>
>  /*
> @@ -1206,8 +1257,6 @@ dri2_init_screen(__DRIscreen * sPriv)
>
>        if (drmGetCap(sPriv->fd, DRM_CAP_PRIME, &cap) == 0 &&
>            (cap & DRM_PRIME_CAP_IMPORT)) {
> -
> -         dri2ImageExtension.base.version = 8;
>           dri2ImageExtension.createImageFromFds = dri2_from_fds;
>           dri2ImageExtension.createImageFromDmaBufs = dri2_from_dma_bufs;
>        }
> --
> 1.9.1
>
> _______________________________________________
> 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