diff options
author | Samuel Pitoiset <[email protected]> | 2019-05-24 10:10:08 +0200 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2019-06-03 16:05:46 +0200 |
commit | 445098916a8a80223677c38b496d48920b674aa1 (patch) | |
tree | 9af422880fcd66b7b3be9f60e347d42e75379ab1 | |
parent | 91672becc3a0403ebf8bc149636ee92646e2df7f (diff) |
radv: flush pending query reset caches before copying results
From the Vulkan spec 1.1.108:
"vkCmdCopyQueryPoolResults is guaranteed to see the effect of
previous uses of vkCmdResetQueryPool in the same queue, without any
additional synchronization."
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
-rw-r--r-- | src/amd/vulkan/radv_query.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c index c3812e2182d..ff9ceceb3ed 100644 --- a/src/amd/vulkan/radv_query.c +++ b/src/amd/vulkan/radv_query.c @@ -1272,6 +1272,21 @@ VkResult radv_GetQueryPoolResults( return result; } +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); + } + } +} + void radv_CmdCopyQueryPoolResults( VkCommandBuffer commandBuffer, VkQueryPool queryPool, @@ -1294,6 +1309,16 @@ void radv_CmdCopyQueryPoolResults( radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs, pool->bo); radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs, dst_buffer->bo); + /* From the Vulkan spec 1.1.108: + * + * "vkCmdCopyQueryPoolResults is guaranteed to see the effect of + * previous uses of vkCmdResetQueryPool in the same queue, without any + * additional synchronization." + * + * So, we have to flush the caches if the compute shader path was used. + */ + emit_query_flush(cmd_buffer, pool); + switch (pool->type) { case VK_QUERY_TYPE_OCCLUSION: if (flags & VK_QUERY_RESULT_WAIT_BIT) { @@ -1475,21 +1500,6 @@ 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); - } - } -} - static void emit_begin_query(struct radv_cmd_buffer *cmd_buffer, uint64_t va, VkQueryType query_type, |