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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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) {
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user