[Mesa-dev] [PATCH 05/10] radeonsi: check for sampler state CSO corruption
Gustaw Smolarczyk
wielkiegie at gmail.com
Fri Dec 2 20:52:11 UTC 2016
2016-12-02 21:39 GMT+01:00 Marek Olšák <maraeo at gmail.com>:
> From: Marek Olšák <marek.olsak at 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;
>
How about wrapping it in #ifndef NDEBUG/#endif? Here and the other places.
> 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161202/cd0f78fa/attachment-0001.html>
More information about the mesa-dev
mailing list