Mesa (master): radv: flush pending query reset caches before copying results

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jun 3 14:04:06 UTC 2019


Module: Mesa
Branch: master
Commit: 445098916a8a80223677c38b496d48920b674aa1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=445098916a8a80223677c38b496d48920b674aa1

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Fri May 24 10:10:08 2019 +0200

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 <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>

---

 src/amd/vulkan/radv_query.c | 40 +++++++++++++++++++++++++---------------
 1 file 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,




More information about the mesa-commit mailing list