[Beignet] [PATCH] Apply image offset to read/write/map operations
Yang, Rong R
rong.r.yang at intel.com
Wed Aug 31 07:48:26 UTC 2016
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:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Mark Thompson
> Sent: Tuesday, August 30, 2016 6:13
> To: beignet at lists.freedesktop.org
> 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
> Beignet at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list