diff options
Diffstat (limited to 'src/gallium')
| -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 ec1f44639a..091751e93a 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 a24197c3c2..b0026e9578 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 a88426fc9a..32a11d8522 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 16468c9b1a..c24aaeefa7 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;  }  | 
