[Mesa-dev] [PATCH] radv: Fix multiview queries.
Bas Nieuwenhuizen
bas at basnieuwenhuizen.nl
Sun May 13 20:07:28 UTC 2018
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-stable at 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
More information about the mesa-dev
mailing list