summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers
diff options
context:
space:
mode:
authorJan Vesely <[email protected]>2014-01-16 20:22:14 -0500
committerFrancisco Jerez <[email protected]>2014-01-22 13:30:35 +0100
commit6ec210989fa10847091f06fcfcab77dd07618dff (patch)
treefba6aa572b036a7880536a97cc35d242eb5ac9cd /src/gallium/state_trackers
parent6caf34b97e5d22f5910695e30941bea3d0bf2e46 (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/gallium/state_trackers')
-rw-r--r--src/gallium/state_trackers/clover/core/kernel.cpp34
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