This is an improvement, but I think you need to clip the box to 1. Size of the surface 2. Size of the image
I think that there are clipping helpers available to do that (maybe pipe_box_clip or so? I forget, check the auxiliary dir). Christian - does that make sense to you? Cheers, -ilia On Fri, Oct 5, 2018 at 12:01 PM <boyuan.zh...@amd.com> wrote: > > From: Boyuan Zhang <boyuan.zh...@amd.com> > > vlVaGetImage should respect the width, height, and coordinates x and y that > passed in. Therefore, pipe_box should be created with the passed in values > instead of surface width/height. > > Signed-off-by: Boyuan Zhang <boyuan.zh...@amd.com> > --- > src/gallium/state_trackers/va/image.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/src/gallium/state_trackers/va/image.c > b/src/gallium/state_trackers/va/image.c > index 3f892c9..c9f6f18 100644 > --- a/src/gallium/state_trackers/va/image.c > +++ b/src/gallium/state_trackers/va/image.c > @@ -400,11 +400,14 @@ vlVaGetImage(VADriverContextP ctx, VASurfaceID surface, > int x, int y, > } > > for (i = 0; i < vaimage->num_planes; i++) { > - unsigned width, height; > + unsigned w = align(width, 2); > + unsigned h = align(height, 2); > if (!views[i]) continue; > - vlVaVideoSurfaceSize(surf, i, &width, &height); > + vl_video_buffer_adjust_size(&w, &h, i, > + surf->templat.chroma_format, > + surf->templat.interlaced); > for (j = 0; j < views[i]->texture->array_size; ++j) { > - struct pipe_box box = {0, 0, j, width, height, 1}; > + struct pipe_box box = {x, y, j, w, h, 1}; > struct pipe_transfer *transfer; > uint8_t *map; > map = drv->pipe->transfer_map(drv->pipe, views[i]->texture, 0, > -- > 2.7.4 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev