Mesa (master): r600g: Update the flushed depth texture after drawing to the corresponding texture .

Henri Verbeet hverbeet at kemper.freedesktop.org
Sun Jan 30 17:59:37 UTC 2011


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

Author: Henri Verbeet <hverbeet at gmail.com>
Date:   Sun Jan 30 18:57:39 2011 +0100

r600g: Update the flushed depth texture after drawing to the corresponding texture.

I know Jerome will probably rewrite the way depth textures work sometime
soon. For the time being this should at least make common depth texture usage
for shadowing work properly though.

---

 src/gallium/drivers/r600/r600_blit.c         |   28 ++++++++++++++++++++++++++
 src/gallium/drivers/r600/r600_pipe.h         |    2 +
 src/gallium/drivers/r600/r600_resource.h     |    1 +
 src/gallium/drivers/r600/r600_state_common.c |    8 +++++++
 src/gallium/drivers/r600/r600_texture.c      |    7 ++---
 5 files changed, 42 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c
index 71a504c..83c02e5 100644
--- a/src/gallium/drivers/r600/r600_blit.c
+++ b/src/gallium/drivers/r600/r600_blit.c
@@ -36,6 +36,7 @@ static void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op
 {
 	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
 
+	rctx->blit = true;
 	r600_context_queries_suspend(&rctx->ctx);
 
 	util_blitter_save_blend(rctx->blitter, rctx->states[R600_PIPE_STATE_BLEND]);
@@ -74,6 +75,7 @@ static void r600_blitter_end(struct pipe_context *ctx)
 {
 	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
 	r600_context_queries_resume(&rctx->ctx);
+	rctx->blit = false;
 }
 
 void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_texture *texture)
@@ -82,6 +84,9 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_t
 	struct pipe_surface *zsurf, *cbsurf, surf_tmpl;
 	int level = 0;
 	float depth = 1.0f;
+
+	if (texture->flushed) return;
+
 	surf_tmpl.format = texture->resource.base.b.format;
 	surf_tmpl.u.tex.level = level;
 	surf_tmpl.u.tex.first_layer = 0;
@@ -102,11 +107,34 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_t
 	r600_blitter_begin(ctx, R600_CLEAR_SURFACE);
 	util_blitter_custom_depth_stencil(rctx->blitter, zsurf, cbsurf, rctx->custom_dsa_flush, depth);
 	r600_blitter_end(ctx);
+	texture->flushed = true;
 
 	pipe_surface_reference(&zsurf, NULL);
 	pipe_surface_reference(&cbsurf, NULL);
 }
 
+void r600_flush_depth_textures(struct r600_pipe_context *rctx)
+{
+	unsigned int i;
+
+	if (rctx->blit) return;
+
+	/* FIXME: This handles fragment shader textures only. */
+
+	for (i = 0; i < rctx->ps_samplers.n_views; ++i) {
+		struct r600_pipe_sampler_view *view;
+		struct r600_resource_texture *tex;
+
+		view = rctx->ps_samplers.views[i];
+		if (!view) continue;
+
+		tex = (struct r600_resource_texture *)view->base.texture;
+		if (!tex->depth) continue;
+
+		r600_blit_uncompress_depth(&rctx->context, tex);
+	}
+}
+
 static void r600_clear(struct pipe_context *ctx, unsigned buffers,
 			const float *rgba, double depth, unsigned stencil)
 {
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index cf4211c..beb4db1 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -171,6 +171,7 @@ struct r600_pipe_context {
 	unsigned			vb_max_index;
 	struct r600_translate_context	tran;
 	struct u_upload_mgr		*upload_const;
+	bool				blit;
 };
 
 struct r600_drawl {
@@ -197,6 +198,7 @@ void evergreen_pipe_add_vertex_attrib(struct r600_pipe_context *rctx,
 /* r600_blit.c */
 void r600_init_blit_functions(struct r600_pipe_context *rctx);
 void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_texture *texture);
+void r600_flush_depth_textures(struct r600_pipe_context *rctx);
 
 /* r600_buffer.c */
 struct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
diff --git a/src/gallium/drivers/r600/r600_resource.h b/src/gallium/drivers/r600/r600_resource.h
index 6e30244..5b5df5a 100644
--- a/src/gallium/drivers/r600/r600_resource.h
+++ b/src/gallium/drivers/r600/r600_resource.h
@@ -63,6 +63,7 @@ struct r600_resource_texture {
 	unsigned			depth;
 	unsigned			dirty;
 	struct r600_resource_texture	*flushed_depth_texture;
+	bool				flushed;
 };
 
 #define R600_BUFFER_MAGIC 0xabcd1600
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index 2df8188..e086e27 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -496,6 +496,8 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
 	struct r600_drawl draw = {};
 	unsigned prim;
 
+	r600_flush_depth_textures(rctx);
+
 	if (rctx->vertex_elements->incompatible_layout) {
 		r600_begin_vertex_translate(rctx, info->min_index, info->max_index);
 	}
@@ -597,6 +599,12 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
 		r600_context_draw(&rctx->ctx, &rdraw);
 	}
 
+	if (rctx->framebuffer.zsbuf)
+	{
+		struct pipe_resource *tex = rctx->framebuffer.zsbuf->texture;
+		((struct r600_resource_texture *)tex)->flushed = false;
+	}
+
 	pipe_resource_reference(&draw.index_buffer, NULL);
 
 	/* delete previous translated vertex elements */
diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c
index 51560bd..9107626 100644
--- a/src/gallium/drivers/r600/r600_texture.c
+++ b/src/gallium/drivers/r600/r600_texture.c
@@ -302,6 +302,9 @@ r600_texture_create_object(struct pipe_screen *screen,
 	resource->bo = bo;
 	rtex->pitch_override = pitch_in_bytes_override;
 
+	if (util_format_is_depth_or_stencil(base->format))
+		rtex->depth = 1;
+
 	if (array_mode)
 		rtex->tiled = 1;
 	r600_setup_miptree(screen, rtex, array_mode);
@@ -632,7 +635,6 @@ void r600_texture_transfer_destroy(struct pipe_context *ctx,
 				   struct pipe_transfer *transfer)
 {
 	struct r600_transfer *rtransfer = (struct r600_transfer*)transfer;
-	struct r600_resource_texture *rtex = (struct r600_resource_texture*)transfer->resource;
 
 	if (rtransfer->staging_texture) {
 		if (transfer->usage & PIPE_TRANSFER_WRITE) {
@@ -640,9 +642,6 @@ void r600_texture_transfer_destroy(struct pipe_context *ctx,
 		}
 		pipe_resource_reference(&rtransfer->staging_texture, NULL);
 	}
-	if (rtex->flushed_depth_texture) {
-		pipe_resource_reference((struct pipe_resource **)&rtex->flushed_depth_texture, NULL);
-	}
 	pipe_resource_reference(&transfer->resource, NULL);
 	FREE(transfer);
 }




More information about the mesa-commit mailing list