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

Reply via email to