[Mesa-dev] [PATCH v2 RFC 1/1] clover: Don't crash on NULL global buffer objects.

Jan Vesely jan.vesely at rutgers.edu
Wed Jan 15 09:09:58 PST 2014


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.vesely at 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



More information about the mesa-dev mailing list