diff options
-rw-r--r-- | src/gallium/drivers/r600/r600_context.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_resource.h | 2 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_state2.c | 42 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_texture.c | 4 |
4 files changed, 48 insertions, 1 deletions
diff --git a/src/gallium/drivers/r600/r600_context.c b/src/gallium/drivers/r600/r600_context.c index ec1f44639a3..091751e93a9 100644 --- a/src/gallium/drivers/r600/r600_context.c +++ b/src/gallium/drivers/r600/r600_context.c @@ -170,6 +170,7 @@ struct pipe_context *r600_create_context(struct pipe_screen *screen, void *priv) rctx->ctx = radeon_ctx_init(rscreen->rw); radeon_draw_init(&rctx->draw, rscreen->rw); + r600_blit_uncompress_depth_ptr = r600_blit_uncompress_depth; return &rctx->context; out_free: FREE(rctx); diff --git a/src/gallium/drivers/r600/r600_resource.h b/src/gallium/drivers/r600/r600_resource.h index a24197c3c23..b0026e95789 100644 --- a/src/gallium/drivers/r600/r600_resource.h +++ b/src/gallium/drivers/r600/r600_resource.h @@ -104,4 +104,6 @@ static INLINE boolean r600_buffer_is_user_buffer(struct pipe_resource *buffer) int r600_texture_depth_flush(struct pipe_context *ctx, struct pipe_resource *texture); + +extern int (*r600_blit_uncompress_depth_ptr)(struct pipe_context *ctx, struct r600_resource_texture *texture); #endif diff --git a/src/gallium/drivers/r600/r600_state2.c b/src/gallium/drivers/r600/r600_state2.c index a88426fc9a4..32a11d8522d 100644 --- a/src/gallium/drivers/r600/r600_state2.c +++ b/src/gallium/drivers/r600/r600_state2.c @@ -743,6 +743,46 @@ static void r600_blitter_save_states(struct pipe_context *ctx) /* TODO queries */ } +int r600_blit_uncompress_depth2(struct pipe_context *ctx, struct r600_resource_texture *texture) +{ + struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; + struct pipe_framebuffer_state fb = *rctx->pframebuffer; + struct pipe_surface *zsurf, *cbsurf; + int level = 0; + float depth = 1.0f; + + for (int i = 0; i < fb.nr_cbufs; i++) { + fb.cbufs[i] = NULL; + pipe_surface_reference(&fb.cbufs[i], rctx->pframebuffer->cbufs[i]); + } + fb.zsbuf = NULL; + pipe_surface_reference(&fb.zsbuf, rctx->pframebuffer->zsbuf); + + zsurf = ctx->screen->get_tex_surface(ctx->screen, &texture->resource.base.b, 0, level, 0, + PIPE_BIND_DEPTH_STENCIL); + + cbsurf = ctx->screen->get_tex_surface(ctx->screen, texture->flushed_depth_texture, 0, level, 0, + PIPE_BIND_RENDER_TARGET); + + r600_blitter_save_states(ctx); + util_blitter_save_framebuffer(rctx->blitter, &fb); + + if (rctx->family == CHIP_RV610 || rctx->family == CHIP_RV630 || + rctx->family == CHIP_RV620 || rctx->family == CHIP_RV635) + depth = 0.0f; + + util_blitter_custom_depth_stencil(rctx->blitter, zsurf, cbsurf, rctx->custom_dsa_flush, depth); + + pipe_surface_reference(&zsurf, NULL); + pipe_surface_reference(&cbsurf, NULL); + for (int i = 0; i < fb.nr_cbufs; i++) { + pipe_surface_reference(&fb.cbufs[i], NULL); + } + pipe_surface_reference(&fb.zsbuf, NULL); + + return 0; +} + static void r600_clear(struct pipe_context *ctx, unsigned buffers, const float *rgba, double depth, unsigned stencil) { @@ -2270,6 +2310,8 @@ static struct pipe_context *r600_create_context2(struct pipe_screen *screen, voi LIST_INITHEAD(&rctx->query_list); rctx->custom_dsa_flush = r600_create_db_flush_dsa(rctx); + r600_blit_uncompress_depth_ptr = r600_blit_uncompress_depth2; + return &rctx->context; } diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c index 16468c9b1a9..c24aaeefa77 100644 --- a/src/gallium/drivers/r600/r600_texture.c +++ b/src/gallium/drivers/r600/r600_texture.c @@ -234,6 +234,8 @@ static unsigned int r600_texture_is_referenced(struct pipe_context *context, return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; } +int (*r600_blit_uncompress_depth_ptr)(struct pipe_context *ctx, struct r600_resource_texture *texture); + int r600_texture_depth_flush(struct pipe_context *ctx, struct pipe_resource *texture) { @@ -263,7 +265,7 @@ int r600_texture_depth_flush(struct pipe_context *ctx, } out: - r600_blit_uncompress_depth(ctx, rtex); + r600_blit_uncompress_depth_ptr(ctx, rtex); return 0; } |