From: Marek Olšák Date: Fri, 2 Dec 2016 02:34:07 +0000 (+0100) Subject: radeonsi: check for sampler state CSO corruption X-Git-Tag: upstream/17.1.0~4043 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6caa558ca677941f9a2f0570563b51fbe88cd1b9;p=platform%2Fupstream%2Fmesa.git radeonsi: check for sampler state CSO corruption It really happens. v2: declare "magic" in debug builds only Reviewed-by: Nicolai Hähnle (v1) --- diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index 8b6e0bb..7ffd7fa 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -803,6 +803,9 @@ static void si_bind_sampler_states(struct pipe_context *ctx, sstates[i] == samplers->views.sampler_states[slot]) continue; +#ifdef DEBUG + assert(sstates[i]->magic == SI_SAMPLER_STATE_MAGIC); +#endif samplers->views.sampler_states[slot] = sstates[i]; /* If FMASK is bound, don't overwrite it. diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 42cbecb..31b7985 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -137,7 +137,12 @@ struct si_sampler_view { bool is_stencil_sampler; }; +#define SI_SAMPLER_STATE_MAGIC 0x34f1c35a + struct si_sampler_state { +#ifdef DEBUG + unsigned magic; +#endif uint32_t val[4]; }; diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 1ccf5b6..04c1a9f 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -3247,6 +3247,9 @@ static void *si_create_sampler_state(struct pipe_context *ctx, } } +#ifdef DEBUG + rstate->magic = SI_SAMPLER_STATE_MAGIC; +#endif rstate->val[0] = (S_008F30_CLAMP_X(si_tex_wrap(state->wrap_s)) | S_008F30_CLAMP_Y(si_tex_wrap(state->wrap_t)) | S_008F30_CLAMP_Z(si_tex_wrap(state->wrap_r)) | @@ -3303,6 +3306,12 @@ static void si_emit_sample_mask(struct si_context *sctx, struct r600_atom *atom) static void si_delete_sampler_state(struct pipe_context *ctx, void *state) { + struct si_sampler_state *s = state; + +#ifdef DEBUG + assert(s->magic == SI_SAMPLER_STATE_MAGIC); + s->magic = 0; +#endif free(state); }