[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