[Beignet] [PATCH] Fix call cl_mem_copy_image_region bug.
Zhigang Gong
zhigang.gong at linux.intel.com
Wed Jun 25 23:28:28 PDT 2014
Good catch, just pushed, thanks!
> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Yang Rong
> Sent: Thursday, June 26, 2014 9:31 PM
> To: beignet at lists.freedesktop.org
> Cc: Yang Rong
> Subject: [Beignet] [PATCH] Fix call cl_mem_copy_image_region bug.
>
> When call cl_mem_copy_image_region, sometimes need add offset to src or
> dst address, sometimes need not add. Add two parameter to indicate it.
> Also fix the wrong offset when clEnqueueMapImage of
> CL_MEM_USE_HOST_PTR.
>
> Signed-off-by: Yang Rong <rong.r.yang at intel.com>
> ---
> src/cl_api.c | 14 +++++++-------
> src/cl_enqueue.c | 11 +++++++----
> src/cl_mem.c | 14 ++++++++++----
> src/cl_mem.h | 2 +-
> 4 files changed, 25 insertions(+), 16 deletions(-)
>
> diff --git a/src/cl_api.c b/src/cl_api.c index 6f3f67b..d54ada6 100644
> --- a/src/cl_api.c
> +++ b/src/cl_api.c
> @@ -2550,7 +2550,7 @@ static cl_int _cl_map_mem(cl_mem mem, void *ptr,
> void **mem_ptr,
> if(mem->flags & CL_MEM_USE_HOST_PTR) {
> assert(mem->host_ptr);
> //only calc ptr here, will do memcpy in enqueue
> - *mem_ptr = mem->host_ptr + offset + sub_offset;
> + *mem_ptr = (char *)mem->host_ptr + offset + sub_offset;
> } else {
> *mem_ptr = ptr;
> }
> @@ -2700,6 +2700,7 @@ clEnqueueMapImage(cl_command_queue
> command_queue,
> cl_int err = CL_SUCCESS;
> void *ptr = NULL;
> void *mem_ptr = NULL;
> + size_t offset = 0;
> enqueue_data *data, no_wait_data = { 0 };
>
> CHECK_QUEUE(command_queue);
> @@ -2730,8 +2731,6 @@ clEnqueueMapImage(cl_command_queue
> command_queue,
> goto error;
> }
>
> - size_t offset = image->bpp*origin[0] + image->row_pitch*origin[1] +
> image->slice_pitch*origin[2];
> -
> TRY(cl_event_check_waitlist, num_events_in_wait_list, event_wait_list,
> event, mem->ctx);
>
> data = &no_wait_data;
> @@ -2740,7 +2739,6 @@ clEnqueueMapImage(cl_command_queue
> command_queue,
> data->origin[0] = origin[0]; data->origin[1] = origin[1];
data->origin[2]
> = origin[2];
> data->region[0] = region[0]; data->region[1] = region[1];
> data->region[2] = region[2];
> data->ptr = ptr;
> - data->offset = offset;
> data->unsync_map = 1;
>
> if(handle_events(command_queue, num_events_in_wait_list,
> event_wait_list,
> @@ -2757,14 +2755,13 @@ clEnqueueMapImage(cl_command_queue
> command_queue,
> goto error;
> }
> }
> - err = _cl_map_mem(mem, ptr, &mem_ptr, offset, 0, origin, region);
> - if (err != CL_SUCCESS)
> - goto error;
>
> if(mem->flags & CL_MEM_USE_HOST_PTR) {
> if (image_slice_pitch)
> *image_slice_pitch = image->host_slice_pitch;
> *image_row_pitch = image->host_row_pitch;
> +
> + offset = image->bpp*origin[0] + image->host_row_pitch*origin[1] +
> + image->host_slice_pitch*origin[2];
> } else {
> if (image_slice_pitch)
> *image_slice_pitch = image->slice_pitch;
> @@ -2772,7 +2769,10 @@ clEnqueueMapImage(cl_command_queue
> command_queue,
> *image_row_pitch = image->slice_pitch;
> else
> *image_row_pitch = image->row_pitch;
> +
> + offset = image->bpp*origin[0] + image->row_pitch*origin[1] +
> + image->slice_pitch*origin[2];
> }
> + err = _cl_map_mem(mem, ptr, &mem_ptr, offset, 0, origin, region);
>
> error:
> if (errcode_ret)
> diff --git a/src/cl_enqueue.c b/src/cl_enqueue.c index 11f1680..7fa44ff
100644
> --- a/src/cl_enqueue.c
> +++ b/src/cl_enqueue.c
> @@ -235,11 +235,11 @@ 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,
> image->row_pitch, image->slice_pitch,
> data->const_ptr, data->row_pitch,
> - data->slice_pitch, image);
> + data->slice_pitch, image, CL_TRUE,
> + CL_FALSE);
> err = cl_mem_unmap_auto(mem);
>
> error:
> @@ -304,9 +304,10 @@ cl_int cl_enqueue_map_image(enqueue_data *data)
>
> if(mem->flags & CL_MEM_USE_HOST_PTR) {
> assert(mem->host_ptr);
> + //src and dst need add offset in function cl_mem_copy_image_region
> cl_mem_copy_image_region(data->origin, data->region,
> mem->host_ptr, image->host_row_pitch,
> image->host_slice_pitch,
> - data->ptr, row_pitch, image->slice_pitch,
> image);
> + data->ptr, row_pitch, image->slice_pitch,
> + image, CL_TRUE, CL_TRUE);
> }
>
> error:
> @@ -355,13 +356,15 @@ cl_int
> cl_enqueue_unmap_mem_object(enqueue_data *data)
> memcpy(v_ptr, mapped_ptr, mapped_size);
> } else {
> CHECK_IMAGE(memobj, image);
> +
> if (image->image_type == CL_MEM_OBJECT_IMAGE1D_ARRAY)
> row_pitch = image->slice_pitch;
> else
> row_pitch = image->row_pitch;
> + //v_ptr have added offset, host_ptr have not added offset.
> cl_mem_copy_image_region(origin, region, v_ptr, row_pitch,
> image->slice_pitch,
> memobj->host_ptr,
> image->host_row_pitch, image->host_slice_pitch,
> - image);
> + image, CL_FALSE, CL_TRUE);
> }
> } else {
> assert(v_ptr == mapped_ptr);
> diff --git a/src/cl_mem.c b/src/cl_mem.c index ff128af..70bc3eb 100644
> --- a/src/cl_mem.c
> +++ b/src/cl_mem.c
> @@ -521,10 +521,16 @@ void
> cl_mem_copy_image_region(const size_t *origin, const size_t *region,
> void *dst, size_t dst_row_pitch, size_t
> dst_slice_pitch,
> const void *src, size_t src_row_pitch, size_t
> src_slice_pitch,
> - const struct _cl_mem_image *image)
> + const struct _cl_mem_image *image, cl_bool
> + offset_dst, cl_bool offset_src)
> {
> - size_t offset = image->bpp * origin[0] + dst_row_pitch * origin[1] +
> dst_slice_pitch * origin[2];
> - dst = (char*)dst + offset;
> + if(offset_dst) {
> + size_t dst_offset = image->bpp * origin[0] + dst_row_pitch *
origin[1] +
> dst_slice_pitch * origin[2];
> + dst = (char*)dst + dst_offset;
> + }
> + if(offset_src) {
> + size_t src_offset = image->bpp * origin[0] + src_row_pitch *
origin[1] +
> src_slice_pitch * origin[2];
> + src = (char*)src + src_offset;
> + }
> if (!origin[0] && region[0] == image->w && dst_row_pitch ==
src_row_pitch
> &&
> (region[2] == 1 || (!origin[1] && region[1] == image->h &&
> dst_slice_pitch == src_slice_pitch)))
> {
> @@ -585,7 +591,7 @@ cl_mem_copy_image(struct _cl_mem_image *image,
> size_t region[3] = {image->w, image->h, image->depth};
>
> cl_mem_copy_image_region(origin, region, dst_ptr, image->row_pitch,
> image->slice_pitch,
> - host_ptr, row_pitch, slice_pitch, image);
> + host_ptr, row_pitch, slice_pitch, image,
> + CL_FALSE, CL_FALSE); //offset is 0
> cl_mem_unmap_auto((cl_mem)image);
> }
>
> diff --git a/src/cl_mem.h b/src/cl_mem.h index 7e9aa83..4477240 100644
> --- a/src/cl_mem.h
> +++ b/src/cl_mem.h
> @@ -264,7 +264,7 @@ void
> cl_mem_copy_image_region(const size_t *origin, const size_t *region,
> void *dst, size_t dst_row_pitch, size_t
> dst_slice_pitch,
> const void *src, size_t src_row_pitch, size_t
> src_slice_pitch,
> - const struct _cl_mem_image *image);
> + const struct _cl_mem_image *image, cl_bool
> + offset_dst, cl_bool offset_src);
>
> void
> cl_mem_copy_image_to_image(const size_t *dst_origin,const size_t
> *src_origin, const size_t *region,
> --
> 1.8.3.2
>
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list