diff options
author | Marek Olšák <[email protected]> | 2012-07-28 13:55:59 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2012-08-04 13:53:07 +0200 |
commit | e2f623f1d6da9bc987582ff68d0471061ae44030 (patch) | |
tree | 2b22dadf098fe9c60e63ff14b4f2b1f3e447fd49 /src/gallium/drivers/r600 | |
parent | ea72351a919c594e7f40e901dca42aebb866f8a6 (diff) |
r600g: don't decompress depth or stencil if there isn't any
Diffstat (limited to 'src/gallium/drivers/r600')
-rw-r--r-- | src/gallium/drivers/r600/evergreen_state.c | 7 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_blit.c | 12 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_pipe.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_state.c | 6 |
4 files changed, 17 insertions, 9 deletions
diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c index 87a301fa040..75ed9eff35e 100644 --- a/src/gallium/drivers/r600/evergreen_state.c +++ b/src/gallium/drivers/r600/evergreen_state.c @@ -1722,9 +1722,12 @@ static void evergreen_emit_db_misc_state(struct r600_context *rctx, struct r600_ db_count_control |= S_028004_PERFECT_ZPASS_COUNTS(1); db_render_override |= S_02800C_NOOP_CULL_DISABLE(1); } + if (a->flush_depthstencil_through_cb) { - db_render_control |= S_028000_DEPTH_COPY_ENABLE(1) | - S_028000_STENCIL_COPY_ENABLE(1) | + assert(a->copy_depth || a->copy_stencil); + + db_render_control |= S_028000_DEPTH_COPY_ENABLE(a->copy_depth) | + S_028000_STENCIL_COPY_ENABLE(a->copy_stencil) | S_028000_COPY_CENTROID(1); } diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c index 9c4e911bee0..3623b2e7ae2 100644 --- a/src/gallium/drivers/r600/r600_blit.c +++ b/src/gallium/drivers/r600/r600_blit.c @@ -130,6 +130,8 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx, float depth = 1.0f; struct r600_resource_texture *flushed_depth_texture = staging ? staging : texture->flushed_depth_texture; + const struct util_format_description *desc = + util_format_description(texture->resource.b.b.format); if (!staging && !texture->dirty_db_mask) return; @@ -138,11 +140,11 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx, rctx->family == CHIP_RV620 || rctx->family == CHIP_RV635) depth = 0.0f; - if (!rctx->db_misc_state.flush_depthstencil_through_cb) { - /* Enable decompression in DB_RENDER_CONTROL */ - rctx->db_misc_state.flush_depthstencil_through_cb = true; - r600_atom_dirty(rctx, &rctx->db_misc_state.atom); - } + /* Enable decompression in DB_RENDER_CONTROL */ + rctx->db_misc_state.flush_depthstencil_through_cb = true; + rctx->db_misc_state.copy_depth = util_format_has_depth(desc); + rctx->db_misc_state.copy_stencil = util_format_has_stencil(desc); + r600_atom_dirty(rctx, &rctx->db_misc_state.atom); for (level = first_level; level <= last_level; level++) { if (!staging && !(texture->dirty_db_mask & (1 << level))) diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h index 724707e0fb8..7f50739506a 100644 --- a/src/gallium/drivers/r600/r600_pipe.h +++ b/src/gallium/drivers/r600/r600_pipe.h @@ -80,6 +80,7 @@ struct r600_db_misc_state { struct r600_atom atom; bool occlusion_query_enabled; bool flush_depthstencil_through_cb; + bool copy_depth, copy_stencil; }; struct r600_cb_misc_state { diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c index 82f5ffb16f3..9d9ee1f0de2 100644 --- a/src/gallium/drivers/r600/r600_state.c +++ b/src/gallium/drivers/r600/r600_state.c @@ -1684,8 +1684,10 @@ static void r600_emit_db_misc_state(struct r600_context *rctx, struct r600_atom db_render_override |= S_028D10_NOOP_CULL_DISABLE(1); } if (a->flush_depthstencil_through_cb) { - db_render_control |= S_028D0C_DEPTH_COPY_ENABLE(1) | - S_028D0C_STENCIL_COPY_ENABLE(1) | + assert(a->copy_depth || a->copy_stencil); + + db_render_control |= S_028D0C_DEPTH_COPY_ENABLE(a->copy_depth) | + S_028D0C_STENCIL_COPY_ENABLE(a->copy_stencil) | S_028D0C_COPY_CENTROID(1); } |