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 <[email protected]>
---
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
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev