[Beignet] [PATCH v2 6/6] Implement TILE_Y large image in clEnqueueWriteImage.
yan.wang at linux.intel.com
yan.wang at linux.intel.com
Mon May 15 06:45:04 UTC 2017
From: Yan Wang <yan.wang at linux.intel.com>
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 at linux.intel.com>
---
src/cl_api_mem.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/src/cl_api_mem.c b/src/cl_api_mem.c
index 8cbddf4..b8f27b2 100644
--- a/src/cl_api_mem.c
+++ b/src/cl_api_mem.c
@@ -1929,6 +1929,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 (mem->tmp_ker_buf)
+ clReleaseMemObject(mem->tmp_ker_buf);
+
+ mem->tmp_ker_buf = clCreateBuffer(command_queue->ctx, CL_MEM_USE_HOST_PTR, mem->size, (void*)ptr, &err);
+ if (mem->tmp_ker_buf == NULL || err != CL_SUCCESS) {
+ mem->tmp_ker_buf = NULL;
+ return err;
+ }
+
+ return clEnqueueCopyBufferToImage(command_queue, mem->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,
@@ -2014,6 +2055,11 @@ clEnqueueWriteImage(cl_command_queue command_queue,
break;
}
+ if (mem->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) {
--
2.7.4
More information about the Beignet
mailing list