From dc6fc2f390300dbd78cb29eed8a545908588b441 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolai=20H=C3=A4hnle?= Date: Fri, 22 Apr 2016 12:55:15 -0500 Subject: [PATCH] radeonsi: early out of si_blit_decompress_depth_in_place based on dirty mask MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Avoid dirtying the db_render_state atom when possible. Reviewed-by: Marek Olšák --- src/gallium/drivers/radeonsi/si_blit.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index 6db73f7cbb6..5882f7dcb2a 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -186,23 +186,31 @@ static void si_blit_decompress_depth_in_place(struct si_context *sctx, unsigned first_layer, unsigned last_layer) { struct pipe_surface *zsurf, surf_tmpl = {{0}}; - unsigned layer, max_layer, checked_last_layer, level; + unsigned layer, max_layer, checked_last_layer; unsigned *dirty_level_mask; + unsigned level_mask = + u_bit_consecutive(first_level, last_level - first_level + 1); if (is_stencil_sampler) { - sctx->db_flush_stencil_inplace = true; dirty_level_mask = &texture->stencil_dirty_level_mask; } else { - sctx->db_flush_depth_inplace = true; dirty_level_mask = &texture->dirty_level_mask; } + + level_mask &= *dirty_level_mask; + if (!level_mask) + return; + + if (is_stencil_sampler) + sctx->db_flush_stencil_inplace = true; + else + sctx->db_flush_depth_inplace = true; si_mark_atom_dirty(sctx, &sctx->db_render_state); surf_tmpl.format = texture->resource.b.b.format; - for (level = first_level; level <= last_level; level++) { - if (!(*dirty_level_mask & (1 << level))) - continue; + while (level_mask) { + unsigned level = u_bit_scan(&level_mask); surf_tmpl.u.tex.level = level; -- 2.30.2