[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