[Mesa-dev] [PATCH] radv: Fix multiview queries.

Samuel Pitoiset samuel.pitoiset at gmail.com
Mon May 14 10:26:46 UTC 2018



On 05/13/2018 10:07 PM, Bas Nieuwenhuizen 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

occasionally.

Those tests don't stuck for me and I run CTS really often, maybe I was 
just lucky.

Anyway,

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>

> 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(
> 


More information about the mesa-dev mailing list