From aa1ddb6fe3c364c4f10df29bb42a0cf09d4cdabe Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 20 Jan 2021 14:20:46 -0800 Subject: [PATCH] freedreno: Skip some batch dependency tracking if !ctx->dirty. drawoverhead test 1 perf 4.37618% +/- 0.933261% (n=57) Part-of: --- .../drivers/freedreno/freedreno_draw.c | 61 +++++++++++-------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c index 01e07d899d2..25f62334c3b 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.c +++ b/src/gallium/drivers/freedreno/freedreno_draw.c @@ -59,24 +59,12 @@ resource_written(struct fd_batch *batch, struct pipe_resource *prsc) } static void -batch_draw_tracking(struct fd_batch *batch, const struct pipe_draw_info *info, - const struct pipe_draw_indirect_info *indirect) +batch_draw_tracking_for_dirty_bits(struct fd_batch *batch) { struct fd_context *ctx = batch->ctx; struct pipe_framebuffer_state *pfb = &batch->framebuffer; unsigned buffers = 0, restore_buffers = 0; - /* NOTE: needs to be before resource_written(batch->query_buf), otherwise - * query_buf may not be created yet. - */ - fd_batch_set_stage(batch, FD_STAGE_DRAW); - - /* - * Figure out the buffers/features we need: - */ - - fd_screen_lock(ctx->screen); - if (ctx->dirty & (FD_DIRTY_FRAMEBUFFER | FD_DIRTY_ZSA)) { if (fd_depth_enabled(ctx)) { if (fd_resource(pfb->zsbuf->texture)->valid) { @@ -176,14 +164,6 @@ batch_draw_tracking(struct fd_batch *batch, const struct pipe_draw_info *info, } } - /* Mark index buffer as being read */ - if (info->index_size) - resource_read(batch, info->index.resource); - - /* Mark indirect draw buffer as being read */ - if (indirect && indirect->buffer) - resource_read(batch, indirect->buffer); - /* Mark textures as being read */ if (ctx->dirty_shader[PIPE_SHADER_VERTEX] & FD_DIRTY_SHADER_TEX) { foreach_bit (i, ctx->tex[PIPE_SHADER_VERTEX].valid_textures) @@ -202,17 +182,46 @@ batch_draw_tracking(struct fd_batch *batch, const struct pipe_draw_info *info, resource_written(batch, ctx->streamout.targets[i]->buffer); } + /* any buffers that haven't been cleared yet, we need to restore: */ + batch->restore |= restore_buffers & (FD_BUFFER_ALL & ~batch->invalidated); + /* and any buffers used, need to be resolved: */ + batch->resolve |= buffers; +} + +static void +batch_draw_tracking(struct fd_batch *batch, const struct pipe_draw_info *info, + const struct pipe_draw_indirect_info *indirect) +{ + struct fd_context *ctx = batch->ctx; + + /* NOTE: needs to be before resource_written(batch->query_buf), otherwise + * query_buf may not be created yet. + */ + fd_batch_set_stage(batch, FD_STAGE_DRAW); + + /* + * Figure out the buffers/features we need: + */ + + fd_screen_lock(ctx->screen); + + if (ctx->dirty) + batch_draw_tracking_for_dirty_bits(batch); + + /* Mark index buffer as being read */ + if (info->index_size) + resource_read(batch, info->index.resource); + + /* Mark indirect draw buffer as being read */ + if (indirect && indirect->buffer) + resource_read(batch, indirect->buffer); + resource_written(batch, batch->query_buf); list_for_each_entry(struct fd_acc_query, aq, &ctx->acc_active_queries, node) resource_written(batch, aq->prsc); fd_screen_unlock(ctx->screen); - - /* any buffers that haven't been cleared yet, we need to restore: */ - batch->restore |= restore_buffers & (FD_BUFFER_ALL & ~batch->invalidated); - /* and any buffers used, need to be resolved: */ - batch->resolve |= buffers; } static void