[Mesa-dev] [PATCH] radeonsi: Handle NULL sampler views getting passed in by the state tracker.

Christian König deathsimple at vodafone.de
Tue Aug 21 05:19:01 PDT 2012


On 21.08.2012 13:55, Michel Dänzer wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> Don't dereference NULL pointers, and if all views are NULL, don't generate an
> invalid PM4 packet which locks up the GPU.
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
Reviewed-by: Christian König <christian.koenig at amd.com>

> ---
>   src/gallium/drivers/radeonsi/radeonsi_pm4.c |    7 +++++++
>   src/gallium/drivers/radeonsi/si_state.c     |   12 +++++++-----
>   2 files changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/radeonsi_pm4.c b/src/gallium/drivers/radeonsi/radeonsi_pm4.c
> index 3c53ce2..8268f91 100644
> --- a/src/gallium/drivers/radeonsi/radeonsi_pm4.c
> +++ b/src/gallium/drivers/radeonsi/radeonsi_pm4.c
> @@ -109,6 +109,13 @@ void si_pm4_sh_data_add(struct si_pm4_state *state, uint32_t dw)
>   void si_pm4_sh_data_end(struct si_pm4_state *state, unsigned reg)
>   {
>   	unsigned offs = state->last_pm4 + 1;
> +
> +	/* Bail if no data was added */
> +	if (state->ndw == offs) {
> +		state->ndw--;
> +		return;
> +	}
> +
>   	si_pm4_cmd_end(state, false);
>   
>   	si_pm4_cmd_begin(state, PKT3_SET_SH_REG_OFFSET);
> diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
> index 11acb73..9a9a250 100644
> --- a/src/gallium/drivers/radeonsi/si_state.c
> +++ b/src/gallium/drivers/radeonsi/si_state.c
> @@ -1971,16 +1971,18 @@ static void si_set_ps_sampler_view(struct pipe_context *ctx, unsigned count,
>   
>   	si_pm4_sh_data_begin(pm4);
>   	for (i = 0; i < count; i++) {
> -		struct r600_resource_texture *tex = (void *)resource[i]->base.texture;
> -
>   		pipe_sampler_view_reference(
>   			(struct pipe_sampler_view **)&rctx->ps_samplers.views[i],
>   			views[i]);
>   
> -		si_pm4_add_bo(pm4, &tex->resource, RADEON_USAGE_READ);
> +		if (views[i]) {
> +			struct r600_resource_texture *tex = (void *)resource[i]->base.texture;
> +
> +			si_pm4_add_bo(pm4, &tex->resource, RADEON_USAGE_READ);
>   
> -		for (j = 0; j < Elements(resource[i]->state); ++j) {
> -			si_pm4_sh_data_add(pm4, resource[i]->state[j]);
> +			for (j = 0; j < Elements(resource[i]->state); ++j) {
> +				si_pm4_sh_data_add(pm4, resource[i]->state[j]);
> +			}
>   		}
>   	}
>   



More information about the mesa-dev mailing list