radv: flush pending query reset caches before copying results
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 24 May 2019 08:10:08 +0000 (10:10 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 3 Jun 2019 14:05:46 +0000 (16:05 +0200)
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 <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_query.c

index c3812e2182dd998afe1b628af01346a2058f3f0e..ff9ceceb3ed199caf406693b664a08d183427e4c 100644 (file)
@@ -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,