Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Thu, Jun 19, 2014 at 5:27 AM, Axel Davy <axel.d...@ens.fr> wrote: > V3: call flush_resource before flush > V4: Add new flags > > Signed-off-by: Axel Davy <axel.d...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev