diff options
author | Marek Olšák <[email protected]> | 2011-09-04 02:58:41 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2011-09-10 08:53:29 +0200 |
commit | 840ad139aff401829552d0e3ba77f8abcb5862bd (patch) | |
tree | c88ae221adeed66dd0ba9db8e11be55dc664a6c5 | |
parent | c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5 (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.c | 63 | ||||
-rw-r--r-- | 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 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) { |