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