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 Signed-off-by: Jan Vesely <jan.ves...@rutgers.edu> --- Hi Francisco, I could not find much info about how ctx.input is supposed to be used. It looks like it stores begin-end intervals of parameters so NULL, NULL seemed appropriate. Is this closer to what you had in mind? This patch fixes my issue even without the r600 changes. regards, Jan src/gallium/state_trackers/clover/core/kernel.cpp | 34 +++++++++++++---------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp b/src/gallium/state_trackers/clover/core/kernel.cpp index 58780d6..d4942b3 100644 --- a/src/gallium/state_trackers/clover/core/kernel.cpp +++ b/src/gallium/state_trackers/clover/core/kernel.cpp @@ -327,16 +327,19 @@ 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; } 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) { + 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); + } else + insert(ctx.input, {NULL, NULL}); } void @@ -379,22 +382,25 @@ 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()); + 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); + } else + insert(ctx.input, {NULL, NULL}); } void -- 1.8.4.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev