Mesa (master): r600g: use ptr for blit depth uncompress function

Jerome Glisse glisse at kemper.freedesktop.org
Tue Sep 28 13:52:58 UTC 2010


Module: Mesa
Branch: master
Commit: 5a38cec7c807db07a6e8f1f2557fa75778a19763
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5a38cec7c807db07a6e8f1f2557fa75778a19763

Author: Jerome Glisse <jglisse at redhat.com>
Date:   Tue Sep 28 08:59:47 2010 -0400

r600g: use ptr for blit depth uncompress function

Signed-off-by: Jerome Glisse <jglisse at redhat.com>

---

 src/gallium/drivers/r600/r600_context.c  |    1 +
 src/gallium/drivers/r600/r600_resource.h |    2 +
 src/gallium/drivers/r600/r600_state2.c   |   42 ++++++++++++++++++++++++++++++
 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 ec1f446..091751e 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 a24197c..b0026e9 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 a88426f..32a11d8 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 16468c9..c24aaee 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;
 }
 




More information about the mesa-commit mailing list