From f8ccf70c99bc921e50306cd48c62c9a47a8beb70 Mon Sep 17 00:00:00 2001 From: Kevin Chuang Date: Fri, 24 May 2024 13:48:13 -0700 Subject: [PATCH] anv: Properly fetch partial results in vkGetQueryPoolResults Currently for an "unavailable" query, if VK_QUERY_RESULT_PARTIAL_BIT is set, anv will return (slot.end - slot.begin). This can cause underflow because slot.end might still be at the initial value of 0. This commit fixes the issue by returning 0 in that situation. Cc: mesa-stable Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/vulkan/genX_query.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/intel/vulkan/genX_query.c b/src/intel/vulkan/genX_query.c index c98e4ffede9..5ddbbdfe059 100644 --- a/src/intel/vulkan/genX_query.c +++ b/src/intel/vulkan/genX_query.c @@ -558,7 +558,8 @@ VkResult genX(GetQueryPoolResults)( while (statistics) { UNUSED uint32_t stat = u_bit_scan(&statistics); if (write_results) { - uint64_t result = slot[idx * 2 + 2] - slot[idx * 2 + 1]; + /* If a query is not available but VK_QUERY_RESULT_PARTIAL_BIT is set, write 0. */ + uint64_t result = available ? slot[idx * 2 + 2] - slot[idx * 2 + 1] : 0; cpu_write_query_result(pData, flags, idx, result); } idx++; @@ -569,11 +570,17 @@ VkResult genX(GetQueryPoolResults)( case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT: { uint64_t *slot = query_slot(pool, firstQuery + i); - if (write_results) - cpu_write_query_result(pData, flags, idx, slot[2] - slot[1]); + if (write_results) { + /* If a query is not available but VK_QUERY_RESULT_PARTIAL_BIT is set, write 0. */ + uint64_t result = available ? slot[2] - slot[1] : 0; + cpu_write_query_result(pData, flags, idx, result); + } idx++; - if (write_results) - cpu_write_query_result(pData, flags, idx, slot[4] - slot[3]); + if (write_results) { + /* If a query is not available but VK_QUERY_RESULT_PARTIAL_BIT is set, write 0. */ + uint64_t result = available ? slot[4] - slot[3] : 0; + cpu_write_query_result(pData, flags, idx, result); + } idx++; break; }