[Mesa-dev] [PATCH 08/13] r600g: always decompress all mipmaps and layers, slices, or faces of zbuffers

Marek Olšák maraeo at gmail.com
Mon Sep 5 14:44:10 PDT 2011


This fixes piglit/fbo-depth-array.
---
 src/gallium/drivers/r600/r600_blit.c    |   63 +++++++++++++++++++++----------
 src/gallium/drivers/r600/r600_texture.c |   14 +++----
 2 files changed, 49 insertions(+), 28 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c
index ba0790c..9a71c84 100644
--- a/src/gallium/drivers/r600/r600_blit.c
+++ b/src/gallium/drivers/r600/r600_blit.c
@@ -101,39 +101,62 @@ static void r600_blitter_end(struct pipe_context *ctx)
 	rctx->blit = false;
 }
 
+static unsigned u_num_layers(struct pipe_resource *r, unsigned level)
+{
+	switch (r->target) {
+	case PIPE_TEXTURE_CUBE:
+		return 6;
+	case PIPE_TEXTURE_3D:
+		return u_minify(r->depth0, level);
+	case PIPE_TEXTURE_1D_ARRAY:
+		return r->array_size;
+	case PIPE_TEXTURE_2D_ARRAY:
+		return r->array_size;
+	default:
+		return 1;
+	}
+}
+
 void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_texture *texture)
 {
 	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
-	struct pipe_surface *zsurf, *cbsurf, surf_tmpl;
-	int level = 0;
+	unsigned layer, level;
 	float depth = 1.0f;
 
 	if (!texture->dirty_db)
 		return;
 
-	surf_tmpl.format = texture->real_format;
-	surf_tmpl.u.tex.level = level;
-	surf_tmpl.u.tex.first_layer = 0;
-	surf_tmpl.u.tex.last_layer = 0;
-	surf_tmpl.usage = PIPE_BIND_DEPTH_STENCIL;
-
-	zsurf = ctx->create_surface(ctx, &texture->resource.b.b.b, &surf_tmpl);
-
-	surf_tmpl.format = texture->flushed_depth_texture->real_format;
-	surf_tmpl.usage = PIPE_BIND_RENDER_TARGET;
-	cbsurf = ctx->create_surface(ctx,
-			(struct pipe_resource*)texture->flushed_depth_texture, &surf_tmpl);
-
 	if (rctx->family == CHIP_RV610 || rctx->family == CHIP_RV630 ||
 	    rctx->family == CHIP_RV620 || rctx->family == CHIP_RV635)
 		depth = 0.0f;
 
-	r600_blitter_begin(ctx, R600_DECOMPRESS);
-	util_blitter_custom_depth_stencil(rctx->blitter, zsurf, cbsurf, rctx->custom_dsa_flush, depth);
-	r600_blitter_end(ctx);
+	for (level = 0; level <= texture->resource.b.b.b.last_level; level++) {
+		unsigned num_layers = u_num_layers(&texture->resource.b.b.b, level);
+
+		for (layer = 0; layer < num_layers; layer++) {
+			struct pipe_surface *zsurf, *cbsurf, surf_tmpl;
+
+			surf_tmpl.format = texture->real_format;
+			surf_tmpl.u.tex.level = level;
+			surf_tmpl.u.tex.first_layer = layer;
+			surf_tmpl.u.tex.last_layer = layer;
+			surf_tmpl.usage = PIPE_BIND_DEPTH_STENCIL;
+
+			zsurf = ctx->create_surface(ctx, &texture->resource.b.b.b, &surf_tmpl);
 
-	pipe_surface_reference(&zsurf, NULL);
-	pipe_surface_reference(&cbsurf, NULL);
+			surf_tmpl.format = texture->flushed_depth_texture->real_format;
+			surf_tmpl.usage = PIPE_BIND_RENDER_TARGET;
+			cbsurf = ctx->create_surface(ctx,
+					(struct pipe_resource*)texture->flushed_depth_texture, &surf_tmpl);
+
+			r600_blitter_begin(ctx, R600_DECOMPRESS);
+			util_blitter_custom_depth_stencil(rctx->blitter, zsurf, cbsurf, rctx->custom_dsa_flush, depth);
+			r600_blitter_end(ctx);
+
+			pipe_surface_reference(&zsurf, NULL);
+			pipe_surface_reference(&cbsurf, NULL);
+		}
+	}
 
 	texture->dirty_db = FALSE;
 }
diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c
index 691cc48..425e269 100644
--- a/src/gallium/drivers/r600/r600_texture.c
+++ b/src/gallium/drivers/r600/r600_texture.c
@@ -573,19 +573,17 @@ int r600_texture_depth_flush(struct pipe_context *ctx,
 	if (rtex->flushed_depth_texture)
 		goto out;
 
-	resource.target = PIPE_TEXTURE_2D;
+	resource.target = texture->target;
 	resource.format = texture->format;
 	resource.width0 = texture->width0;
 	resource.height0 = texture->height0;
-	resource.depth0 = 1;
-	resource.array_size = 1;
+	resource.depth0 = texture->depth0;
+	resource.array_size = texture->array_size;
 	resource.last_level = texture->last_level;
-	resource.nr_samples = 0;
+	resource.nr_samples = texture->nr_samples;
 	resource.usage = PIPE_USAGE_DYNAMIC;
-	resource.bind = 0;
-	resource.flags = R600_RESOURCE_FLAG_TRANSFER;
-
-	resource.bind |= PIPE_BIND_DEPTH_STENCIL;
+	resource.bind = texture->bind | PIPE_BIND_DEPTH_STENCIL;
+	resource.flags = R600_RESOURCE_FLAG_TRANSFER | texture->flags;
 
 	rtex->flushed_depth_texture = (struct r600_resource_texture *)ctx->screen->resource_create(ctx->screen, &resource);
 	if (rtex->flushed_depth_texture == NULL) {
-- 
1.7.4.1



More information about the mesa-dev mailing list