diff options
author | Marek Olšák <marek.olsak@amd.com> | 2015-08-29 00:49:40 +0200 |
---|---|---|
committer | Marek Olšák <marek.olsak@amd.com> | 2015-09-01 21:51:14 +0200 |
commit | 87c1e9e19c6baa8c6fb03b0894c72744a07cde63 (patch) | |
tree | e0cab820884e5a272c876f3fdf0a020fdbbe05aa /src/gallium/drivers/radeonsi/si_state_draw.c | |
parent | 2fe040ee61d3c08e8d38c3552ad4e7b5060074a1 (diff) | |
download | external_mesa3d-87c1e9e19c6baa8c6fb03b0894c72744a07cde63.zip external_mesa3d-87c1e9e19c6baa8c6fb03b0894c72744a07cde63.tar.gz external_mesa3d-87c1e9e19c6baa8c6fb03b0894c72744a07cde63.tar.bz2 |
radeonsi: use a bitmask for tracking dirty atoms
This mainly removes the cache misses when checking the dirty flags.
Not much else though.
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
Diffstat (limited to 'src/gallium/drivers/radeonsi/si_state_draw.c')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state_draw.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index 2ff58d1..81575b5 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -729,7 +729,7 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info) { struct si_context *sctx = (struct si_context *)ctx; struct pipe_index_buffer ib = {}; - unsigned i; + unsigned mask; if (!info->count && !info->indirect && (info->indexed || !info->count_from_stream_output)) @@ -821,12 +821,13 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info) si_need_cs_space(sctx, 0, TRUE); /* Emit states. */ - for (i = 0; i < SI_NUM_ATOMS; i++) { - if (sctx->atoms.array[i]->dirty) { - sctx->atoms.array[i]->emit(&sctx->b, sctx->atoms.array[i]); - sctx->atoms.array[i]->dirty = false; - } + mask = sctx->dirty_atoms; + while (mask) { + struct r600_atom *atom = sctx->atoms.array[u_bit_scan(&mask)]; + + atom->emit(&sctx->b, atom); } + sctx->dirty_atoms = 0; si_pm4_emit_dirty(sctx); si_emit_scratch_reloc(sctx); |