radeonsi: check for sampler state CSO corruption
authorMarek Olšák <marek.olsak@amd.com>
Fri, 2 Dec 2016 02:34:07 +0000 (03:34 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 7 Dec 2016 18:40:03 +0000 (19:40 +0100)
It really happens.

v2: declare "magic" in debug builds only

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com> (v1)
src/gallium/drivers/radeonsi/si_descriptors.c
src/gallium/drivers/radeonsi/si_pipe.h
src/gallium/drivers/radeonsi/si_state.c

index 8b6e0bb..7ffd7fa 100644 (file)
@@ -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.
index 42cbecb..31b7985 100644 (file)
@@ -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];
 };
 
index 1ccf5b6..04c1a9f 100644 (file)
@@ -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);
 }