aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/memobject.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/core/memobject.cpp b/src/core/memobject.cpp
index bd8736f..3e2eeb1 100644
--- a/src/core/memobject.cpp
+++ b/src/core/memobject.cpp
@@ -56,8 +56,10 @@ MemObject::MemObject(Context *ctx, cl_mem_flags flags, void *host_ptr,
// Check the flags value
const cl_mem_flags all_flags = CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY |
CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR |
- CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR
- |CL_MEM_USE_MSMC_TI;
+ CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR |
+ CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY |
+ CL_MEM_HOST_NO_ACCESS |
+ CL_MEM_USE_MSMC_TI;
if ((flags & CL_MEM_READ_WRITE) && (flags & CL_MEM_READ_ONLY))
{
@@ -540,15 +542,24 @@ SubBuffer::SubBuffer(class Buffer *parent, size_t offset, size_t size,
}
// OpenCL 1.2: SubBuffer should inherit some of parent Buffer flags
+ // Conditionally inherit read/write parent flags, if none spec'd for sub-buffer:
cl_mem_flags parent_rw_flags = parent->flags()
& (CL_MEM_READ_WRITE | CL_MEM_READ_ONLY | CL_MEM_WRITE_ONLY);
cl_mem_flags my_rw_flags = p_flags
& (CL_MEM_READ_WRITE | CL_MEM_READ_ONLY | CL_MEM_WRITE_ONLY);
- // parent be READ_WRITE, subBuffer be READ_ONLY/WRITE_ONLY (Spec allows)
if (! my_rw_flags) p_flags |= parent_rw_flags;
+
+ // Unconditionally inherit parents 'hostptr' flags:
cl_mem_flags parent_hostptr_flags = parent->flags()
& (CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR);
if (parent_hostptr_flags) p_flags |= parent_hostptr_flags;
+
+ // Conditionally inherit 'host use' parent flags, if none spec'd for sub-buffer:
+ cl_mem_flags parent_host_use_flags = parent->flags()
+ & (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS);
+ cl_mem_flags my_host_use_flags = p_flags
+ & (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS);
+ if (! my_host_use_flags) p_flags |= parent_host_use_flags;
}
SubBuffer::~SubBuffer()