[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