[Mesa-dev] [PATCH 19/22] r600g: flush depth textures bound to vertex shaders

Marek Olšák maraeo at gmail.com
Mon Jul 9 12:15:52 PDT 2012


This was missing/broken. There are also minor code cleanups.
---
 src/gallium/drivers/r600/r600_blit.c         |   29 +++++++++++++-------------
 src/gallium/drivers/r600/r600_pipe.h         |    2 +-
 src/gallium/drivers/r600/r600_state_common.c |    2 +-
 3 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c
index 1d838bd..23e3190 100644
--- a/src/gallium/drivers/r600/r600_blit.c
+++ b/src/gallium/drivers/r600/r600_blit.c
@@ -186,24 +186,20 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx,
 	}
 }
 
-void r600_flush_depth_textures(struct r600_context *rctx)
+static void r600_flush_depth_textures(struct r600_context *rctx,
+				      struct r600_textures_info *textures)
 {
-	unsigned int i;
+	unsigned i;
 
-	/* XXX: This handles fragment shader textures only. */
-
-	for (i = 0; i < rctx->ps_samplers.n_views; ++i) {
+	for (i = 0; i < textures->n_views; ++i) {
 		struct pipe_sampler_view *view;
 		struct r600_resource_texture *tex;
 
-		view = &rctx->ps_samplers.views[i]->base;
+		view = &textures->views[i]->base;
 		if (!view) continue;
 
 		tex = (struct r600_resource_texture *)view->texture;
-		if (!tex->is_depth)
-			continue;
-
-		if (tex->is_flushing_texture)
+		if (!tex->is_depth || tex->is_flushing_texture)
 			continue;
 
 		r600_blit_uncompress_depth(&rctx->context, tex, NULL,
@@ -212,6 +208,14 @@ void r600_flush_depth_textures(struct r600_context *rctx)
 					   0,
 					   u_max_layer(&tex->resource.b.b, view->u.tex.first_level));
 	}
+}
+
+void r600_flush_all_depth_textures(struct r600_context *rctx)
+{
+	unsigned i;
+
+	r600_flush_depth_textures(rctx, &rctx->ps_samplers);
+	r600_flush_depth_textures(rctx, &rctx->vs_samplers);
 
 	/* also check CB here */
 	for (i = 0; i < rctx->framebuffer.nr_cbufs; i++) {
@@ -219,10 +223,7 @@ void r600_flush_depth_textures(struct r600_context *rctx)
 		struct pipe_surface *surf = rctx->framebuffer.cbufs[i];
 		tex = (struct r600_resource_texture *)surf->texture;
 
-		if (!tex->is_depth)
-			continue;
-
-		if (tex->is_flushing_texture)
+		if (!tex->is_depth || tex->is_flushing_texture)
 			continue;
 
 		r600_blit_uncompress_depth(&rctx->context, tex, NULL,
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index d026532..877088b 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -445,7 +445,7 @@ 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_depth_textures(struct r600_context *rctx);
+void r600_flush_all_depth_textures(struct r600_context *rctx);
 
 /* r600_buffer.c */
 bool r600_init_resource(struct r600_screen *rscreen,
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index e62cd2e..d952220 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -805,7 +805,7 @@ static void r600_update_derived_state(struct r600_context *rctx)
 
 	if (!rctx->blitter->running) {
 		if (rctx->have_depth_fb || rctx->have_depth_texture)
-			r600_flush_depth_textures(rctx);
+			r600_flush_all_depth_textures(rctx);
 	}
 
 	if (rctx->chip_class < EVERGREEN) {
-- 
1.7.9.5



More information about the mesa-dev mailing list