diff options
author | Jan Vesely <[email protected]> | 2014-01-16 20:22:14 -0500 |
---|---|---|
committer | Francisco Jerez <[email protected]> | 2014-01-22 13:30:35 +0100 |
commit | 6ec210989fa10847091f06fcfcab77dd07618dff (patch) | |
tree | fba6aa572b036a7880536a97cc35d242eb5ac9cd /src | |
parent | 6caf34b97e5d22f5910695e30941bea3d0bf2e46 (diff) |
clover: Don't crash on NULL global buffer objects.
Specs say "If the argument is a buffer object, the arg_value
pointer can be NULL or point to a NULL value in which case a NULL
value will be used as the value for the argument declared as a
pointer to __global or __constant memory in the kernel."
So don't crash when somebody does that.
v2: Insert NULL into input buffer instead of buffer handle pair
Fix constant_argument too
Drop r600 driver changes
v3: Fix inserting NULL pointer
Signed-off-by: Jan Vesely <[email protected]>
Reviewed-by: Francisco Jerez <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/state_trackers/clover/core/kernel.cpp | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp b/src/gallium/state_trackers/clover/core/kernel.cpp index 58780d6d03c..6d894cd66ec 100644 --- a/src/gallium/state_trackers/clover/core/kernel.cpp +++ b/src/gallium/state_trackers/clover/core/kernel.cpp @@ -327,7 +327,7 @@ kernel::global_argument::set(size_t size, const void *value) { if (size != sizeof(cl_mem)) throw error(CL_INVALID_ARG_SIZE); - buf = &obj<buffer>(*(cl_mem *)value); + buf = pobj<buffer>(value ? *(cl_mem *)value : NULL); _set = true; } @@ -335,8 +335,14 @@ void kernel::global_argument::bind(exec_context &ctx, const module::argument &marg) { align(ctx.input, marg.target_align); - ctx.g_handles.push_back(allocate(ctx.input, marg.target_size)); - ctx.g_buffers.push_back(buf->resource(*ctx.q).pipe); + + if (buf) { + ctx.g_handles.push_back(allocate(ctx.input, marg.target_size)); + ctx.g_buffers.push_back(buf->resource(*ctx.q).pipe); + } else { + // Null pointer. + allocate(ctx.input, marg.target_size); + } } void @@ -379,22 +385,28 @@ kernel::constant_argument::set(size_t size, const void *value) { if (size != sizeof(cl_mem)) throw error(CL_INVALID_ARG_SIZE); - buf = &obj<buffer>(*(cl_mem *)value); + buf = pobj<buffer>(value ? *(cl_mem *)value : NULL); _set = true; } void kernel::constant_argument::bind(exec_context &ctx, const module::argument &marg) { - auto v = bytes(ctx.resources.size() << 24); - - extend(v, module::argument::zero_ext, marg.target_size); - byteswap(v, ctx.q->dev.endianness()); align(ctx.input, marg.target_align); - insert(ctx.input, v); - st = buf->resource(*ctx.q).bind_surface(*ctx.q, false); - ctx.resources.push_back(st); + if (buf) { + auto v = bytes(ctx.resources.size() << 24); + + extend(v, module::argument::zero_ext, marg.target_size); + byteswap(v, ctx.q->dev.endianness()); + insert(ctx.input, v); + + st = buf->resource(*ctx.q).bind_surface(*ctx.q, false); + ctx.resources.push_back(st); + } else { + // Null pointer. + allocate(ctx.input, marg.target_size); + } } void |