summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2011-09-04 02:58:41 +0200
committerMarek Olšák <[email protected]>2011-09-10 08:53:29 +0200
commit840ad139aff401829552d0e3ba77f8abcb5862bd (patch)
treec88ae221adeed66dd0ba9db8e11be55dc664a6c5
parentc4519c3aec37f5cb3db8fe7e8ead13ae04e792b5 (diff)
r600g: always decompress all mipmaps and layers, slices, or faces of zbuffers
This fixes piglit/fbo-depth-array. Reviewed-by: Dave Airlie <[email protected]>
-rw-r--r--src/gallium/drivers/r600/r600_blit.c63
-rw-r--r--src/gallium/drivers/r600/r600_texture.c14
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 ba0790c0402..9a71c8447c6 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 691cc48dea7..425e269069f 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) {