Mesa (master): r600g: properly track which textures are depth

Marek Olšák mareko at kemper.freedesktop.org
Tue Jul 17 19:56:22 UTC 2012


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Sat Jul 14 17:06:27 2012 +0200

r600g: properly track which textures are depth

This fixes the issue with have_depth_texture never being set to false.

---

 src/gallium/drivers/r600/r600_blit.c         |   20 ++++++++------------
 src/gallium/drivers/r600/r600_pipe.h         |    6 +++---
 src/gallium/drivers/r600/r600_state_common.c |   19 +++++++++++++++----
 3 files changed, 26 insertions(+), 19 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c
index ca5aaf8..7679012 100644
--- a/src/gallium/drivers/r600/r600_blit.c
+++ b/src/gallium/drivers/r600/r600_blit.c
@@ -183,21 +183,23 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx,
 	r600_atom_dirty(rctx, &rctx->db_misc_state.atom);
 }
 
-static void r600_flush_depth_textures(struct r600_context *rctx,
-				      struct r600_textures_info *textures)
+void r600_flush_depth_textures(struct r600_context *rctx,
+			       struct r600_textures_info *textures)
 {
 	unsigned i;
+	unsigned depth_texture_mask = textures->depth_texture_mask;
 
-	for (i = 0; i < textures->n_views; ++i) {
+	while (depth_texture_mask) {
 		struct pipe_sampler_view *view;
 		struct r600_resource_texture *tex;
 
+		i = u_bit_scan(&depth_texture_mask);
+
 		view = &textures->views[i]->base;
-		if (!view) continue;
+		assert(view);
 
 		tex = (struct r600_resource_texture *)view->texture;
-		if (!tex->is_depth || tex->is_flushing_texture)
-			continue;
+		assert(tex->is_depth && !tex->is_flushing_texture);
 
 		r600_blit_uncompress_depth(&rctx->context, tex, NULL,
 					   view->u.tex.first_level,
@@ -207,12 +209,6 @@ static void r600_flush_depth_textures(struct r600_context *rctx,
 	}
 }
 
-void r600_flush_all_depth_textures(struct r600_context *rctx)
-{
-	r600_flush_depth_textures(rctx, &rctx->ps_samplers);
-	r600_flush_depth_textures(rctx, &rctx->vs_samplers);
-}
-
 static void r600_clear(struct pipe_context *ctx, unsigned buffers,
 		       const union pipe_color_union *color,
 		       double depth, unsigned stencil)
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index fd11134..0b45314 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -238,6 +238,7 @@ struct r600_textures_info {
 	struct r600_pipe_sampler_view	*views[NUM_TEX_UNITS];
 	struct r600_pipe_sampler_state	*samplers[NUM_TEX_UNITS];
 	unsigned			n_views;
+	uint32_t			depth_texture_mask; /* which textures are depth */
 	unsigned			n_samplers;
 	bool				samplers_dirty;
 	bool				is_array_sampler[NUM_TEX_UNITS];
@@ -329,7 +330,6 @@ struct r600_context {
 
 	struct u_upload_mgr	        *uploader;
 	struct util_slab_mempool	pool_transfers;
-	boolean				have_depth_texture;
 
 	unsigned default_ps_gprs, default_vs_gprs;
 
@@ -451,8 +451,8 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx,
 		struct r600_resource_texture *staging,
 		unsigned first_level, unsigned last_level,
 		unsigned first_layer, unsigned last_layer);
-void r600_flush_all_depth_textures(struct r600_context *rctx);
-
+void r600_flush_depth_textures(struct r600_context *rctx,
+			       struct r600_textures_info *textures);
 /* r600_buffer.c */
 bool r600_init_resource(struct r600_screen *rscreen,
 			struct r600_resource *res,
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index 76a28ff..23adf3b 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -475,8 +475,14 @@ void r600_set_sampler_views(struct r600_context *rctx,
 		}
 
 		if (rviews[i]) {
-			if (((struct r600_resource_texture *)rviews[i]->base.texture)->is_depth)
-				rctx->have_depth_texture = true;
+			struct r600_resource_texture *rtex =
+				(struct r600_resource_texture*)rviews[i]->base.texture;
+
+			if (rtex->is_depth && !rtex->is_flushing_texture) {
+				dst->depth_texture_mask |= 1 << i;
+			} else {
+				dst->depth_texture_mask &= ~(1 << i);
+			}
 
 			/* Changing from array to non-arrays textures and vice
 			 * versa requires updating TEX_ARRAY_OVERRIDE on R6xx-R7xx. */
@@ -489,6 +495,7 @@ void r600_set_sampler_views(struct r600_context *rctx,
 			set_resource(rctx, &rviews[i]->state, i + R600_MAX_CONST_BUFFERS);
 		} else {
 			set_resource(rctx, NULL, i + R600_MAX_CONST_BUFFERS);
+			dst->depth_texture_mask &= ~(1 << i);
 		}
 
 		pipe_sampler_view_reference((struct pipe_sampler_view **)&dst->views[i], views[i]);
@@ -892,8 +899,12 @@ static void r600_update_derived_state(struct r600_context *rctx)
 	unsigned ps_dirty = 0;
 
 	if (!rctx->blitter->running) {
-		if (rctx->have_depth_texture) {
-			r600_flush_all_depth_textures(rctx);
+		/* Flush depth textures which need to be flushed. */
+		if (rctx->vs_samplers.depth_texture_mask) {
+			r600_flush_depth_textures(rctx, &rctx->vs_samplers);
+		}
+		if (rctx->ps_samplers.depth_texture_mask) {
+			r600_flush_depth_textures(rctx, &rctx->ps_samplers);
 		}
 	}
 




More information about the mesa-commit mailing list