summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/radeonsi/si_state_draw.c
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2015-08-29 00:49:40 +0200
committerMarek Olšák <marek.olsak@amd.com>2015-09-01 21:51:14 +0200
commit87c1e9e19c6baa8c6fb03b0894c72744a07cde63 (patch)
treee0cab820884e5a272c876f3fdf0a020fdbbe05aa /src/gallium/drivers/radeonsi/si_state_draw.c
parent2fe040ee61d3c08e8d38c3552ad4e7b5060074a1 (diff)
downloadexternal_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.c13
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);