From 5a17d8318ec2c20bf86275044dc8f715105a88e7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 8 Jul 2012 02:14:18 +0200 Subject: [PATCH] r600g: flush depth textures bound to vertex shaders This was missing/broken. There are also minor code cleanups. Reviewed-by: Alex Deucher --- src/gallium/drivers/r600/r600_blit.c | 29 ++++++++++++++-------------- src/gallium/drivers/r600/r600_pipe.h | 2 +- src/gallium/drivers/r600/r600_state_common.c | 2 +- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c index 1d838bd..23e3190 100644 --- a/src/gallium/drivers/r600/r600_blit.c +++ b/src/gallium/drivers/r600/r600_blit.c @@ -186,24 +186,20 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx, } } -void r600_flush_depth_textures(struct r600_context *rctx) +static void r600_flush_depth_textures(struct r600_context *rctx, + struct r600_textures_info *textures) { - unsigned int i; + unsigned i; - /* XXX: This handles fragment shader textures only. */ - - for (i = 0; i < rctx->ps_samplers.n_views; ++i) { + for (i = 0; i < textures->n_views; ++i) { struct pipe_sampler_view *view; struct r600_resource_texture *tex; - view = &rctx->ps_samplers.views[i]->base; + view = &textures->views[i]->base; if (!view) continue; tex = (struct r600_resource_texture *)view->texture; - if (!tex->is_depth) - continue; - - if (tex->is_flushing_texture) + if (!tex->is_depth || tex->is_flushing_texture) continue; r600_blit_uncompress_depth(&rctx->context, tex, NULL, @@ -212,6 +208,14 @@ void r600_flush_depth_textures(struct r600_context *rctx) 0, u_max_layer(&tex->resource.b.b, view->u.tex.first_level)); } +} + +void r600_flush_all_depth_textures(struct r600_context *rctx) +{ + unsigned i; + + r600_flush_depth_textures(rctx, &rctx->ps_samplers); + r600_flush_depth_textures(rctx, &rctx->vs_samplers); /* also check CB here */ for (i = 0; i < rctx->framebuffer.nr_cbufs; i++) { @@ -219,10 +223,7 @@ void r600_flush_depth_textures(struct r600_context *rctx) struct pipe_surface *surf = rctx->framebuffer.cbufs[i]; tex = (struct r600_resource_texture *)surf->texture; - if (!tex->is_depth) - continue; - - if (tex->is_flushing_texture) + if (!tex->is_depth || tex->is_flushing_texture) continue; r600_blit_uncompress_depth(&rctx->context, tex, NULL, diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h index 1ee5604..7843579 100644 --- a/src/gallium/drivers/r600/r600_pipe.h +++ b/src/gallium/drivers/r600/r600_pipe.h @@ -444,7 +444,7 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_texture *staging, unsigned first_level, unsigned last_level, unsigned first_layer, unsigned last_layer); -void r600_flush_depth_textures(struct r600_context *rctx); +void r600_flush_all_depth_textures(struct r600_context *rctx); /* r600_buffer.c */ bool r600_init_resource(struct r600_screen *rscreen, diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index e62cd2e..d952220 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -805,7 +805,7 @@ static void r600_update_derived_state(struct r600_context *rctx) if (!rctx->blitter->running) { if (rctx->have_depth_fb || rctx->have_depth_texture) - r600_flush_depth_textures(rctx); + r600_flush_all_depth_textures(rctx); } if (rctx->chip_class < EVERGREEN) { -- 2.7.4