[Mesa-dev] [PATCH 12/18] r600g: don't decompress depth or stencil if there isn't any

Marek Olšák maraeo at gmail.com
Thu Aug 2 06:14:40 PDT 2012


---
 src/gallium/drivers/r600/evergreen_state.c |    7 +++++--
 src/gallium/drivers/r600/r600_blit.c       |   12 +++++++-----
 src/gallium/drivers/r600/r600_pipe.h       |    1 +
 src/gallium/drivers/r600/r600_state.c      |    6 ++++--
 4 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
index 87a301f..75ed9ef 100644
--- a/src/gallium/drivers/r600/evergreen_state.c
+++ b/src/gallium/drivers/r600/evergreen_state.c
@@ -1722,9 +1722,12 @@ static void evergreen_emit_db_misc_state(struct r600_context *rctx, struct r600_
 		db_count_control |= S_028004_PERFECT_ZPASS_COUNTS(1);
 		db_render_override |= S_02800C_NOOP_CULL_DISABLE(1);
 	}
+
 	if (a->flush_depthstencil_through_cb) {
-		db_render_control |= S_028000_DEPTH_COPY_ENABLE(1) |
-				     S_028000_STENCIL_COPY_ENABLE(1) |
+		assert(a->copy_depth || a->copy_stencil);
+
+		db_render_control |= S_028000_DEPTH_COPY_ENABLE(a->copy_depth) |
+				     S_028000_STENCIL_COPY_ENABLE(a->copy_stencil) |
 				     S_028000_COPY_CENTROID(1);
 	}
 
diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c
index 9c4e911..3623b2e 100644
--- a/src/gallium/drivers/r600/r600_blit.c
+++ b/src/gallium/drivers/r600/r600_blit.c
@@ -130,6 +130,8 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx,
 	float depth = 1.0f;
 	struct r600_resource_texture *flushed_depth_texture = staging ?
 			staging : texture->flushed_depth_texture;
+	const struct util_format_description *desc =
+		util_format_description(texture->resource.b.b.format);
 
 	if (!staging && !texture->dirty_db_mask)
 		return;
@@ -138,11 +140,11 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx,
 	    rctx->family == CHIP_RV620 || rctx->family == CHIP_RV635)
 		depth = 0.0f;
 
-	if (!rctx->db_misc_state.flush_depthstencil_through_cb) {
-		/* Enable decompression in DB_RENDER_CONTROL */
-		rctx->db_misc_state.flush_depthstencil_through_cb = true;
-		r600_atom_dirty(rctx, &rctx->db_misc_state.atom);
-	}
+	/* Enable decompression in DB_RENDER_CONTROL */
+	rctx->db_misc_state.flush_depthstencil_through_cb = true;
+	rctx->db_misc_state.copy_depth = util_format_has_depth(desc);
+	rctx->db_misc_state.copy_stencil = util_format_has_stencil(desc);
+	r600_atom_dirty(rctx, &rctx->db_misc_state.atom);
 
 	for (level = first_level; level <= last_level; level++) {
 		if (!staging && !(texture->dirty_db_mask & (1 << level)))
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index 724707e..7f50739 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -80,6 +80,7 @@ struct r600_db_misc_state {
 	struct r600_atom atom;
 	bool occlusion_query_enabled;
 	bool flush_depthstencil_through_cb;
+	bool copy_depth, copy_stencil;
 };
 
 struct r600_cb_misc_state {
diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c
index 82f5ffb..9d9ee1f 100644
--- a/src/gallium/drivers/r600/r600_state.c
+++ b/src/gallium/drivers/r600/r600_state.c
@@ -1684,8 +1684,10 @@ static void r600_emit_db_misc_state(struct r600_context *rctx, struct r600_atom
 		db_render_override |= S_028D10_NOOP_CULL_DISABLE(1);
 	}
 	if (a->flush_depthstencil_through_cb) {
-		db_render_control |= S_028D0C_DEPTH_COPY_ENABLE(1) |
-				     S_028D0C_STENCIL_COPY_ENABLE(1) |
+		assert(a->copy_depth || a->copy_stencil);
+
+		db_render_control |= S_028D0C_DEPTH_COPY_ENABLE(a->copy_depth) |
+				     S_028D0C_STENCIL_COPY_ENABLE(a->copy_stencil) |
 				     S_028D0C_COPY_CENTROID(1);
 	}
 
-- 
1.7.9.5



More information about the mesa-dev mailing list