summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolai Hähnle <[email protected]>2016-04-22 12:55:15 -0500
committerNicolai Hähnle <[email protected]>2016-04-27 11:16:39 -0500
commitdc6fc2f390300dbd78cb29eed8a545908588b441 (patch)
treebc9d7cd35ce66b04f34a7d447fa7b3dbc8c430ed
parentd14d6c3f583d1e543945f7f4a38cfcbb823506ce (diff)
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 <[email protected]>
-rw-r--r--src/gallium/drivers/radeonsi/si_blit.c20
1 files 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;