From: Marek Olšák <marek.ol...@amd.com>

It really happens.
---
 src/gallium/drivers/radeonsi/si_descriptors.c | 1 +
 src/gallium/drivers/radeonsi/si_pipe.h        | 3 +++
 src/gallium/drivers/radeonsi/si_state.c       | 5 +++++
 3 files changed, 9 insertions(+)

diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c 
b/src/gallium/drivers/radeonsi/si_descriptors.c
index 8b6e0bb..4f78b1a 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -796,20 +796,21 @@ static void si_bind_sampler_states(struct pipe_context 
*ctx,
        if (!count || shader >= SI_NUM_SHADERS)
                return;
 
        for (i = 0; i < count; i++) {
                unsigned slot = start + i;
 
                if (!sstates[i] ||
                    sstates[i] == samplers->views.sampler_states[slot])
                        continue;
 
+               assert(sstates[i]->magic == SI_SAMPLER_STATE_MAGIC);
                samplers->views.sampler_states[slot] = sstates[i];
 
                /* If FMASK is bound, don't overwrite it.
                 * The sampler state will be set after FMASK is unbound.
                 */
                if (samplers->views.views[slot] &&
                    samplers->views.views[slot]->texture &&
                    samplers->views.views[slot]->texture->target != PIPE_BUFFER 
&&
                    ((struct 
r600_texture*)samplers->views.views[slot]->texture)->fmask.size)
                        continue;
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h 
b/src/gallium/drivers/radeonsi/si_pipe.h
index 42cbecb..a7985e7 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -130,21 +130,24 @@ struct si_sampler_view {
         /* [0..7] = image descriptor
          * [4..7] = buffer descriptor */
        uint32_t                        state[8];
        uint32_t                        fmask_state[8];
        const struct radeon_surf_level  *base_level_info;
        unsigned                        base_level;
        unsigned                        block_width;
        bool is_stencil_sampler;
 };
 
+#define SI_SAMPLER_STATE_MAGIC 0x34f1c35a
+
 struct si_sampler_state {
+       unsigned                        magic;
        uint32_t                        val[4];
 };
 
 struct si_cs_shader_state {
        struct si_compute               *program;
        struct si_compute               *emitted_program;
        unsigned                        offset;
        bool                            initialized;
        bool                            uses_scratch;
 };
diff --git a/src/gallium/drivers/radeonsi/si_state.c 
b/src/gallium/drivers/radeonsi/si_state.c
index 1ccf5b6..7ff9f8c 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -3240,20 +3240,21 @@ static void *si_create_sampler_state(struct 
pipe_context *ctx,
                                
util_memcpy_cpu_to_le32(&sctx->border_color_map[i],
                                                        &state->border_color,
                                                        
sizeof(state->border_color));
                                sctx->border_color_count++;
                        }
 
                        border_color_index = i;
                }
        }
 
+       rstate->magic = SI_SAMPLER_STATE_MAGIC;
        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)) |
                          S_008F30_MAX_ANISO_RATIO(max_aniso_ratio) |
                          
S_008F30_DEPTH_COMPARE_FUNC(si_tex_compare(state->compare_func)) |
                          
S_008F30_FORCE_UNNORMALIZED(!state->normalized_coords) |
                          S_008F30_ANISO_THRESHOLD(max_aniso_ratio >> 1) |
                          S_008F30_ANISO_BIAS(max_aniso_ratio) |
                          S_008F30_DISABLE_CUBE_WRAP(!state->seamless_cube_map) 
|
                          S_008F30_COMPAT_MODE(sctx->b.chip_class >= VI));
@@ -3296,20 +3297,24 @@ static void si_emit_sample_mask(struct si_context 
*sctx, struct r600_atom *atom)
        assert(mask == 0xffff || sctx->framebuffer.nr_samples > 1 ||
               (mask & 1 && sctx->blitter->running));
 
        radeon_set_context_reg_seq(cs, R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, 2);
        radeon_emit(cs, mask | (mask << 16));
        radeon_emit(cs, mask | (mask << 16));
 }
 
 static void si_delete_sampler_state(struct pipe_context *ctx, void *state)
 {
+       struct si_sampler_state *s = state;
+
+       assert(s->magic == SI_SAMPLER_STATE_MAGIC);
+       s->magic = 0;
        free(state);
 }
 
 /*
  * Vertex elements & buffers
  */
 
 static void *si_create_vertex_elements(struct pipe_context *ctx,
                                       unsigned count,
                                       const struct pipe_vertex_element 
*elements)
-- 
2.7.4

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

Reply via email to