[Beignet] [Patch V2 1/2] Fix sub buffer bug in clEnqueueReadBufferRect, clEnqueueWriteBufferRect, clEnqueueMapBuffer.
Zhigang Gong
zhigang.gong at linux.intel.com
Fri Jun 20 01:05:37 PDT 2014
These two patches LGTM, will push latter, thanks.
On Sat, Jun 21, 2014 at 12:15:42AM +0800, Yang Rong wrote:
> Should add sub_offset in these functions.
>
> V2: clEnqueueMapBuffer's return ptr should not add sub offset. It will add sub offset in _cl_map_mem
> Signed-off-by: Yang Rong <rong.r.yang at intel.com>
> ---
> src/cl_enqueue.c | 24 +++++++++++++++++-------
> 1 file changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/src/cl_enqueue.c b/src/cl_enqueue.c
> index ff6ec9e..bc0ca2c 100644
> --- a/src/cl_enqueue.c
> +++ b/src/cl_enqueue.c
> @@ -61,13 +61,18 @@ cl_int cl_enqueue_read_buffer_rect(enqueue_data* data)
> const size_t* host_origin = data->host_origin;
> const size_t* region = data->region;
>
> - if (!(src_ptr = cl_mem_map_auto(data->mem_obj))) {
> + cl_mem mem = data->mem_obj;
> + assert(mem->type == CL_MEM_BUFFER_TYPE ||
> + mem->type == CL_MEM_SUBBUFFER_TYPE);
> + struct _cl_mem_buffer* buffer = (struct _cl_mem_buffer*)mem;
> +
> + if (!(src_ptr = cl_mem_map_auto(mem))) {
> err = CL_MAP_FAILURE;
> goto error;
> }
>
> size_t offset = origin[0] + data->row_pitch*origin[1] + data->slice_pitch*origin[2];
> - src_ptr = (char*)src_ptr + offset;
> + src_ptr = (char*)src_ptr + offset + buffer->sub_offset;
>
> offset = host_origin[0] + data->host_row_pitch*host_origin[1] + data->host_slice_pitch*host_origin[2];
> dst_ptr = (char *)data->ptr + offset;
> @@ -92,7 +97,7 @@ cl_int cl_enqueue_read_buffer_rect(enqueue_data* data)
> }
> }
>
> - err = cl_mem_unmap_auto(data->mem_obj);
> + err = cl_mem_unmap_auto(mem);
>
> error:
> return err;
> @@ -130,13 +135,18 @@ cl_int cl_enqueue_write_buffer_rect(enqueue_data *data)
> const size_t* host_origin = data->host_origin;
> const size_t* region = data->region;
>
> - if (!(dst_ptr = cl_mem_map_auto(data->mem_obj))) {
> + cl_mem mem = data->mem_obj;
> + assert(mem->type == CL_MEM_BUFFER_TYPE ||
> + mem->type == CL_MEM_SUBBUFFER_TYPE);
> + struct _cl_mem_buffer* buffer = (struct _cl_mem_buffer*)mem;
> +
> + if (!(dst_ptr = cl_mem_map_auto(mem))) {
> err = CL_MAP_FAILURE;
> goto error;
> }
>
> size_t offset = origin[0] + data->row_pitch*origin[1] + data->slice_pitch*origin[2];
> - dst_ptr = (char *)dst_ptr + offset;
> + dst_ptr = (char *)dst_ptr + offset + buffer->sub_offset;
>
> offset = host_origin[0] + data->host_row_pitch*host_origin[1] + data->host_slice_pitch*host_origin[2];
> src_ptr = (char*)data->const_ptr + offset;
> @@ -161,7 +171,7 @@ cl_int cl_enqueue_write_buffer_rect(enqueue_data *data)
> }
> }
>
> - err = cl_mem_unmap_auto(data->mem_obj);
> + err = cl_mem_unmap_auto(mem);
>
> error:
> return err;
> @@ -261,7 +271,7 @@ cl_int cl_enqueue_map_buffer(enqueue_data *data)
> if(mem->flags & CL_MEM_USE_HOST_PTR) {
> assert(mem->host_ptr);
> ptr = (char*)ptr + data->offset + buffer->sub_offset;
> - memcpy(mem->host_ptr + data->offset, ptr, data->size);
> + memcpy(mem->host_ptr + data->offset + buffer->sub_offset, ptr, data->size);
> }
>
> error:
> --
> 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