From f1c88336e6af1bb68546b064420d649f63d7ba8c Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 26 Dec 2018 14:09:55 -0500 Subject: [PATCH] freedreno: skip depth resolve if not written For multi-pass rendering, it is common to keep the same depth buffer from previous pass, to discard geometry that would be hidden by later draws. In the later passes with depth-test enabled, but depth-write disabled, there is no reason to do gmem2mem resolve. TODO probably do something similar for stencil.. although stencil buffer isn't used as commonly these days Signed-off-by: Rob Clark --- src/gallium/drivers/freedreno/freedreno_draw.c | 10 +++++++--- src/gallium/drivers/freedreno/freedreno_gmem.c | 3 ++- src/gallium/drivers/freedreno/freedreno_state.h | 5 +++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c index f17cb56..8b4073d 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.c +++ b/src/gallium/drivers/freedreno/freedreno_draw.c @@ -144,9 +144,13 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) } else { batch->invalidated |= FD_BUFFER_DEPTH; } - buffers |= FD_BUFFER_DEPTH; - resource_written(batch, pfb->zsbuf->texture); batch->gmem_reason |= FD_GMEM_DEPTH_ENABLED; + if (fd_depth_write_enabled(ctx)) { + buffers |= FD_BUFFER_DEPTH; + resource_written(batch, pfb->zsbuf->texture); + } else { + resource_read(batch, pfb->zsbuf->texture); + } } if (fd_stencil_enabled(ctx)) { @@ -155,9 +159,9 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) } else { batch->invalidated |= FD_BUFFER_STENCIL; } + batch->gmem_reason |= FD_GMEM_STENCIL_ENABLED; buffers |= FD_BUFFER_STENCIL; resource_written(batch, pfb->zsbuf->texture); - batch->gmem_reason |= FD_GMEM_STENCIL_ENABLED; } } diff --git a/src/gallium/drivers/freedreno/freedreno_gmem.c b/src/gallium/drivers/freedreno/freedreno_gmem.c index bb15f0a..0814a0c 100644 --- a/src/gallium/drivers/freedreno/freedreno_gmem.c +++ b/src/gallium/drivers/freedreno/freedreno_gmem.c @@ -120,7 +120,8 @@ calculate_tiles(struct fd_batch *batch) uint8_t cbuf_cpp[MAX_RENDER_TARGETS] = {0}, zsbuf_cpp[2] = {0}; uint32_t i, j, t, xoff, yoff; uint32_t tpp_x, tpp_y; - bool has_zs = !!(batch->resolve & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)); + bool has_zs = !!((batch->resolve | batch->restore) & + (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)); int tile_n[npipes]; if (has_zs) { diff --git a/src/gallium/drivers/freedreno/freedreno_state.h b/src/gallium/drivers/freedreno/freedreno_state.h index 35584e4..ad2c494 100644 --- a/src/gallium/drivers/freedreno/freedreno_state.h +++ b/src/gallium/drivers/freedreno/freedreno_state.h @@ -35,6 +35,11 @@ static inline bool fd_depth_enabled(struct fd_context *ctx) return ctx->zsa && ctx->zsa->depth.enabled; } +static inline bool fd_depth_write_enabled(struct fd_context *ctx) +{ + return ctx->zsa && ctx->zsa->depth.writemask; +} + static inline bool fd_stencil_enabled(struct fd_context *ctx) { return ctx->zsa && ctx->zsa->stencil[0].enabled; -- 2.7.4