diff options
author | Yang Rong <rong.r.yang@intel.com> | 2014-06-26 21:31:23 +0800 |
---|---|---|
committer | Zhigang Gong <zhigang.gong@intel.com> | 2014-06-26 13:35:05 +0800 |
commit | 2e23c56325168ef5bf73e6d5ce0ccef439f36dc2 (patch) | |
tree | 8af3ae778d81de0193fe131943f52df1216dfed3 | |
parent | 9b4967944f34b8157c1ee929f256659633911ef4 (diff) |
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@intel.com>
Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
-rw-r--r-- | src/cl_api.c | 14 | ||||
-rw-r--r-- | src/cl_enqueue.c | 11 | ||||
-rw-r--r-- | src/cl_mem.c | 14 | ||||
-rw-r--r-- | 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 6f3f67b4..d54ada6f 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 11f16806..7fa44ff4 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 ff128af4..70bc3eb1 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 7e9aa838..44772400 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, |