If the query pool has been previously resetted using the compute
shader path.

v2: handle multiple commands buffers with same pool

Fixes: a41e2e9cf5 ("radv: allow to use a compute shader for resetting the query 
pool")
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105292
Cc: "18.0" <mesa-sta...@lists.freedesktop.org>
Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
---
 src/amd/vulkan/radv_cmd_buffer.c |  7 +++++++
 src/amd/vulkan/radv_private.h    |  5 +++++
 src/amd/vulkan/radv_query.c      | 10 ++++++++++
 3 files changed, 22 insertions(+)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 2b41baea3d..cfdc531acd 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -1930,6 +1930,13 @@ VkResult radv_BeginCommandBuffer(
 
        cmd_buffer->status = RADV_CMD_BUFFER_STATUS_RECORDING;
 
+       /* Force cache flushes before starting a new query in case the
+        * corresponding pool has been resetted from a different command
+        * buffer. This is because we have to flush caches between reset and
+        * begin if the compute shader path has been used.
+        */
+       cmd_buffer->pending_reset_query = true;
+
        return result;
 }
 
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index c72df5a737..b76d2eb5cb 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1003,6 +1003,11 @@ struct radv_cmd_buffer {
        uint32_t gfx9_fence_offset;
        struct radeon_winsys_bo *gfx9_fence_bo;
        uint32_t gfx9_fence_idx;
+
+       /**
+        * Whether a query pool has been resetted and we have to flush caches.
+        */
+       bool pending_reset_query;
 };
 
 struct radv_image;
diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
index ace745e4e6..1182e98896 100644
--- a/src/amd/vulkan/radv_query.c
+++ b/src/amd/vulkan/radv_query.c
@@ -1070,6 +1070,8 @@ void radv_CmdResetQueryPool(
                                                      pool->availability_offset 
+ firstQuery * 4,
                                                      queryCount * 4, 0);
        }
+
+       cmd_buffer->pending_reset_query = true;
 }
 
 void radv_CmdBeginQuery(
@@ -1086,6 +1088,14 @@ void radv_CmdBeginQuery(
 
        radv_cs_add_buffer(cmd_buffer->device->ws, cs, pool->bo, 8);
 
+       if (cmd_buffer->pending_reset_query) {
+               /* Make sure to flush caches if the query pool has been
+                * previously resetted using the compute shader path.
+                */
+               si_emit_cache_flush(cmd_buffer);
+               cmd_buffer->pending_reset_query = false;
+       }
+
        switch (pool->type) {
        case VK_QUERY_TYPE_OCCLUSION:
                radeon_check_space(cmd_buffer->device->ws, cs, 7);
-- 
2.16.2

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to