mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-28 00:10:30 +01:00
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 <jan.vesely@rutgers.edu>
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
This commit is contained in:
parent
6caf34b97e
commit
6ec210989f
1 changed files with 23 additions and 11 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue