anv: Properly fetch partial results in vkGetQueryPoolResults
Currently, fetching the partial results (VK_QUERY_RESULT_PARTIAL_BIT) of an unavailable occlusion query via vkGetQueryPoolResults can return invalid values. anv returns slot.end - slot.begin, but in the case of unavailable queries, slot.end is still at the initial value of 0. If slot.begin is non-zero, the occlusion count underflows to a value that is likely outside the acceptable range of the partial result. This commit fixes vkGetQueryPoolResults by always returning 0 if the query is unavailable and the VK_QUERY_RESULT_PARTIAL_BIT is set. Cc: <mesa-stable@lists.freedesktop.org> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3586>
This commit is contained in:
@@ -308,8 +308,17 @@ VkResult genX(GetQueryPoolResults)(
|
||||
switch (pool->type) {
|
||||
case VK_QUERY_TYPE_OCCLUSION: {
|
||||
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) {
|
||||
/* From the Vulkan 1.2.132 spec:
|
||||
*
|
||||
* "If VK_QUERY_RESULT_PARTIAL_BIT is set,
|
||||
* VK_QUERY_RESULT_WAIT_BIT is not set, and the query’s status
|
||||
* is unavailable, an intermediate result value between zero and
|
||||
* the final result value is written to pData for that query."
|
||||
*/
|
||||
uint64_t result = available ? slot[2] - slot[1] : 0;
|
||||
cpu_write_query_result(pData, flags, idx, result);
|
||||
}
|
||||
idx++;
|
||||
break;
|
||||
}
|
||||
|
Reference in New Issue
Block a user