Yes, if images are created from clCreateImageFromLibvaIntel or created from buffer, the images may have an offset. Now this offset is only used in GPU side, when GPU/write, the result is correct. But in the CPU side, read/write/map, it is ignored, this is wrong.
Thanks for your patch, could you format the patch as following: 1. Commit the changes. 2. Use git format-patch -s -1 to generate the patch with signoff. 3. git send-email to send the patch to mailing list. > -----Original Message----- > From: Beignet [mailto:[email protected]] On Behalf Of > Mark Thompson > Sent: Tuesday, August 30, 2016 6:13 > To: [email protected] > Subject: [Beignet] [PATCH] Apply image offset to read/write/map operations > > --- > Hi, > > My use-case for this is to allow read/write/map on images created from > buffers. This is helpful for interoperability with VAAPI (i965) because the > driver there wants an incoming image to be a single DRM object, even if it > has multiple planes: making a single buffer and then creating images within > that buffer satisfies this constraint, but without this patch planes with an > offset from the start of the buffer do not work correctly. > > I am somewhat dubious about this patch and would welcome thoughts about > the use-case - it seems like what I have could interact badly with some other > part of the system I'm not aware of, though it does work nicely for the > specific case. > > Tested and working on Haswell GT2 (4500U) and Skylake GT2 (6300). > > Thanks, > > - Mark > > > src/cl_enqueue.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/src/cl_enqueue.c b/src/cl_enqueue.c index 081ffce..54c0ffa > 100644 > --- a/src/cl_enqueue.c > +++ b/src/cl_enqueue.c > @@ -204,7 +204,7 @@ cl_int cl_enqueue_read_image(enqueue_data *data) > goto error; > } > > - size_t offset = image->bpp*origin[0] + image->row_pitch*origin[1] + > image->slice_pitch*origin[2]; > + size_t offset = image->offset + image->bpp*origin[0] + > + image->row_pitch*origin[1] + image->slice_pitch*origin[2]; > src_ptr = (char*)src_ptr + offset; > > if (!origin[0] && region[0] == image->w && data->row_pitch == image- > >row_pitch && @@ -246,8 +246,8 @@ cl_int > cl_enqueue_write_image(enqueue_data *data) > err = CL_MAP_FAILURE; > goto error; > } > - //dst need to add offset > - cl_mem_copy_image_region(data->origin, data->region, dst_ptr, > + cl_mem_copy_image_region(data->origin, data->region, > + dst_ptr + image->offset, > image->row_pitch, image->slice_pitch, > data->const_ptr, data->row_pitch, > data->slice_pitch, image, CL_TRUE, CL_FALSE); @@ > -311,7 > +311,7 @@ cl_int cl_enqueue_map_image(enqueue_data *data) > err = CL_MAP_FAILURE; > goto error; > } > - data->ptr = ptr; > + data->ptr = (char*)ptr + image->offset; > if (image->image_type == CL_MEM_OBJECT_IMAGE1D_ARRAY) > row_pitch = image->slice_pitch; > else > -- > 2.9.3 > > _______________________________________________ > Beignet mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/beignet
