[Mesa-dev] [PATCH] radv: Flush before vkCmdWriteTimestamp() if needed

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed Dec 5 10:07:01 UTC 2018


Yes, this is correct, indeed.

The issue wasn't present because we used EOP events before removing the 
availability bit.

Btw, just noticed that we should reset pending_reset_query directly in 
si_emit_cache_flush() to reduce the number of stalls. I will send a patch.

Also note that fill CP DMA operations are currently always sync'ed, 
while CP DMA copies are not. I plan to change this at some point.

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

On 12/5/18 10:52 AM, Alex Smith wrote:
> As done for vkCmdBeginQuery() already. Prevents timestamps from being
> overwritten by previous vkCmdResetQueryPool() calls if the shader path
> was used to do the reset.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108925
> Fixes: a41e2e9cf5 ("radv: allow to use a compute shader for resetting the query pool")
> Signed-off-by: Alex Smith <asmith at feralinteractive.com>
> ---
>   src/amd/vulkan/radv_query.c | 30 +++++++++++++++++++-----------
>   1 file changed, 19 insertions(+), 11 deletions(-)
> 
> diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
> index 550abe307a..e226bcef6a 100644
> --- a/src/amd/vulkan/radv_query.c
> +++ b/src/amd/vulkan/radv_query.c
> @@ -1436,6 +1436,22 @@ static unsigned event_type_for_stream(unsigned stream)
>   	}
>   }
>   
> +static void emit_query_flush(struct radv_cmd_buffer *cmd_buffer,
> +			     struct radv_query_pool *pool)
> +{
> +	if (cmd_buffer->pending_reset_query) {
> +		if (pool->size >= RADV_BUFFER_OPS_CS_THRESHOLD) {
> +			/* Only need to flush caches if the query pool size is
> +			 * large enough to be resetted using the compute shader
> +			 * path. Small pools don't need any cache flushes
> +			 * because we use a CP dma clear.
> +			 */
> +			si_emit_cache_flush(cmd_buffer);
> +			cmd_buffer->pending_reset_query = false;
> +		}
> +	}
> +}
> +
>   static void emit_begin_query(struct radv_cmd_buffer *cmd_buffer,
>   			     uint64_t va,
>   			     VkQueryType query_type,
> @@ -1582,17 +1598,7 @@ void radv_CmdBeginQueryIndexedEXT(
>   
>   	radv_cs_add_buffer(cmd_buffer->device->ws, cs, pool->bo);
>   
> -	if (cmd_buffer->pending_reset_query) {
> -		if (pool->size >= RADV_BUFFER_OPS_CS_THRESHOLD) {
> -			/* Only need to flush caches if the query pool size is
> -			 * large enough to be resetted using the compute shader
> -			 * path. Small pools don't need any cache flushes
> -			 * because we use a CP dma clear.
> -			 */
> -			si_emit_cache_flush(cmd_buffer);
> -			cmd_buffer->pending_reset_query = false;
> -		}
> -	}
> +	emit_query_flush(cmd_buffer, pool);
>   
>   	va += pool->stride * query;
>   
> @@ -1669,6 +1675,8 @@ void radv_CmdWriteTimestamp(
>   
>   	radv_cs_add_buffer(cmd_buffer->device->ws, cs, pool->bo);
>   
> +	emit_query_flush(cmd_buffer, pool);
> +
>   	int num_queries = 1;
>   	if (cmd_buffer->state.subpass && cmd_buffer->state.subpass->view_mask)
>   		num_queries = util_bitcount(cmd_buffer->state.subpass->view_mask);
> 


More information about the mesa-dev mailing list