On Mon, Sep 5, 2011 at 10:44 PM, Marek Olšák <mar...@gmail.com> wrote: > 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(-)
Reviewed-by: Dave Airlie <airl...@redhat.com> > > 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 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev