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 <robdclark@gmail.com>
This commit is contained in:
Rob Clark
2018-12-26 14:09:55 -05:00
parent 4d3f6cb973
commit f1c88336e6
3 changed files with 14 additions and 4 deletions

View File

@@ -144,9 +144,13 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
} else {
batch->invalidated |= FD_BUFFER_DEPTH;
}
batch->gmem_reason |= FD_GMEM_DEPTH_ENABLED;
if (fd_depth_write_enabled(ctx)) {
buffers |= FD_BUFFER_DEPTH;
resource_written(batch, pfb->zsbuf->texture);
batch->gmem_reason |= FD_GMEM_DEPTH_ENABLED;
} 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;
}
}

View File

@@ -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) {

View File

@@ -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;