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 {
|
} else {
|
||||||
batch->invalidated |= FD_BUFFER_DEPTH;
|
batch->invalidated |= FD_BUFFER_DEPTH;
|
||||||
}
|
}
|
||||||
buffers |= FD_BUFFER_DEPTH;
|
|
||||||
resource_written(batch, pfb->zsbuf->texture);
|
|
||||||
batch->gmem_reason |= FD_GMEM_DEPTH_ENABLED;
|
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)) {
|
if (fd_stencil_enabled(ctx)) {
|
||||||
@@ -155,9 +159,9 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
|
|||||||
} else {
|
} else {
|
||||||
batch->invalidated |= FD_BUFFER_STENCIL;
|
batch->invalidated |= FD_BUFFER_STENCIL;
|
||||||
}
|
}
|
||||||
|
batch->gmem_reason |= FD_GMEM_STENCIL_ENABLED;
|
||||||
buffers |= FD_BUFFER_STENCIL;
|
buffers |= FD_BUFFER_STENCIL;
|
||||||
resource_written(batch, pfb->zsbuf->texture);
|
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};
|
uint8_t cbuf_cpp[MAX_RENDER_TARGETS] = {0}, zsbuf_cpp[2] = {0};
|
||||||
uint32_t i, j, t, xoff, yoff;
|
uint32_t i, j, t, xoff, yoff;
|
||||||
uint32_t tpp_x, tpp_y;
|
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];
|
int tile_n[npipes];
|
||||||
|
|
||||||
if (has_zs) {
|
if (has_zs) {
|
||||||
|
@@ -35,6 +35,11 @@ static inline bool fd_depth_enabled(struct fd_context *ctx)
|
|||||||
return ctx->zsa && ctx->zsa->depth.enabled;
|
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)
|
static inline bool fd_stencil_enabled(struct fd_context *ctx)
|
||||||
{
|
{
|
||||||
return ctx->zsa && ctx->zsa->stencil[0].enabled;
|
return ctx->zsa && ctx->zsa->stencil[0].enabled;
|
||||||
|
Reference in New Issue
Block a user