clover: Fix host access validation for sub-buffer creation
authorAaron Watry <awatry@gmail.com>
Sat, 7 Apr 2018 18:44:53 +0000 (13:44 -0500)
committerAaron Watry <awatry@gmail.com>
Fri, 20 Apr 2018 01:57:37 +0000 (20:57 -0500)
  From CL 1.2 Section 5.2.1:
    CL_INVALID_VALUE if buffer was created with CL_MEM_HOST_WRITE_ONLY and
    flags specify CL_MEM_HOST_READ_ONLY , or if buffer was created with
    CL_MEM_HOST_READ_ONLY and flags specify CL_MEM_HOST_WRITE_ONLY , or if
    buffer was created with CL_MEM_HOST_NO_ACCESS and flags specify
    CL_MEM_HOST_READ_ONLY or CL_MEM_HOST_WRITE_ONLY .

Fixes CL 1.2 CTS test/api get_buffer_info

v2: Correct host_access_flags check (Francisco)

Signed-off-by: Aaron Watry <awatry@gmail.com>
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
src/gallium/state_trackers/clover/api/memory.cpp

index 9b3cd8b1f5c1ccc168811e2e2f62667e13c4f3d5..df4b9baa1d99565f41c46be901e0cba8da042c33 100644 (file)
@@ -57,8 +57,13 @@ namespace {
                                       parent.flags() & host_access_flags) |
                                      (parent.flags() & host_ptr_flags));
 
-         if (~flags & parent.flags() &
-             ((dev_access_flags & ~CL_MEM_READ_WRITE) | host_access_flags))
+         if (~flags & parent.flags() & (dev_access_flags & ~CL_MEM_READ_WRITE))
+            throw error(CL_INVALID_VALUE);
+
+         // Check if new host access flags cause a mismatch between
+         // host-read/write-only.
+         if (!(flags & CL_MEM_HOST_NO_ACCESS) &&
+             (~flags & parent.flags() & host_access_flags))
             throw error(CL_INVALID_VALUE);
 
          return flags;