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

Francisco Jerez currojerez at riseup.net
Wed Jan 15 02:49:53 PST 2014


Jan Vesely <jan.vesely at rutgers.edu> writes:

> Specs say it's legal.
> Fixes clones.xml gegl test.
>
> ---
> Hi,
>
> this patch is an attempt to support NULL buffer objects in clover.
> It adds NULL handling to few places, and it's enough to get 'clones'
> gegl test running.
>
> The 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."
>
> I was considering using a special buffer instance to represent
> NULL buffers but this seems more straightforward. Using 'pobj'
> should take care of the latter part of the spec requirement too.
>
> BZ: https://bugs.freedesktop.org/show_bug.cgi?id=73571#c2
> ignore the first two comments I forgot I was testing some
> additional patches.
>
> Tom, I'm not sure I understand your comment. Does it mean that at
> the moment it's possible that kernels receive NULL pointers
> that point to valid buffers?
>
> regards,
> Jan
>
>  src/gallium/drivers/r600/evergreen_compute.c      | 9 ++++++---
>  src/gallium/state_trackers/clover/core/kernel.cpp | 4 ++--
>  2 files changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c
> index a2db69b..f14b7c5 100644
> --- a/src/gallium/drivers/r600/evergreen_compute.c
> +++ b/src/gallium/drivers/r600/evergreen_compute.c
> @@ -655,10 +655,13 @@ static void evergreen_set_global_binding(
>  
>  	for (int i = 0; i < n; i++)
>  	{
> -		assert(resources[i]->target == PIPE_BUFFER);
> -		assert(resources[i]->bind & PIPE_BIND_GLOBAL);
> +		if (resources[i]) {
> +			assert(resources[i]->target == PIPE_BUFFER);
> +			assert(resources[i]->bind & PIPE_BIND_GLOBAL);
>  
> -		*(handles[i]) = buffers[i]->chunk->start_in_dw * 4;
> +			*(handles[i]) = buffers[i]->chunk->start_in_dw * 4;
> +		} else
> +			*(handles[i]) = NULL;
>  	}
>  
>  	evergreen_set_rat(ctx->cs_shader_state.shader, 0, pool->bo, 0, pool->size_in_dw * 4);

Can you split the r600 changes into a separate patch?

> diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp b/src/gallium/state_trackers/clover/core/kernel.cpp
> index ac57c71..412eac4 100644
> --- a/src/gallium/state_trackers/clover/core/kernel.cpp
> +++ b/src/gallium/state_trackers/clover/core/kernel.cpp
> @@ -331,7 +331,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;
>  }
>  
> @@ -340,7 +340,7 @@ 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);
> +   ctx.g_buffers.push_back(buf ? buf->resource(*ctx.q).pipe: NULL);
>  }
>  

Another possibility would be to write NULL to the input buffer here and
not push the handle/buffer pair at all.  That way drivers won't have to
deal with this special case.

You probably need to fix constant buffer arguments too.

Thanks.

>  void
> -- 
> 1.8.4.2
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 229 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140115/a3a70733/attachment.pgp>


More information about the mesa-dev mailing list