[Mesa-dev] [PATCH 1/4] gallium/radeon: use helper functions to mark atoms dirty

Marek Olšák maraeo at gmail.com
Tue Aug 11 10:51:18 PDT 2015


I pushed this series. Thanks.

Marek

On Sun, Aug 9, 2015 at 11:42 PM, Grazvydas Ignotas <notasas at gmail.com> wrote:
> This is analogous to r300_mark_atom_dirty() used by r300, and will
> be used by later patches. For common radeon code, appropriate helper
> is called through a function pointer.
>
> No functional changes.
> ---
>  src/gallium/drivers/r600/evergreen_compute.c    |  2 +-
>  src/gallium/drivers/r600/evergreen_state.c      | 28 ++++-----
>  src/gallium/drivers/r600/r600_blit.c            | 16 +++---
>  src/gallium/drivers/r600/r600_hw_context.c      | 54 +++++++++---------
>  src/gallium/drivers/r600/r600_pipe.c            |  1 +
>  src/gallium/drivers/r600/r600_pipe.h            | 25 +++++++--
>  src/gallium/drivers/r600/r600_state.c           | 28 ++++-----
>  src/gallium/drivers/r600/r600_state_common.c    | 75 +++++++++++++------------
>  src/gallium/drivers/radeon/r600_pipe_common.h   |  3 +
>  src/gallium/drivers/radeon/r600_streamout.c     | 14 +++--
>  src/gallium/drivers/radeon/r600_texture.c       |  2 +-
>  src/gallium/drivers/radeonsi/si_blit.c          | 14 ++---
>  src/gallium/drivers/radeonsi/si_descriptors.c   |  6 +-
>  src/gallium/drivers/radeonsi/si_hw_context.c    | 12 ++--
>  src/gallium/drivers/radeonsi/si_pipe.c          |  1 +
>  src/gallium/drivers/radeonsi/si_pipe.h          | 14 +++++
>  src/gallium/drivers/radeonsi/si_state.c         | 18 +++---
>  src/gallium/drivers/radeonsi/si_state_draw.c    |  2 +-
>  src/gallium/drivers/radeonsi/si_state_shaders.c | 12 ++--
>  19 files changed, 182 insertions(+), 145 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c
> index d89e3de..5100330 100644
> --- a/src/gallium/drivers/r600/evergreen_compute.c
> +++ b/src/gallium/drivers/r600/evergreen_compute.c
> @@ -163,7 +163,7 @@ static void evergreen_cs_set_vertex_buffer(
>         rctx->b.flags |= R600_CONTEXT_INV_VERTEX_CACHE;
>         state->enabled_mask |= 1 << vb_index;
>         state->dirty_mask |= 1 << vb_index;
> -       state->atom.dirty = true;
> +       r600_mark_atom_dirty(rctx, &state->atom);
>  }
>
>  static void evergreen_cs_set_constant_buffer(
> diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
> index 13ecc46..bb53383 100644
> --- a/src/gallium/drivers/r600/evergreen_state.c
> +++ b/src/gallium/drivers/r600/evergreen_state.c
> @@ -896,7 +896,7 @@ static void evergreen_set_scissor_states(struct pipe_context *ctx,
>
>         for (i = start_slot; i < start_slot + num_scissors; i++) {
>                 rctx->scissor[i].scissor = state[i - start_slot];
> -               rctx->scissor[i].atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->scissor[i].atom);
>         }
>  }
>
> @@ -1346,11 +1346,11 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
>
>                 if (rctx->alphatest_state.bypass != alphatest_bypass) {
>                         rctx->alphatest_state.bypass = alphatest_bypass;
> -                       rctx->alphatest_state.atom.dirty = true;
> +                       r600_mark_atom_dirty(rctx, &rctx->alphatest_state.atom);
>                 }
>                 if (rctx->alphatest_state.cb0_export_16bpc != export_16bpc) {
>                         rctx->alphatest_state.cb0_export_16bpc = export_16bpc;
> -                       rctx->alphatest_state.atom.dirty = true;
> +                       r600_mark_atom_dirty(rctx, &rctx->alphatest_state.atom);
>                 }
>         }
>
> @@ -1366,28 +1366,28 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
>
>                 if (state->zsbuf->format != rctx->poly_offset_state.zs_format) {
>                         rctx->poly_offset_state.zs_format = state->zsbuf->format;
> -                       rctx->poly_offset_state.atom.dirty = true;
> +                       r600_mark_atom_dirty(rctx, &rctx->poly_offset_state.atom);
>                 }
>
>                 if (rctx->db_state.rsurf != surf) {
>                         rctx->db_state.rsurf = surf;
> -                       rctx->db_state.atom.dirty = true;
> -                       rctx->db_misc_state.atom.dirty = true;
> +                       r600_mark_atom_dirty(rctx, &rctx->db_state.atom);
> +                       r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>                 }
>         } else if (rctx->db_state.rsurf) {
>                 rctx->db_state.rsurf = NULL;
> -               rctx->db_state.atom.dirty = true;
> -               rctx->db_misc_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->db_state.atom);
> +               r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>         }
>
>         if (rctx->cb_misc_state.nr_cbufs != state->nr_cbufs) {
>                 rctx->cb_misc_state.nr_cbufs = state->nr_cbufs;
> -               rctx->cb_misc_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
>         }
>
>         if (state->nr_cbufs == 0 && rctx->alphatest_state.bypass) {
>                 rctx->alphatest_state.bypass = false;
> -               rctx->alphatest_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->alphatest_state.atom);
>         }
>
>         log_samples = util_logbase2(rctx->framebuffer.nr_samples);
> @@ -1396,7 +1396,7 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
>              rctx->b.family == CHIP_RV770) &&
>             rctx->db_misc_state.log_samples != log_samples) {
>                 rctx->db_misc_state.log_samples = log_samples;
> -               rctx->db_misc_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>         }
>
>
> @@ -1424,7 +1424,7 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
>                 rctx->framebuffer.atom.num_dw += 4;
>         }
>
> -       rctx->framebuffer.atom.dirty = true;
> +       r600_mark_atom_dirty(rctx, &rctx->framebuffer.atom);
>
>         r600_set_sample_locations_constant_buffer(rctx);
>  }
> @@ -1438,7 +1438,7 @@ static void evergreen_set_min_samples(struct pipe_context *ctx, unsigned min_sam
>
>         rctx->ps_iter_samples = min_samples;
>         if (rctx->framebuffer.nr_samples > 1) {
> -               rctx->framebuffer.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->framebuffer.atom);
>         }
>  }
>
> @@ -3180,7 +3180,7 @@ void evergreen_update_db_shader_control(struct r600_context * rctx)
>
>         if (db_shader_control != rctx->db_misc_state.db_shader_control) {
>                 rctx->db_misc_state.db_shader_control = db_shader_control;
> -               rctx->db_misc_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>         }
>  }
>
> diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c
> index 8664e03..b0002c3 100644
> --- a/src/gallium/drivers/r600/r600_blit.c
> +++ b/src/gallium/drivers/r600/r600_blit.c
> @@ -145,7 +145,7 @@ static void r600_blit_decompress_depth(struct pipe_context *ctx,
>         rctx->db_misc_state.copy_depth = util_format_has_depth(desc);
>         rctx->db_misc_state.copy_stencil = util_format_has_stencil(desc);
>         rctx->db_misc_state.copy_sample = first_sample;
> -       rctx->db_misc_state.atom.dirty = true;
> +       r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>
>         for (level = first_level; level <= last_level; level++) {
>                 if (!staging && !(texture->dirty_level_mask & (1 << level)))
> @@ -162,7 +162,7 @@ static void r600_blit_decompress_depth(struct pipe_context *ctx,
>
>                                 if (sample != rctx->db_misc_state.copy_sample) {
>                                         rctx->db_misc_state.copy_sample = sample;
> -                                       rctx->db_misc_state.atom.dirty = true;
> +                                       r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>                                 }
>
>                                 surf_tmpl.format = texture->resource.b.b.format;
> @@ -197,7 +197,7 @@ static void r600_blit_decompress_depth(struct pipe_context *ctx,
>
>         /* reenable compression in DB_RENDER_CONTROL */
>         rctx->db_misc_state.flush_depthstencil_through_cb = false;
> -       rctx->db_misc_state.atom.dirty = true;
> +       r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>  }
>
>  static void r600_blit_decompress_depth_in_place(struct r600_context *rctx,
> @@ -210,7 +210,7 @@ static void r600_blit_decompress_depth_in_place(struct r600_context *rctx,
>
>         /* Enable decompression in DB_RENDER_CONTROL */
>         rctx->db_misc_state.flush_depthstencil_in_place = true;
> -       rctx->db_misc_state.atom.dirty = true;
> +       r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>
>         surf_tmpl.format = texture->resource.b.b.format;
>
> @@ -248,7 +248,7 @@ static void r600_blit_decompress_depth_in_place(struct r600_context *rctx,
>
>         /* Disable decompression in DB_RENDER_CONTROL */
>         rctx->db_misc_state.flush_depthstencil_in_place = false;
> -       rctx->db_misc_state.atom.dirty = true;
> +       r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>  }
>
>  void r600_decompress_depth_textures(struct r600_context *rctx,
> @@ -437,10 +437,10 @@ static void r600_clear(struct pipe_context *ctx, unsigned buffers,
>                     fb->zsbuf->u.tex.last_layer == util_max_layer(&rtex->resource.b.b, level)) {
>                         if (rtex->depth_clear_value != depth) {
>                                 rtex->depth_clear_value = depth;
> -                               rctx->db_state.atom.dirty = true;
> +                               r600_mark_atom_dirty(rctx, &rctx->db_state.atom);
>                         }
>                         rctx->db_misc_state.htile_clear = true;
> -                       rctx->db_misc_state.atom.dirty = true;
> +                       r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>                 }
>         }
>
> @@ -453,7 +453,7 @@ static void r600_clear(struct pipe_context *ctx, unsigned buffers,
>         /* disable fast clear */
>         if (rctx->db_misc_state.htile_clear) {
>                 rctx->db_misc_state.htile_clear = false;
> -               rctx->db_misc_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>         }
>  }
>
> diff --git a/src/gallium/drivers/r600/r600_hw_context.c b/src/gallium/drivers/r600/r600_hw_context.c
> index ad11e76..d67fdfd 100644
> --- a/src/gallium/drivers/r600/r600_hw_context.c
> +++ b/src/gallium/drivers/r600/r600_hw_context.c
> @@ -296,43 +296,43 @@ void r600_begin_new_cs(struct r600_context *ctx)
>         r600_emit_command_buffer(ctx->b.rings.gfx.cs, &ctx->start_cs_cmd);
>
>         /* Re-emit states. */
> -       ctx->alphatest_state.atom.dirty = true;
> -       ctx->blend_color.atom.dirty = true;
> -       ctx->cb_misc_state.atom.dirty = true;
> -       ctx->clip_misc_state.atom.dirty = true;
> -       ctx->clip_state.atom.dirty = true;
> -       ctx->db_misc_state.atom.dirty = true;
> -       ctx->db_state.atom.dirty = true;
> -       ctx->framebuffer.atom.dirty = true;
> -       ctx->pixel_shader.atom.dirty = true;
> -       ctx->poly_offset_state.atom.dirty = true;
> -       ctx->vgt_state.atom.dirty = true;
> -       ctx->sample_mask.atom.dirty = true;
> +       r600_mark_atom_dirty(ctx, &ctx->alphatest_state.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->blend_color.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->cb_misc_state.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->clip_misc_state.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->clip_state.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->db_misc_state.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->db_state.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->framebuffer.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->pixel_shader.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->poly_offset_state.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->vgt_state.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->sample_mask.atom);
>         for (i = 0; i < R600_MAX_VIEWPORTS; i++) {
> -               ctx->scissor[i].atom.dirty = true;
> -               ctx->viewport[i].atom.dirty = true;
> +               r600_mark_atom_dirty(ctx, &ctx->scissor[i].atom);
> +               r600_mark_atom_dirty(ctx, &ctx->viewport[i].atom);
>         }
> -       ctx->config_state.atom.dirty = true;
> -       ctx->stencil_ref.atom.dirty = true;
> -       ctx->vertex_fetch_shader.atom.dirty = true;
> -       ctx->export_shader.atom.dirty = true;
> -       ctx->shader_stages.atom.dirty = true;
> +       r600_mark_atom_dirty(ctx, &ctx->config_state.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->stencil_ref.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->vertex_fetch_shader.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->export_shader.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->shader_stages.atom);
>         if (ctx->gs_shader) {
> -               ctx->geometry_shader.atom.dirty = true;
> -               ctx->gs_rings.atom.dirty = true;
> +               r600_mark_atom_dirty(ctx, &ctx->geometry_shader.atom);
> +               r600_mark_atom_dirty(ctx, &ctx->gs_rings.atom);
>         }
> -       ctx->vertex_shader.atom.dirty = true;
> -       ctx->b.streamout.enable_atom.dirty = true;
> +       r600_mark_atom_dirty(ctx, &ctx->vertex_shader.atom);
> +       r600_mark_atom_dirty(ctx, &ctx->b.streamout.enable_atom);
>
>         if (ctx->blend_state.cso)
> -               ctx->blend_state.atom.dirty = true;
> +               r600_mark_atom_dirty(ctx, &ctx->blend_state.atom);
>         if (ctx->dsa_state.cso)
> -               ctx->dsa_state.atom.dirty = true;
> +               r600_mark_atom_dirty(ctx, &ctx->dsa_state.atom);
>         if (ctx->rasterizer_state.cso)
> -               ctx->rasterizer_state.atom.dirty = true;
> +               r600_mark_atom_dirty(ctx, &ctx->rasterizer_state.atom);
>
>         if (ctx->b.chip_class <= R700) {
> -               ctx->seamless_cube_map.atom.dirty = true;
> +               r600_mark_atom_dirty(ctx, &ctx->seamless_cube_map.atom);
>         }
>
>         ctx->vertex_buffer_state.dirty_mask = ctx->vertex_buffer_state.enabled_mask;
> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
> index f02014e..c4f5c74 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -120,6 +120,7 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
>         rctx->b.b.screen = screen;
>         rctx->b.b.priv = priv;
>         rctx->b.b.destroy = r600_destroy_context;
> +       rctx->b.set_atom_dirty = (void *)r600_set_atom_dirty;
>
>         if (!r600_common_context_init(&rctx->b, &rscreen->b))
>                 goto fail;
> diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
> index bcb9390..3653e8f 100644
> --- a/src/gallium/drivers/r600/r600_pipe.h
> +++ b/src/gallium/drivers/r600/r600_pipe.h
> @@ -498,29 +498,44 @@ static inline void r600_emit_command_buffer(struct radeon_winsys_cs *cs,
>         cs->cdw += cb->num_dw;
>  }
>
> +static inline void r600_set_atom_dirty(struct r600_context *rctx,
> +                                      struct r600_atom *atom,
> +                                      bool dirty)
> +{
> +       atom->dirty = dirty;
> +}
> +
> +static inline void r600_mark_atom_dirty(struct r600_context *rctx,
> +                                       struct r600_atom *atom)
> +{
> +       r600_set_atom_dirty(rctx, atom, true);
> +}
> +
>  void r600_trace_emit(struct r600_context *rctx);
>
>  static inline void r600_emit_atom(struct r600_context *rctx, struct r600_atom *atom)
>  {
>         atom->emit(&rctx->b, atom);
> -       atom->dirty = false;
> +       r600_set_atom_dirty(rctx, atom, false);
>         if (rctx->screen->b.trace_bo) {
>                 r600_trace_emit(rctx);
>         }
>  }
>
> -static inline void r600_set_cso_state(struct r600_cso_state *state, void *cso)
> +static inline void r600_set_cso_state(struct r600_context *rctx,
> +                                     struct r600_cso_state *state, void *cso)
>  {
>         state->cso = cso;
> -       state->atom.dirty = cso != NULL;
> +       r600_set_atom_dirty(rctx, &state->atom, cso != NULL);
>  }
>
> -static inline void r600_set_cso_state_with_cb(struct r600_cso_state *state, void *cso,
> +static inline void r600_set_cso_state_with_cb(struct r600_context *rctx,
> +                                             struct r600_cso_state *state, void *cso,
>                                               struct r600_command_buffer *cb)
>  {
>         state->cb = cb;
>         state->atom.num_dw = cb ? cb->num_dw : 0;
> -       r600_set_cso_state(state, cso);
> +       r600_set_cso_state(rctx, state, cso);
>  }
>
>  /* compute_memory_pool.c */
> diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c
> index c28a1e1..7fb03b4 100644
> --- a/src/gallium/drivers/r600/r600_state.c
> +++ b/src/gallium/drivers/r600/r600_state.c
> @@ -802,7 +802,7 @@ static void r600_set_scissor_states(struct pipe_context *ctx,
>                 return;
>
>         for (i = start_slot ; i < start_slot + num_scissors; i++) {
> -               rctx->scissor[i].atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->scissor[i].atom);
>         }
>  }
>
> @@ -1193,7 +1193,7 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx,
>
>                 if (rctx->alphatest_state.bypass != alphatest_bypass) {
>                         rctx->alphatest_state.bypass = alphatest_bypass;
> -                       rctx->alphatest_state.atom.dirty = true;
> +                       r600_mark_atom_dirty(rctx, &rctx->alphatest_state.atom);
>                 }
>         }
>
> @@ -1209,28 +1209,28 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx,
>
>                 if (state->zsbuf->format != rctx->poly_offset_state.zs_format) {
>                         rctx->poly_offset_state.zs_format = state->zsbuf->format;
> -                       rctx->poly_offset_state.atom.dirty = true;
> +                       r600_mark_atom_dirty(rctx, &rctx->poly_offset_state.atom);
>                 }
>
>                 if (rctx->db_state.rsurf != surf) {
>                         rctx->db_state.rsurf = surf;
> -                       rctx->db_state.atom.dirty = true;
> -                       rctx->db_misc_state.atom.dirty = true;
> +                       r600_mark_atom_dirty(rctx, &rctx->db_state.atom);
> +                       r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>                 }
>         } else if (rctx->db_state.rsurf) {
>                 rctx->db_state.rsurf = NULL;
> -               rctx->db_state.atom.dirty = true;
> -               rctx->db_misc_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->db_state.atom);
> +               r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>         }
>
>         if (rctx->cb_misc_state.nr_cbufs != state->nr_cbufs) {
>                 rctx->cb_misc_state.nr_cbufs = state->nr_cbufs;
> -               rctx->cb_misc_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
>         }
>
>         if (state->nr_cbufs == 0 && rctx->alphatest_state.bypass) {
>                 rctx->alphatest_state.bypass = false;
> -               rctx->alphatest_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->alphatest_state.atom);
>         }
>
>         /* Calculate the CS size. */
> @@ -1250,7 +1250,7 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx,
>                 rctx->framebuffer.atom.num_dw += 2;
>         }
>
> -       rctx->framebuffer.atom.dirty = true;
> +       r600_mark_atom_dirty(rctx, &rctx->framebuffer.atom);
>
>         r600_set_sample_locations_constant_buffer(rctx);
>  }
> @@ -1541,9 +1541,9 @@ static void r600_set_min_samples(struct pipe_context *ctx, unsigned min_samples)
>
>         rctx->ps_iter_samples = min_samples;
>         if (rctx->framebuffer.nr_samples > 1) {
> -               rctx->rasterizer_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->rasterizer_state.atom);
>                 if (rctx->b.chip_class == R600)
> -                       rctx->db_misc_state.atom.dirty = true;
> +                       r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>         }
>  }
>
> @@ -2089,7 +2089,7 @@ bool r600_adjust_gprs(struct r600_context *rctx)
>         if (rctx->config_state.sq_gpr_resource_mgmt_1 != tmp || rctx->config_state.sq_gpr_resource_mgmt_2 != tmp2) {
>                 rctx->config_state.sq_gpr_resource_mgmt_1 = tmp;
>                 rctx->config_state.sq_gpr_resource_mgmt_2 = tmp2;
> -               rctx->config_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->config_state.atom);
>                 rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE;
>         }
>         return true;
> @@ -2796,7 +2796,7 @@ void r600_update_db_shader_control(struct r600_context * rctx)
>
>         if (db_shader_control != rctx->db_misc_state.db_shader_control) {
>                 rctx->db_misc_state.db_shader_control = db_shader_control;
> -               rctx->db_misc_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>         }
>  }
>
> diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
> index 455e59a..2d654dc 100644
> --- a/src/gallium/drivers/r600/r600_state_common.c
> +++ b/src/gallium/drivers/r600/r600_state_common.c
> @@ -127,11 +127,11 @@ static void r600_bind_blend_state_internal(struct r600_context *rctx,
>         rctx->dual_src_blend = blend->dual_src_blend;
>
>         if (!blend_disable) {
> -               r600_set_cso_state_with_cb(&rctx->blend_state, blend, &blend->buffer);
> +               r600_set_cso_state_with_cb(rctx, &rctx->blend_state, blend, &blend->buffer);
>                 color_control = blend->cb_color_control;
>         } else {
>                 /* Blending is disabled. */
> -               r600_set_cso_state_with_cb(&rctx->blend_state, blend, &blend->buffer_no_blend);
> +               r600_set_cso_state_with_cb(rctx, &rctx->blend_state, blend, &blend->buffer_no_blend);
>                 color_control = blend->cb_color_control_no_blend;
>         }
>
> @@ -150,7 +150,7 @@ static void r600_bind_blend_state_internal(struct r600_context *rctx,
>                 update_cb = true;
>         }
>         if (update_cb) {
> -               rctx->cb_misc_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
>         }
>  }
>
> @@ -160,7 +160,7 @@ static void r600_bind_blend_state(struct pipe_context *ctx, void *state)
>         struct r600_blend_state *blend = (struct r600_blend_state *)state;
>
>         if (blend == NULL) {
> -               r600_set_cso_state_with_cb(&rctx->blend_state, NULL, NULL);
> +               r600_set_cso_state_with_cb(rctx, &rctx->blend_state, NULL, NULL);
>                 return;
>         }
>
> @@ -173,7 +173,7 @@ static void r600_set_blend_color(struct pipe_context *ctx,
>         struct r600_context *rctx = (struct r600_context *)ctx;
>
>         rctx->blend_color.state = *state;
> -       rctx->blend_color.atom.dirty = true;
> +       r600_mark_atom_dirty(rctx, &rctx->blend_color.atom);
>  }
>
>  void r600_emit_blend_color(struct r600_context *rctx, struct r600_atom *atom)
> @@ -210,7 +210,7 @@ static void r600_set_clip_state(struct pipe_context *ctx,
>         struct pipe_constant_buffer cb;
>
>         rctx->clip_state.state = *state;
> -       rctx->clip_state.atom.dirty = true;
> +       r600_mark_atom_dirty(rctx, &rctx->clip_state.atom);
>
>         cb.buffer = NULL;
>         cb.user_buffer = state->ucp;
> @@ -226,7 +226,7 @@ static void r600_set_stencil_ref(struct pipe_context *ctx,
>         struct r600_context *rctx = (struct r600_context *)ctx;
>
>         rctx->stencil_ref.state = *state;
> -       rctx->stencil_ref.atom.dirty = true;
> +       r600_mark_atom_dirty(rctx, &rctx->stencil_ref.atom);
>  }
>
>  void r600_emit_stencil_ref(struct r600_context *rctx, struct r600_atom *atom)
> @@ -274,11 +274,11 @@ static void r600_bind_dsa_state(struct pipe_context *ctx, void *state)
>         struct r600_stencil_ref ref;
>
>         if (state == NULL) {
> -               r600_set_cso_state_with_cb(&rctx->dsa_state, NULL, NULL);
> +               r600_set_cso_state_with_cb(rctx, &rctx->dsa_state, NULL, NULL);
>                 return;
>         }
>
> -       r600_set_cso_state_with_cb(&rctx->dsa_state, dsa, &dsa->buffer);
> +       r600_set_cso_state_with_cb(rctx, &rctx->dsa_state, dsa, &dsa->buffer);
>
>         ref.ref_value[0] = rctx->stencil_ref.pipe_state.ref_value[0];
>         ref.ref_value[1] = rctx->stencil_ref.pipe_state.ref_value[1];
> @@ -293,7 +293,7 @@ static void r600_bind_dsa_state(struct pipe_context *ctx, void *state)
>                          * we are having lockup on evergreen so do not enable
>                          * hyperz when not writing zbuffer
>                          */
> -                       rctx->db_misc_state.atom.dirty = true;
> +                       r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>                 }
>         }
>
> @@ -304,7 +304,7 @@ static void r600_bind_dsa_state(struct pipe_context *ctx, void *state)
>             rctx->alphatest_state.sx_alpha_ref != dsa->alpha_ref) {
>                 rctx->alphatest_state.sx_alpha_test_control = dsa->sx_alpha_test_control;
>                 rctx->alphatest_state.sx_alpha_ref = dsa->alpha_ref;
> -               rctx->alphatest_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->alphatest_state.atom);
>         }
>  }
>
> @@ -318,14 +318,14 @@ static void r600_bind_rs_state(struct pipe_context *ctx, void *state)
>
>         rctx->rasterizer = rs;
>
> -       r600_set_cso_state_with_cb(&rctx->rasterizer_state, rs, &rs->buffer);
> +       r600_set_cso_state_with_cb(rctx, &rctx->rasterizer_state, rs, &rs->buffer);
>
>         if (rs->offset_enable &&
>             (rs->offset_units != rctx->poly_offset_state.offset_units ||
>              rs->offset_scale != rctx->poly_offset_state.offset_scale)) {
>                 rctx->poly_offset_state.offset_units = rs->offset_units;
>                 rctx->poly_offset_state.offset_scale = rs->offset_scale;
> -               rctx->poly_offset_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->poly_offset_state.atom);
>         }
>
>         /* Update clip_misc_state. */
> @@ -333,14 +333,14 @@ static void r600_bind_rs_state(struct pipe_context *ctx, void *state)
>             rctx->clip_misc_state.clip_plane_enable != rs->clip_plane_enable) {
>                 rctx->clip_misc_state.pa_cl_clip_cntl = rs->pa_cl_clip_cntl;
>                 rctx->clip_misc_state.clip_plane_enable = rs->clip_plane_enable;
> -               rctx->clip_misc_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->clip_misc_state.atom);
>         }
>
>         /* Workaround for a missing scissor enable on r600. */
>         if (rctx->b.chip_class == R600 &&
>             rs->scissor_enable != rctx->scissor[0].enable) {
>                 rctx->scissor[0].enable = rs->scissor_enable;
> -               rctx->scissor[0].atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->scissor[0].atom);
>         }
>
>         /* Re-emit PA_SC_LINE_STIPPLE. */
> @@ -378,7 +378,7 @@ void r600_sampler_states_dirty(struct r600_context *rctx,
>                 state->atom.num_dw =
>                         util_bitcount(state->dirty_mask & state->has_bordercolor_mask) * 11 +
>                         util_bitcount(state->dirty_mask & ~state->has_bordercolor_mask) * 5;
> -               state->atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &state->atom);
>         }
>  }
>
> @@ -443,7 +443,7 @@ static void r600_bind_sampler_states(struct pipe_context *pipe,
>                 /* change in TA_CNTL_AUX need a pipeline flush */
>                 rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE;
>                 rctx->seamless_cube_map.enabled = seamless_cube_map;
> -               rctx->seamless_cube_map.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->seamless_cube_map.atom);
>         }
>  }
>
> @@ -483,7 +483,7 @@ static void r600_bind_vertex_elements(struct pipe_context *ctx, void *state)
>  {
>         struct r600_context *rctx = (struct r600_context *)ctx;
>
> -       r600_set_cso_state(&rctx->vertex_fetch_shader, state);
> +       r600_set_cso_state(rctx, &rctx->vertex_fetch_shader, state);
>  }
>
>  static void r600_delete_vertex_elements(struct pipe_context *ctx, void *state)
> @@ -513,7 +513,7 @@ void r600_vertex_buffers_dirty(struct r600_context *rctx)
>                 rctx->b.flags |= R600_CONTEXT_INV_VERTEX_CACHE;
>                 rctx->vertex_buffer_state.atom.num_dw = (rctx->b.chip_class >= EVERGREEN ? 12 : 11) *
>                                                util_bitcount(rctx->vertex_buffer_state.dirty_mask);
> -               rctx->vertex_buffer_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->vertex_buffer_state.atom);
>         }
>  }
>
> @@ -570,7 +570,7 @@ void r600_sampler_views_dirty(struct r600_context *rctx,
>                 rctx->b.flags |= R600_CONTEXT_INV_TEX_CACHE;
>                 state->atom.num_dw = (rctx->b.chip_class >= EVERGREEN ? 14 : 13) *
>                                      util_bitcount(state->dirty_mask);
> -               state->atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &state->atom);
>         }
>  }
>
> @@ -673,7 +673,7 @@ static void r600_set_viewport_states(struct pipe_context *ctx,
>
>         for (i = start_slot; i < start_slot + num_viewports; i++) {
>                 rctx->viewport[i].state = state[i - start_slot];
> -               rctx->viewport[i].atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->viewport[i].atom);
>         }
>  }
>
> @@ -913,7 +913,7 @@ void r600_constant_buffers_dirty(struct r600_context *rctx, struct r600_constbuf
>                 rctx->b.flags |= R600_CONTEXT_INV_CONST_CACHE;
>                 state->atom.num_dw = rctx->b.chip_class >= EVERGREEN ? util_bitcount(state->dirty_mask)*20
>                                                                    : util_bitcount(state->dirty_mask)*19;
> -               state->atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &state->atom);
>         }
>  }
>
> @@ -982,7 +982,7 @@ static void r600_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask
>                 return;
>
>         rctx->sample_mask.sample_mask = sample_mask;
> -       rctx->sample_mask.atom.dirty = true;
> +       r600_mark_atom_dirty(rctx, &rctx->sample_mask.atom);
>  }
>
>  /*
> @@ -1107,27 +1107,28 @@ static void update_shader_atom(struct pipe_context *ctx,
>                                struct r600_shader_state *state,
>                                struct r600_pipe_shader *shader)
>  {
> +       struct r600_context *rctx = (struct r600_context *)ctx;
> +
>         state->shader = shader;
>         if (shader) {
>                 state->atom.num_dw = shader->command_buffer.num_dw;
> -               state->atom.dirty = true;
>                 r600_context_add_resource_size(ctx, (struct pipe_resource *)shader->bo);
>         } else {
>                 state->atom.num_dw = 0;
> -               state->atom.dirty = false;
>         }
> +       r600_mark_atom_dirty(rctx, &state->atom);
>  }
>
>  static void update_gs_block_state(struct r600_context *rctx, unsigned enable)
>  {
>         if (rctx->shader_stages.geom_enable != enable) {
>                 rctx->shader_stages.geom_enable = enable;
> -               rctx->shader_stages.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
>         }
>
>         if (rctx->gs_rings.enable != enable) {
>                 rctx->gs_rings.enable = enable;
> -               rctx->gs_rings.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->gs_rings.atom);
>
>                 if (enable && !rctx->gs_rings.esgs_ring.buffer) {
>                         unsigned size = 0x1C000;
> @@ -1192,7 +1193,7 @@ static bool r600_update_derived_state(struct r600_context *rctx)
>
>                 if (!rctx->shader_stages.geom_enable) {
>                         rctx->shader_stages.geom_enable = true;
> -                       rctx->shader_stages.atom.dirty = true;
> +                       r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
>                 }
>
>                 /* gs_shader provides GS and VS (copy shader) */
> @@ -1206,7 +1207,7 @@ static bool r600_update_derived_state(struct r600_context *rctx)
>                                 rctx->clip_misc_state.pa_cl_vs_out_cntl = rctx->gs_shader->current->gs_copy_shader->pa_cl_vs_out_cntl;
>                                 rctx->clip_misc_state.clip_dist_write = rctx->gs_shader->current->gs_copy_shader->shader.clip_dist_write;
>                                 rctx->clip_misc_state.clip_disable = rctx->gs_shader->current->shader.vs_position_window_space;
> -                               rctx->clip_misc_state.atom.dirty = true;
> +                               r600_mark_atom_dirty(rctx, &rctx->clip_misc_state.atom);
>                         }
>                         rctx->b.streamout.enabled_stream_buffers_mask = rctx->gs_shader->current->gs_copy_shader->enabled_stream_buffers_mask;
>                 }
> @@ -1224,7 +1225,7 @@ static bool r600_update_derived_state(struct r600_context *rctx)
>                         update_shader_atom(ctx, &rctx->geometry_shader, NULL);
>                         update_shader_atom(ctx, &rctx->export_shader, NULL);
>                         rctx->shader_stages.geom_enable = false;
> -                       rctx->shader_stages.atom.dirty = true;
> +                       r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
>                 }
>
>                 r600_shader_select(ctx, rctx->vs_shader, &vs_dirty);
> @@ -1241,7 +1242,7 @@ static bool r600_update_derived_state(struct r600_context *rctx)
>                                 rctx->clip_misc_state.pa_cl_vs_out_cntl = rctx->vs_shader->current->pa_cl_vs_out_cntl;
>                                 rctx->clip_misc_state.clip_dist_write = rctx->vs_shader->current->shader.clip_dist_write;
>                                 rctx->clip_misc_state.clip_disable = rctx->vs_shader->current->shader.vs_position_window_space;
> -                               rctx->clip_misc_state.atom.dirty = true;
> +                               r600_mark_atom_dirty(rctx, &rctx->clip_misc_state.atom);
>                         }
>                         rctx->b.streamout.enabled_stream_buffers_mask = rctx->vs_shader->current->enabled_stream_buffers_mask;
>                 }
> @@ -1254,7 +1255,7 @@ static bool r600_update_derived_state(struct r600_context *rctx)
>
>                 if (rctx->cb_misc_state.nr_ps_color_outputs != rctx->ps_shader->current->nr_ps_color_outputs) {
>                         rctx->cb_misc_state.nr_ps_color_outputs = rctx->ps_shader->current->nr_ps_color_outputs;
> -                       rctx->cb_misc_state.atom.dirty = true;
> +                       r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
>                 }
>
>                 if (rctx->b.chip_class <= R700) {
> @@ -1262,7 +1263,7 @@ static bool r600_update_derived_state(struct r600_context *rctx)
>
>                         if (rctx->cb_misc_state.multiwrite != multiwrite) {
>                                 rctx->cb_misc_state.multiwrite = multiwrite;
> -                               rctx->cb_misc_state.atom.dirty = true;
> +                               r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
>                         }
>                 }
>
> @@ -1276,7 +1277,7 @@ static bool r600_update_derived_state(struct r600_context *rctx)
>                                 r600_update_ps_state(ctx, rctx->ps_shader->current);
>                 }
>
> -               rctx->shader_stages.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
>                 update_shader_atom(ctx, &rctx->pixel_shader, rctx->ps_shader->current);
>         }
>
> @@ -1455,13 +1456,13 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info
>                 rctx->vgt_state.vgt_multi_prim_ib_reset_en = info.primitive_restart;
>                 rctx->vgt_state.vgt_multi_prim_ib_reset_indx = info.restart_index;
>                 rctx->vgt_state.vgt_indx_offset = info.index_bias;
> -               rctx->vgt_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->vgt_state.atom);
>         }
>
>         /* Workaround for hardware deadlock on certain R600 ASICs: write into a CB register. */
>         if (rctx->b.chip_class == R600) {
>                 rctx->b.flags |= R600_CONTEXT_PS_PARTIAL_FLUSH;
> -               rctx->cb_misc_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
>         }
>
>         /* Emit states. */
> @@ -2491,7 +2492,7 @@ static void r600_set_occlusion_query_state(struct pipe_context *ctx, bool enable
>
>         if (rctx->db_misc_state.occlusion_query_enabled != enable) {
>                 rctx->db_misc_state.occlusion_query_enabled = enable;
> -               rctx->db_misc_state.atom.dirty = true;
> +               r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
>         }
>  }
>
> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h
> index ce3f396..717e248 100644
> --- a/src/gallium/drivers/radeon/r600_pipe_common.h
> +++ b/src/gallium/drivers/radeon/r600_pipe_common.h
> @@ -466,6 +466,9 @@ struct r600_common_context {
>         /* This ensures there is enough space in the command stream. */
>         void (*need_gfx_cs_space)(struct pipe_context *ctx, unsigned num_dw,
>                                   bool include_draw_vbo);
> +
> +       void (*set_atom_dirty)(struct r600_common_context *ctx,
> +                              struct r600_atom *atom, bool dirty);
>  };
>
>  /* r600_buffer.c */
> diff --git a/src/gallium/drivers/radeon/r600_streamout.c b/src/gallium/drivers/radeon/r600_streamout.c
> index 026fb30..0853f63 100644
> --- a/src/gallium/drivers/radeon/r600_streamout.c
> +++ b/src/gallium/drivers/radeon/r600_streamout.c
> @@ -104,7 +104,7 @@ void r600_streamout_buffers_dirty(struct r600_common_context *rctx)
>                 (num_bufs - num_bufs_appended) * 6 + /* STRMOUT_BUFFER_UPDATE */
>                 (rctx->family > CHIP_R600 && rctx->family < CHIP_RS780 ? 2 : 0); /* SURFACE_BASE_UPDATE */
>
> -       begin->dirty = true;
> +       rctx->set_atom_dirty(rctx, begin, true);
>
>         r600_set_streamout_enable(rctx, true);
>  }
> @@ -145,7 +145,7 @@ void r600_set_streamout_targets(struct pipe_context *ctx,
>         if (num_targets) {
>                 r600_streamout_buffers_dirty(rctx);
>         } else {
> -               rctx->streamout.begin_atom.dirty = false;
> +               rctx->set_atom_dirty(rctx, &rctx->streamout.begin_atom, false);
>                 r600_set_streamout_enable(rctx, false);
>         }
>  }
> @@ -353,8 +353,9 @@ static void r600_set_streamout_enable(struct r600_common_context *rctx, bool ena
>                                           (rctx->streamout.enabled_mask << 12);
>
>         if ((old_strmout_en != r600_get_strmout_en(rctx)) ||
> -            (old_hw_enabled_mask != rctx->streamout.hw_enabled_mask))
> -               rctx->streamout.enable_atom.dirty = true;
> +            (old_hw_enabled_mask != rctx->streamout.hw_enabled_mask)) {
> +               rctx->set_atom_dirty(rctx, &rctx->streamout.enable_atom, true);
> +       }
>  }
>
>  void r600_update_prims_generated_query_state(struct r600_common_context *rctx,
> @@ -369,8 +370,9 @@ void r600_update_prims_generated_query_state(struct r600_common_context *rctx,
>                 rctx->streamout.prims_gen_query_enabled =
>                         rctx->streamout.num_prims_gen_queries != 0;
>
> -               if (old_strmout_en != r600_get_strmout_en(rctx))
> -                       rctx->streamout.enable_atom.dirty = true;
> +               if (old_strmout_en != r600_get_strmout_en(rctx)) {
> +                       rctx->set_atom_dirty(rctx, &rctx->streamout.enable_atom, true);
> +               }
>         }
>  }
>
> diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c
> index d05b0a1..57c40d9 100644
> --- a/src/gallium/drivers/radeon/r600_texture.c
> +++ b/src/gallium/drivers/radeon/r600_texture.c
> @@ -1276,7 +1276,7 @@ void evergreen_do_fast_color_clear(struct r600_common_context *rctx,
>                                    tex->cmask.offset, tex->cmask.size, 0, true);
>
>                 tex->dirty_level_mask |= 1 << fb->cbufs[i]->u.tex.level;
> -               fb_state->dirty = true;
> +               rctx->set_atom_dirty(rctx, fb_state, true);
>                 *buffers &= ~clear_bit;
>         }
>  }
> diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c
> index 61ca2a8..48972bd 100644
> --- a/src/gallium/drivers/radeonsi/si_blit.c
> +++ b/src/gallium/drivers/radeonsi/si_blit.c
> @@ -148,7 +148,7 @@ static void si_blit_decompress_depth(struct pipe_context *ctx,
>                                 struct pipe_surface *zsurf, *cbsurf, surf_tmpl;
>
>                                 sctx->dbcb_copy_sample = sample;
> -                               sctx->db_render_state.dirty = true;
> +                               si_mark_atom_dirty(sctx, &sctx->db_render_state);
>
>                                 surf_tmpl.format = texture->resource.b.b.format;
>                                 surf_tmpl.u.tex.level = level;
> @@ -182,7 +182,7 @@ static void si_blit_decompress_depth(struct pipe_context *ctx,
>
>         sctx->dbcb_depth_copy_enabled = false;
>         sctx->dbcb_stencil_copy_enabled = false;
> -       sctx->db_render_state.dirty = true;
> +       si_mark_atom_dirty(sctx, &sctx->db_render_state);
>  }
>
>  static void si_blit_decompress_depth_in_place(struct si_context *sctx,
> @@ -194,7 +194,7 @@ static void si_blit_decompress_depth_in_place(struct si_context *sctx,
>         unsigned layer, max_layer, checked_last_layer, level;
>
>         sctx->db_inplace_flush_enabled = true;
> -       sctx->db_render_state.dirty = true;
> +       si_mark_atom_dirty(sctx, &sctx->db_render_state);
>
>         surf_tmpl.format = texture->resource.b.b.format;
>
> @@ -232,7 +232,7 @@ static void si_blit_decompress_depth_in_place(struct si_context *sctx,
>         }
>
>         sctx->db_inplace_flush_enabled = false;
> -       sctx->db_render_state.dirty = true;
> +       si_mark_atom_dirty(sctx, &sctx->db_render_state);
>  }
>
>  void si_flush_depth_textures(struct si_context *sctx,
> @@ -378,9 +378,9 @@ static void si_clear(struct pipe_context *ctx, unsigned buffers,
>                 }
>
>                 zstex->depth_clear_value = depth;
> -               sctx->framebuffer.atom.dirty = true; /* updates DB_DEPTH_CLEAR */
> +               si_mark_atom_dirty(sctx, &sctx->framebuffer.atom); /* updates DB_DEPTH_CLEAR */
>                 sctx->db_depth_clear = true;
> -               sctx->db_render_state.dirty = true;
> +               si_mark_atom_dirty(sctx, &sctx->db_render_state);
>         }
>
>         si_blitter_begin(ctx, SI_CLEAR);
> @@ -393,7 +393,7 @@ static void si_clear(struct pipe_context *ctx, unsigned buffers,
>                 sctx->db_depth_clear = false;
>                 sctx->db_depth_disable_expclear = false;
>                 zstex->depth_cleared = true;
> -               sctx->db_render_state.dirty = true;
> +               si_mark_atom_dirty(sctx, &sctx->db_render_state);
>         }
>  }
>
> diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
> index fcf4dbf..8d9f8f7 100644
> --- a/src/gallium/drivers/radeonsi/si_descriptors.c
> +++ b/src/gallium/drivers/radeonsi/si_descriptors.c
> @@ -122,7 +122,7 @@ static bool si_upload_descriptors(struct si_context *sctx,
>
>         desc->list_dirty = false;
>         desc->pointer_dirty = true;
> -       sctx->shader_userdata.atom.dirty = true;
> +       si_mark_atom_dirty(sctx, &sctx->shader_userdata.atom);
>         return true;
>  }
>
> @@ -452,7 +452,7 @@ static bool si_upload_vertex_buffer_descriptors(struct si_context *sctx)
>          * uploaded to a fresh new buffer, so I don't think flushing the const
>          * cache is needed. */
>         desc->pointer_dirty = true;
> -       sctx->shader_userdata.atom.dirty = true;
> +       si_mark_atom_dirty(sctx, &sctx->shader_userdata.atom);
>         sctx->vertex_buffers_dirty = false;
>         return true;
>  }
> @@ -869,7 +869,7 @@ static void si_mark_shader_pointers_dirty(struct si_context *sctx,
>         if (shader == PIPE_SHADER_VERTEX)
>                 sctx->vertex_buffers.pointer_dirty = true;
>
> -       sctx->shader_userdata.atom.dirty = true;
> +       si_mark_atom_dirty(sctx, &sctx->shader_userdata.atom);
>  }
>
>  static void si_shader_userdata_begin_new_cs(struct si_context *sctx)
> diff --git a/src/gallium/drivers/radeonsi/si_hw_context.c b/src/gallium/drivers/radeonsi/si_hw_context.c
> index 8658056..307dc39 100644
> --- a/src/gallium/drivers/radeonsi/si_hw_context.c
> +++ b/src/gallium/drivers/radeonsi/si_hw_context.c
> @@ -178,12 +178,12 @@ void si_begin_new_cs(struct si_context *ctx)
>         /* The CS initialization should be emitted before everything else. */
>         si_pm4_emit(ctx, ctx->init_config);
>
> -       ctx->clip_regs.dirty = true;
> -       ctx->framebuffer.atom.dirty = true;
> -       ctx->msaa_sample_locs.dirty = true;
> -       ctx->msaa_config.dirty = true;
> -       ctx->db_render_state.dirty = true;
> -       ctx->b.streamout.enable_atom.dirty = true;
> +       si_mark_atom_dirty(ctx, &ctx->clip_regs);
> +       si_mark_atom_dirty(ctx, &ctx->framebuffer.atom);
> +       si_mark_atom_dirty(ctx, &ctx->msaa_sample_locs);
> +       si_mark_atom_dirty(ctx, &ctx->msaa_config);
> +       si_mark_atom_dirty(ctx, &ctx->db_render_state);
> +       si_mark_atom_dirty(ctx, &ctx->b.streamout.enable_atom);
>         si_all_descriptors_begin_new_cs(ctx);
>
>         r600_postflush_resume_features(&ctx->b);
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
> index cacef9f..e29b158 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.c
> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
> @@ -101,6 +101,7 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen, void *
>         sctx->b.b.screen = screen; /* this must be set first */
>         sctx->b.b.priv = priv;
>         sctx->b.b.destroy = si_destroy_context;
> +       sctx->b.set_atom_dirty = (void *)si_set_atom_dirty;
>         sctx->screen = sscreen; /* Easy accessing of screen/winsys. */
>
>         if (!r600_common_context_init(&sctx->b, &sscreen->b))
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
> index a249d31..553e1f3 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.h
> +++ b/src/gallium/drivers/radeonsi/si_pipe.h
> @@ -325,4 +325,18 @@ si_invalidate_draw_sh_constants(struct si_context *sctx)
>         sctx->last_sh_base_reg = -1; /* reset to an unknown value */
>  }
>
> +static inline void
> +si_set_atom_dirty(struct si_context *sctx,
> +                 struct r600_atom *atom, bool dirty)
> +{
> +       atom->dirty = dirty;
> +}
> +
> +static inline void
> +si_mark_atom_dirty(struct si_context *sctx,
> +                  struct r600_atom *atom)
> +{
> +       si_set_atom_dirty(sctx, atom, true);
> +}
> +
>  #endif
> diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
> index a7aa062..1cac804 100644
> --- a/src/gallium/drivers/radeonsi/si_state.c
> +++ b/src/gallium/drivers/radeonsi/si_state.c
> @@ -734,12 +734,12 @@ static void si_bind_rs_state(struct pipe_context *ctx, void *state)
>
>         if (sctx->framebuffer.nr_samples > 1 &&
>             (!old_rs || old_rs->multisample_enable != rs->multisample_enable))
> -               sctx->db_render_state.dirty = true;
> +               si_mark_atom_dirty(sctx, &sctx->db_render_state);
>
>         si_pm4_bind_state(sctx, rasterizer, rs);
>         si_update_fb_rs_state(sctx);
>
> -       sctx->clip_regs.dirty = true;
> +       si_mark_atom_dirty(sctx, &sctx->clip_regs);
>  }
>
>  static void si_delete_rs_state(struct pipe_context *ctx, void *state)
> @@ -904,7 +904,7 @@ static void si_set_occlusion_query_state(struct pipe_context *ctx, bool enable)
>  {
>         struct si_context *sctx = (struct si_context*)ctx;
>
> -       sctx->db_render_state.dirty = true;
> +       si_mark_atom_dirty(sctx, &sctx->db_render_state);
>  }
>
>  static void si_emit_db_render_state(struct si_context *sctx, struct r600_atom *state)
> @@ -2038,7 +2038,7 @@ static void si_set_framebuffer_state(struct pipe_context *ctx,
>                                   util_format_is_pure_integer(state->cbufs[0]->format);
>
>         if (sctx->framebuffer.cb0_is_integer != old_cb0_is_integer)
> -               sctx->db_render_state.dirty = true;
> +               si_mark_atom_dirty(sctx, &sctx->db_render_state);
>
>         for (i = 0; i < state->nr_cbufs; i++) {
>                 if (!state->cbufs[i])
> @@ -2083,11 +2083,11 @@ static void si_set_framebuffer_state(struct pipe_context *ctx,
>         sctx->framebuffer.atom.num_dw += state->zsbuf ? 26 : 4;
>         sctx->framebuffer.atom.num_dw += 3; /* WINDOW_SCISSOR_BR */
>         sctx->framebuffer.atom.num_dw += 18; /* MSAA sample locations */
> -       sctx->framebuffer.atom.dirty = true;
> +       si_mark_atom_dirty(sctx, &sctx->framebuffer.atom);
>
>         if (sctx->framebuffer.nr_samples != old_nr_samples) {
> -               sctx->msaa_config.dirty = true;
> -               sctx->db_render_state.dirty = true;
> +               si_mark_atom_dirty(sctx, &sctx->msaa_config);
> +               si_mark_atom_dirty(sctx, &sctx->db_render_state);
>
>                 /* Set sample locations as fragment shader constants. */
>                 switch (sctx->framebuffer.nr_samples) {
> @@ -2124,7 +2124,7 @@ static void si_set_framebuffer_state(struct pipe_context *ctx,
>                      old_nr_samples != SI_NUM_SMOOTH_AA_SAMPLES) &&
>                     (sctx->framebuffer.nr_samples != SI_NUM_SMOOTH_AA_SAMPLES ||
>                      old_nr_samples != 1))
> -                       sctx->msaa_sample_locs.dirty = true;
> +                       si_mark_atom_dirty(sctx, &sctx->msaa_sample_locs);
>         }
>  }
>
> @@ -2266,7 +2266,7 @@ static void si_set_min_samples(struct pipe_context *ctx, unsigned min_samples)
>         sctx->ps_iter_samples = min_samples;
>
>         if (sctx->framebuffer.nr_samples > 1)
> -               sctx->msaa_config.dirty = true;
> +               si_mark_atom_dirty(sctx, &sctx->msaa_config);
>  }
>
>  /*
> diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
> index e8faf40..f136a1c 100644
> --- a/src/gallium/drivers/radeonsi/si_state_draw.c
> +++ b/src/gallium/drivers/radeonsi/si_state_draw.c
> @@ -796,7 +796,7 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
>
>         /* Check flush flags. */
>         if (sctx->b.flags)
> -               sctx->atoms.s.cache_flush->dirty = true;
> +               si_mark_atom_dirty(sctx, sctx->atoms.s.cache_flush);
>
>         si_need_cs_space(sctx, 0, TRUE);
>
> diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
> index fbcb0f4..475aea1 100644
> --- a/src/gallium/drivers/radeonsi/si_state_shaders.c
> +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
> @@ -744,7 +744,7 @@ static void si_bind_vs_shader(struct pipe_context *ctx, void *state)
>                 return;
>
>         sctx->vs_shader = sel;
> -       sctx->clip_regs.dirty = true;
> +       si_mark_atom_dirty(sctx, &sctx->clip_regs);
>  }
>
>  static void si_bind_gs_shader(struct pipe_context *ctx, void *state)
> @@ -757,7 +757,7 @@ static void si_bind_gs_shader(struct pipe_context *ctx, void *state)
>                 return;
>
>         sctx->gs_shader = sel;
> -       sctx->clip_regs.dirty = true;
> +       si_mark_atom_dirty(sctx, &sctx->clip_regs);
>         sctx->last_rast_prim = -1; /* reset this so that it gets updated */
>
>         if (enable_changed)
> @@ -789,7 +789,7 @@ static void si_bind_tes_shader(struct pipe_context *ctx, void *state)
>                 return;
>
>         sctx->tes_shader = sel;
> -       sctx->clip_regs.dirty = true;
> +       si_mark_atom_dirty(sctx, &sctx->clip_regs);
>         sctx->last_rast_prim = -1; /* reset this so that it gets updated */
>
>         if (enable_changed) {
> @@ -1402,15 +1402,15 @@ void si_update_shaders(struct si_context *sctx)
>
>         if (sctx->ps_db_shader_control != sctx->ps_shader->current->db_shader_control) {
>                 sctx->ps_db_shader_control = sctx->ps_shader->current->db_shader_control;
> -               sctx->db_render_state.dirty = true;
> +               si_mark_atom_dirty(sctx, &sctx->db_render_state);
>         }
>
>         if (sctx->smoothing_enabled != sctx->ps_shader->current->key.ps.poly_line_smoothing) {
>                 sctx->smoothing_enabled = sctx->ps_shader->current->key.ps.poly_line_smoothing;
> -               sctx->msaa_config.dirty = true;
> +               si_mark_atom_dirty(sctx, &sctx->msaa_config);
>
>                 if (sctx->b.chip_class == SI)
> -                       sctx->db_render_state.dirty = true;
> +                       si_mark_atom_dirty(sctx, &sctx->db_render_state);
>         }
>  }
>
> --
> 1.9.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list