This moves the extra queries to after the main query ended, instead of doing it after the begin and hence doing nesting.
We also emit only (view count - 1) extra queries, as the main query is already there for the first view. This fixes the CTS occasiionally getting stuck in dEQP-VK.multiview.queries* waiting on results. Fixes: 32b4f3c38dc "radv/query: handle multiview queries properly. (v3)" C: 18.1 <mesa-sta...@lists.freedesktop.org> --- src/amd/vulkan/radv_query.c | 39 +++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c index 2b2e80f4e5b..3749e2f43d1 100644 --- a/src/amd/vulkan/radv_query.c +++ b/src/amd/vulkan/radv_query.c @@ -1204,25 +1204,6 @@ void radv_CmdBeginQuery( va += pool->stride * query; emit_begin_query(cmd_buffer, va, pool->type, flags); - - /* - * For multiview we have to emit a query for each bit in the mask, - * however the first query we emit will get the totals for all the - * operations, so we don't want to get a real value in the other - * queries. This emits a fake begin/end sequence so the waiting - * code gets a completed query value and doesn't hang, but the - * query returns 0. - */ - if (cmd_buffer->state.subpass && cmd_buffer->state.subpass->view_mask) { - uint64_t avail_va = va + pool->availability_offset + 4 * query; - - for (unsigned i = 0; i < util_bitcount(cmd_buffer->state.subpass->view_mask); i++) { - va += pool->stride; - avail_va += 4; - emit_begin_query(cmd_buffer, va, pool->type, flags); - emit_end_query(cmd_buffer, va, avail_va, pool->type); - } - } } @@ -1241,6 +1222,26 @@ void radv_CmdEndQuery( * currently be active, which means the BO is already in the list. */ emit_end_query(cmd_buffer, va, avail_va, pool->type); + + /* + * For multiview we have to emit a query for each bit in the mask, + * however the first query we emit will get the totals for all the + * operations, so we don't want to get a real value in the other + * queries. This emits a fake begin/end sequence so the waiting + * code gets a completed query value and doesn't hang, but the + * query returns 0. + */ + if (cmd_buffer->state.subpass && cmd_buffer->state.subpass->view_mask) { + uint64_t avail_va = va + pool->availability_offset + 4 * query; + + + for (unsigned i = 1; i < util_bitcount(cmd_buffer->state.subpass->view_mask); i++) { + va += pool->stride; + avail_va += 4; + emit_begin_query(cmd_buffer, va, pool->type, 0); + emit_end_query(cmd_buffer, va, avail_va, pool->type); + } + } } void radv_CmdWriteTimestamp( -- 2.17.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev