Mesa (master): radeonsi: early out of si_blit_decompress_depth_in_place based on dirty mask

Nicolai Hähnle nh at kemper.freedesktop.org
Wed Apr 27 16:16:54 UTC 2016


Module: Mesa
Branch: master
Commit: dc6fc2f390300dbd78cb29eed8a545908588b441
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=dc6fc2f390300dbd78cb29eed8a545908588b441

Author: Nicolai Hähnle <nicolai.haehnle at amd.com>
Date:   Fri Apr 22 12:55:15 2016 -0500

radeonsi: early out of si_blit_decompress_depth_in_place based on dirty mask

Avoid dirtying the db_render_state atom when possible.

Reviewed-by: Marek Olšák <marek.olsak at amd.com>

---

 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 6db73f7..5882f7d 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;
 




More information about the mesa-commit mailing list