Jan Vesely <jan.ves...@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.ves...@rutgers.edu>

Looks OK to me,

Reviewed-by: Francisco Jerez <curroje...@riseup.net>

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

Attachment: pgpeUpJkJP2wf.pgp
Description: PGP signature

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to