[Beignet] [PATCH 6/6] Implement TILE_Y large image in clEnqueueWriteImage.

yan.wang at linux.intel.com yan.wang at linux.intel.com
Tue May 9 10:05:37 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 | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/src/cl_api_mem.c b/src/cl_api_mem.c
index c2aeb11..c009c56 100644
--- a/src/cl_api_mem.c
+++ b/src/cl_api_mem.c
@@ -1929,6 +1929,48 @@ 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];
+  size_t aligned_slice_pitch = 0;
+
+  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, 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 +2056,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