Add some OpenCL1.2 new buffer flags handle.
authorYang Rong <rong.r.yang@intel.com>
Fri, 20 Jun 2014 16:15:43 +0000 (00:15 +0800)
committerZhigang Gong <zhigang.gong@intel.com>
Fri, 20 Jun 2014 09:35:03 +0000 (17:35 +0800)
And mem_base_addr_align' unit is bit, and origin's is byte, correct it when compare.

v2:
fix sub_buffer_check test case.

Signed-off-by: Yang Rong <rong.r.yang@intel.com>
Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
src/cl_api.c
src/cl_mem.c
utests/sub_buffer.cpp

index d5ee645..b8b4cfa 100644 (file)
@@ -1603,6 +1603,11 @@ clEnqueueReadBufferRect(cl_command_queue command_queue,
     goto error;
   }
 
+  if (buffer->flags & (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_NO_ACCESS)) {
+     err = CL_INVALID_OPERATION;
+     goto error;
+  }
+
   if (!ptr || !region || region[0] == 0 || region[1] == 0 || region[2] == 0) {
     err = CL_INVALID_VALUE;
     goto error;
@@ -1738,6 +1743,11 @@ clEnqueueWriteBufferRect(cl_command_queue     command_queue,
     goto error;
   }
 
+  if (buffer->flags & (CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS)) {
+    err = CL_INVALID_OPERATION;
+    goto error;
+  }
+
   if (!ptr || !region || region[0] == 0 || region[1] == 0 || region[2] == 0) {
     err = CL_INVALID_VALUE;
     goto error;
index 431376e..29d5faf 100644 (file)
@@ -311,9 +311,13 @@ cl_mem_new_buffer(cl_context ctx,
                      || ((flags & CL_MEM_READ_ONLY) && (flags & (CL_MEM_WRITE_ONLY)))
               || ((flags & CL_MEM_ALLOC_HOST_PTR) && (flags & CL_MEM_USE_HOST_PTR))
               || ((flags & CL_MEM_COPY_HOST_PTR) && (flags & CL_MEM_USE_HOST_PTR))
+              || ((flags & CL_MEM_HOST_READ_ONLY) && (flags & CL_MEM_HOST_NO_ACCESS))
+              || ((flags & CL_MEM_HOST_READ_ONLY) && (flags & CL_MEM_HOST_WRITE_ONLY))
+              || ((flags & CL_MEM_HOST_WRITE_ONLY) && (flags & CL_MEM_HOST_NO_ACCESS))
               || ((flags & (~(CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY
                         | CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR
-                        | CL_MEM_USE_HOST_PTR))) != 0))) {
+                        | CL_MEM_USE_HOST_PTR | CL_MEM_HOST_WRITE_ONLY
+                        | CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS))) != 0))) {
     err = CL_INVALID_VALUE;
     goto error;
   }
@@ -402,11 +406,22 @@ cl_mem_new_sub_buffer(cl_mem buffer,
 
   if (flags && (((buffer->flags & CL_MEM_WRITE_ONLY) && (flags & (CL_MEM_READ_WRITE|CL_MEM_READ_ONLY)))
           || ((buffer->flags & CL_MEM_READ_ONLY) && (flags & (CL_MEM_READ_WRITE|CL_MEM_WRITE_ONLY)))
-          || (flags & (CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR)))) {
+          || (flags & (CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR))
+          || ((flags & CL_MEM_HOST_READ_ONLY) && (flags & CL_MEM_HOST_NO_ACCESS))
+          || ((flags & CL_MEM_HOST_READ_ONLY) && (flags & CL_MEM_HOST_WRITE_ONLY))
+          || ((flags & CL_MEM_HOST_WRITE_ONLY) && (flags & CL_MEM_HOST_NO_ACCESS)))) {
     err = CL_INVALID_VALUE;
     goto error;
   }
 
+  if((flags & (CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | CL_MEM_READ_WRITE)) == 0) {
+    flags |= buffer->flags & (CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | CL_MEM_READ_WRITE);
+  }
+  flags |= buffer->flags & (CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR);
+  if((flags & (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS)) == 0) {
+    flags |= buffer->flags & (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS);
+  }
+
   if (create_type != CL_BUFFER_CREATE_TYPE_REGION) {
     err = CL_INVALID_VALUE;
     goto error;
@@ -429,7 +444,7 @@ cl_mem_new_sub_buffer(cl_mem buffer,
     goto error;
   }
 
-  if (info->origin & (buffer->ctx->device->mem_base_addr_align - 1)) {
+  if (info->origin & (buffer->ctx->device->mem_base_addr_align / 8 - 1)) {
     err = CL_MISALIGNED_SUB_BUFFER_OFFSET;
     goto error;
   }
index a13ebf1..9af3903 100644 (file)
@@ -39,7 +39,7 @@ void sub_buffer_check(void)
                 continue;
             }
             /* invalid align, should be failed. */
-            if(off & (address_align-1)) {
+            if(off & ((address_align/8)-1)) {
                 OCL_ASSERT(error != CL_SUCCESS);
                 continue;
             }
@@ -85,7 +85,7 @@ void sub_buffer_check(void)
                 continue;
             }
             /* invalid align, should be failed. */
-            if(off & (address_align-1)) {
+            if(off & (address_align/8-1)) {
                 OCL_ASSERT(error != CL_SUCCESS);
                 continue;
             }