From 983b62ea5009069a495e8a57a76f75a4e5c05619 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Wed, 20 Mar 2024 01:30:44 +0200 Subject: [PATCH] anv: fix query clearing with blorp compute operations If we did clear a query buffer in compute mode, the flushing needs to match the engine used for clearing. Signed-off-by: Lionel Landwerlin Fixes: 6823ffe70e ("anv: try to keep the pipeline in GPGPU mode when buffer transfer ops") Reviewed-by: Paulo Zanoni Part-of: --- src/intel/vulkan/anv_private.h | 2 +- src/intel/vulkan/genX_query.c | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index d7398006b5f..44245291081 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -3170,7 +3170,7 @@ enum anv_query_bits { */ #define ANV_QUERY_RENDER_TARGET_WRITES_PENDING_BITS(devinfo) \ (((!ANV_DEVINFO_HAS_COHERENT_L3_CS(devinfo) && \ - devinfo->ver >= 12) ? \ + (devinfo)->ver >= 12) ? \ ANV_QUERY_WRITES_TILE_FLUSH : 0) | \ ANV_QUERY_WRITES_RT_FLUSH | \ ANV_QUERY_WRITES_CS_STALL) diff --git a/src/intel/vulkan/genX_query.c b/src/intel/vulkan/genX_query.c index fe3aa62bf62..2cb492afcf9 100644 --- a/src/intel/vulkan/genX_query.c +++ b/src/intel/vulkan/genX_query.c @@ -782,7 +782,9 @@ void genX(CmdResetQueryPool)( ANV_FROM_HANDLE(anv_query_pool, pool, queryPool); struct anv_physical_device *pdevice = cmd_buffer->device->physical; - if (queryCount >= pdevice->instance->query_clear_with_blorp_threshold) { + /* Shader clearing is only possible on render/compute */ + if (anv_cmd_buffer_is_render_or_compute_queue(cmd_buffer) && + queryCount >= pdevice->instance->query_clear_with_blorp_threshold) { trace_intel_begin_query_clear_blorp(&cmd_buffer->trace); anv_cmd_buffer_fill_area(cmd_buffer, @@ -790,10 +792,17 @@ void genX(CmdResetQueryPool)( queryCount * pool->stride, 0); - cmd_buffer->state.queries.clear_bits = - (cmd_buffer->queue_family->queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0 ? - ANV_QUERY_COMPUTE_WRITES_PENDING_BITS : - ANV_QUERY_RENDER_TARGET_WRITES_PENDING_BITS(cmd_buffer->device->info); + /* The pending clearing writes are in compute if we're in gpgpu mode on + * the render engine or on the compute engine. + */ + if (anv_cmd_buffer_is_compute_queue(cmd_buffer) || + cmd_buffer->state.current_pipeline == pdevice->gpgpu_pipeline_value) { + cmd_buffer->state.queries.clear_bits = + ANV_QUERY_COMPUTE_WRITES_PENDING_BITS; + } else { + cmd_buffer->state.queries.clear_bits = + ANV_QUERY_RENDER_TARGET_WRITES_PENDING_BITS(&pdevice->info); + } trace_intel_end_query_clear_blorp(&cmd_buffer->trace, queryCount); return;