From 052d7e1a9c216598a9c0843956471b37c3c948af Mon Sep 17 00:00:00 2001 From: Nanley Chery Date: Fri, 10 Jan 2025 09:27:15 -0500 Subject: [PATCH] anv: Slow clear if fast-clear cost is not mitigated Fast-clears require expensive flushes beforehand and afterwards. The cost of flushes are decreased in a series of back-to-back fast-clears as no extra fast-clear flushes are required in between them. If the ratio of a command buffer's recorded back-to-back fast clears over independent fast-clears falls below 1/2, prevent that command buffer from recording any further fast-clears. Averaging two runs of our Factorio trace on an A750 shows a +14.37% improvement in FPS. Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/vulkan/anv_image.c | 8 ++++++++ src/intel/vulkan/anv_private.h | 4 ++++ src/intel/vulkan/genX_cmd_buffer.c | 8 ++++++++ 3 files changed, 20 insertions(+) diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index ef5a9013e7c..f0916583bbb 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -3564,6 +3564,14 @@ anv_can_fast_clear_color(const struct anv_cmd_buffer *cmd_buffer, return false; } + if (cmd_buffer->num_independent_clears >= 16 && + cmd_buffer->num_independent_clears > + cmd_buffer->num_dependent_clears * 2) { + anv_perf_warn(VK_LOG_OBJS(&image->vk.base), + "Not enough back-to-back fast-clears. Slow clearing."); + return false; + } + return true; } diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 80cb0c4658f..c7f676ea551 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -4249,6 +4249,10 @@ struct anv_cmd_buffer { struct anv_cmd_state state; + /* Fast-clear statistics. */ + uint64_t num_dependent_clears; + uint64_t num_independent_clears; + struct anv_address return_addr; /* Set by SetPerformanceMarkerINTEL, written into queries by CmdBeginQuery */ diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 467fbfc77b5..0ca4b4776c4 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -3108,6 +3108,14 @@ genX(cmd_buffer_update_color_aux_op)(struct anv_cmd_buffer *cmd_buffer, } else { cmd_buffer->state.color_aux_op = next_aux_op; } + + if (next_aux_op == ISL_AUX_OP_FAST_CLEAR) { + if (aux_op_clears(last_aux_op)) { + cmd_buffer->num_dependent_clears++; + } else { + cmd_buffer->num_independent_clears++; + } + } } static void