diff options
author | Yan Wang <yan.wang@linux.intel.com> | 2017-05-16 19:04:20 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2017-05-18 17:35:36 +0800 |
commit | 007683f701a59e0e1cf0c55851f8da6a979761f7 (patch) | |
tree | 7f79770e02a37542f5f36a8b7748782f0cecddf7 /src/cl_api_mem.c | |
parent | 68c31b20e54a435975a9008ab93e760bc5cd193c (diff) |
Implement TILE_Y large image in clEnqueueWriteImage.
It will fail to copy data from host ptr to TILE_Y large image by memcpy.
Use clEnqueueCopyBufferToImage to do this on GPU side.
Signed-off-by: Yan Wang <yan.wang@linux.intel.com>
Reviewed-by: Yang Rong <rong.r.yang@intel.com>
Diffstat (limited to 'src/cl_api_mem.c')
-rw-r--r-- | src/cl_api_mem.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/cl_api_mem.c b/src/cl_api_mem.c index 91525b16..7b58236e 100644 --- a/src/cl_api_mem.c +++ b/src/cl_api_mem.c @@ -1954,6 +1954,47 @@ clEnqueueReadImage(cl_command_queue command_queue, return err; } +static cl_int +clEnqueueWriteImageByKernel(cl_command_queue command_queue, + cl_mem mem, + cl_bool blocking_write, + const size_t *porigin, + const size_t *pregion, + size_t row_pitch, + size_t slice_pitch, + const void *ptr, + cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) +{ + cl_int err = CL_SUCCESS; + struct _cl_mem_image *image = NULL; + size_t region[3]; + size_t origin[3]; + + image = cl_mem_image(mem); + + err = check_image_region(image, pregion, region); + if (err != CL_SUCCESS) + return err; + + err = check_image_origin(image, porigin, origin); + if (err != CL_SUCCESS) + return err; + + if (image->tmp_ker_buf) + clReleaseMemObject(image->tmp_ker_buf); + + image->tmp_ker_buf = clCreateBuffer(command_queue->ctx, CL_MEM_USE_HOST_PTR, mem->size, (void*)ptr, &err); + if (image->tmp_ker_buf == NULL || err != CL_SUCCESS) { + image->tmp_ker_buf = NULL; + return err; + } + + return clEnqueueCopyBufferToImage(command_queue, image->tmp_ker_buf, mem, 0, origin, region, + num_events_in_wait_list, event_wait_list, event); +} + cl_int clEnqueueWriteImage(cl_command_queue command_queue, cl_mem mem, @@ -2039,6 +2080,11 @@ clEnqueueWriteImage(cl_command_queue command_queue, break; } + if (image->is_ker_copy) { + return clEnqueueWriteImageByKernel(command_queue, mem, blocking_write, origin, + region, row_pitch, slice_pitch, ptr, num_events_in_wait_list, event_wait_list, event); + } + err = cl_event_check_waitlist(num_events_in_wait_list, event_wait_list, event, command_queue->ctx); if (err != CL_SUCCESS) { |