[Mesa-dev] [PATCH v3 1/1] clover: Don't crash on NULL global buffer objects.
Jan Vesely
jan.vesely at rutgers.edu
Mon Jan 20 11:46:17 PST 2014
On Sat, 2014-01-18 at 13:34 +0100, Francisco Jerez wrote:
> Jan Vesely <jan.vesely at rutgers.edu> writes:
>
> > 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 at rutgers.edu>
>
> Looks OK to me,
>
> Reviewed-by: Francisco Jerez <currojerez at riseup.net>
Thank you, can you push it as well? I don't have commit access.
>
> Thanks.
>
> > ---
> > src/gallium/state_trackers/clover/core/kernel.cpp | 34 +++++++++++++++--------
> > 1 file 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 58780d6..fb826c1 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
> > --
> > 1.8.4.2
--
Jan Vesely <jan.vesely at rutgers.edu>
--
Jan Vesely <jan.vesely at rutgers.edu>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140120/e3bd6824/attachment.pgp>
More information about the mesa-dev
mailing list