Mesa (staging/22.0): radv: suspend/resume queries during internal driver operations

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 21 17:52:04 UTC 2022


Module: Mesa
Branch: staging/22.0
Commit: ed36331926befebab91e0f10e9c2203bca3abebb
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=ed36331926befebab91e0f10e9c2203bca3abebb

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Tue Mar 29 18:48:34 2022 +0200

radv: suspend/resume queries during internal driver operations

Pipeline statistics and occlusion queries shouldn't be enabled for
internal driver operations like clears. Transform feedback queries
don't have to be suspended because the driver doesn't use streamout.

This fixes a bunch of Zink failures.

Cc: mesa-stable
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15660>
(cherry picked from commit 738a6760e3723978877bc6ffc02a3792d4c4b3d6)

Conflicts:
	src/gallium/drivers/zink/ci/zink-radv-fails.txt

---

 .pick_status.json                               |  2 +-
 src/amd/vulkan/radv_cmd_buffer.c                |  4 +--
 src/amd/vulkan/radv_meta.c                      | 34 +++++++++++++++++++++++++
 src/amd/vulkan/radv_private.h                   |  2 +-
 src/amd/vulkan/radv_query.c                     |  6 ++---
 src/gallium/drivers/zink/ci/zink-radv-fails.txt |  9 -------
 6 files changed, 41 insertions(+), 16 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 5462f46550d..f73233733ea 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -6580,7 +6580,7 @@
         "description": "radv: suspend/resume queries during internal driver operations",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 5,
+        "resolution": 1,
         "because_sha": null
     },
     {
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index c6ab3911ba4..0dfabfdd97a 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -2658,14 +2658,14 @@ radv_emit_index_buffer(struct radv_cmd_buffer *cmd_buffer, bool indirect)
 }
 
 void
-radv_set_db_count_control(struct radv_cmd_buffer *cmd_buffer)
+radv_set_db_count_control(struct radv_cmd_buffer *cmd_buffer, bool enable_occlusion_queries)
 {
    bool has_perfect_queries = cmd_buffer->state.perfect_occlusion_queries_enabled;
    struct radv_pipeline *pipeline = cmd_buffer->state.pipeline;
    uint32_t pa_sc_mode_cntl_1 = pipeline ? pipeline->graphics.ms.pa_sc_mode_cntl_1 : 0;
    uint32_t db_count_control;
 
-   if (!cmd_buffer->state.active_occlusion_queries) {
+   if (!enable_occlusion_queries) {
       if (cmd_buffer->device->physical_device->rad_info.chip_class >= GFX7) {
          if (G_028A4C_OUT_OF_ORDER_PRIMITIVE_ENABLE(pa_sc_mode_cntl_1) &&
              pipeline->graphics.disable_out_of_order_rast_for_occlusion && has_perfect_queries) {
diff --git a/src/amd/vulkan/radv_meta.c b/src/amd/vulkan/radv_meta.c
index 56c7271109e..2ee802d3571 100644
--- a/src/amd/vulkan/radv_meta.c
+++ b/src/amd/vulkan/radv_meta.c
@@ -34,6 +34,36 @@
 #endif
 #include <sys/stat.h>
 
+static void
+radv_suspend_queries(struct radv_cmd_buffer *cmd_buffer)
+{
+   /* Pipeline statistics queries. */
+   if (cmd_buffer->state.active_pipeline_queries > 0) {
+      cmd_buffer->state.flush_bits &= ~RADV_CMD_FLAG_START_PIPELINE_STATS;
+      cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_STOP_PIPELINE_STATS;
+   }
+
+   /* Occlusion queries. */
+   if (cmd_buffer->state.active_occlusion_queries > 0) {
+      radv_set_db_count_control(cmd_buffer, false);
+   }
+}
+
+static void
+radv_resume_queries(struct radv_cmd_buffer *cmd_buffer)
+{
+   /* Pipeline statistics queries. */
+   if (cmd_buffer->state.active_pipeline_queries > 0) {
+      cmd_buffer->state.flush_bits &= ~RADV_CMD_FLAG_STOP_PIPELINE_STATS;
+      cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_START_PIPELINE_STATS;
+   }
+
+   /* Occlusion queries. */
+   if (cmd_buffer->state.active_occlusion_queries > 0) {
+      radv_set_db_count_control(cmd_buffer, true);
+   }
+}
+
 void
 radv_meta_save(struct radv_meta_saved_state *state, struct radv_cmd_buffer *cmd_buffer,
                uint32_t flags)
@@ -135,6 +165,8 @@ radv_meta_save(struct radv_meta_saved_state *state, struct radv_cmd_buffer *cmd_
       state->attachments = cmd_buffer->state.attachments;
       state->render_area = cmd_buffer->state.render_area;
    }
+
+   radv_suspend_queries(cmd_buffer);
 }
 
 void
@@ -255,6 +287,8 @@ radv_meta_restore(const struct radv_meta_saved_state *state, struct radv_cmd_buf
       if (state->subpass)
          cmd_buffer->state.dirty |= RADV_CMD_DIRTY_FRAMEBUFFER;
    }
+
+   radv_resume_queries(cmd_buffer);
 }
 
 VkImageViewType
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index c547e74825d..8b795184592 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1589,7 +1589,7 @@ void si_cp_dma_clear_buffer(struct radv_cmd_buffer *cmd_buffer, uint64_t va, uin
                             unsigned value);
 void si_cp_dma_wait_for_idle(struct radv_cmd_buffer *cmd_buffer);
 
-void radv_set_db_count_control(struct radv_cmd_buffer *cmd_buffer);
+void radv_set_db_count_control(struct radv_cmd_buffer *cmd_buffer, bool enable_occlusion_queries);
 
 unsigned radv_instance_rate_prolog_index(unsigned num_attributes, uint32_t instance_rate_inputs);
 uint32_t radv_hash_vs_prolog(const void *key_);
diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
index 254a5ee0551..e4864eddb12 100644
--- a/src/amd/vulkan/radv_query.c
+++ b/src/amd/vulkan/radv_query.c
@@ -1389,7 +1389,7 @@ emit_begin_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *poo
             cmd_buffer->state.perfect_occlusion_queries_enabled = true;
          }
 
-         radv_set_db_count_control(cmd_buffer);
+         radv_set_db_count_control(cmd_buffer, true);
       } else {
          if ((flags & VK_QUERY_CONTROL_PRECISE_BIT) &&
              !cmd_buffer->state.perfect_occlusion_queries_enabled) {
@@ -1399,7 +1399,7 @@ emit_begin_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *poo
              */
             cmd_buffer->state.perfect_occlusion_queries_enabled = true;
 
-            radv_set_db_count_control(cmd_buffer);
+            radv_set_db_count_control(cmd_buffer, true);
          }
       }
 
@@ -1472,7 +1472,7 @@ emit_end_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *pool,
 
       cmd_buffer->state.active_occlusion_queries--;
       if (cmd_buffer->state.active_occlusion_queries == 0) {
-         radv_set_db_count_control(cmd_buffer);
+         radv_set_db_count_control(cmd_buffer, false);
 
          /* Reset the perfect occlusion queries hint now that no
           * queries are active.
diff --git a/src/gallium/drivers/zink/ci/zink-radv-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-fails.txt
index 04988b95536..e35710c3192 100644
--- a/src/gallium/drivers/zink/ci/zink-radv-fails.txt
+++ b/src/gallium/drivers/zink/ci/zink-radv-fails.txt
@@ -24,15 +24,6 @@ dEQP-GLES3.functional.multisample.fbo_8_samples.proportionality_sample_coverage,
 dEQP-GLES3.functional.multisample.fbo_8_samples.sample_coverage_invert,Fail
 dEQP-GLES3.functional.multisample.fbo_max_samples.proportionality_sample_coverage,Fail
 dEQP-GLES3.functional.multisample.fbo_max_samples.sample_coverage_invert,Fail
-dEQP-GLES3.functional.occlusion_query.depth_clear,Fail
-dEQP-GLES3.functional.occlusion_query.depth_clear_stencil_clear,Fail
-dEQP-GLES3.functional.occlusion_query.depth_write_depth_clear_stencil_clear,Fail
-dEQP-GLES3.functional.occlusion_query.scissor,Fail
-dEQP-GLES3.functional.occlusion_query.scissor_depth_clear,Fail
-dEQP-GLES3.functional.occlusion_query.scissor_depth_clear_stencil_clear,Fail
-dEQP-GLES3.functional.occlusion_query.scissor_depth_write_depth_clear_stencil_clear,Fail
-dEQP-GLES3.functional.occlusion_query.scissor_stencil_clear,Fail
-dEQP-GLES3.functional.occlusion_query.stencil_clear,Fail
 dEQP-GLES3.functional.polygon_offset.fixed16_render_with_units,Fail
 dEQP-GLES3.functional.rasterization.primitives.line_loop_wide,Fail
 dEQP-GLES3.functional.rasterization.primitives.line_strip_wide,Fail



More information about the mesa-commit mailing list