On 14 May 2018 at 06:07, Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> wrote: > 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>
Seems sane: Reviewed-by: Dave Airlie <airl...@redhat.com> > --- > 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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev