Mesa (master): ac/sqtt: fix determining if the trace is complete on GFX10+

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Mar 3 08:14:53 UTC 2021


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

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Tue Mar  2 15:13:24 2021 +0100

ac/sqtt: fix determining if the trace is complete on GFX10+

DROPPED_CNTR isn't reliable and might still report non-zero if the
SQTT buffer isn't full. Checking if the number of written bytes by
the hw is equal to the SQTT buffer size seems reliable.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9367>

---

 src/amd/common/ac_sqtt.c               | 14 ++++++++++----
 src/amd/common/ac_sqtt.h               |  4 +++-
 src/amd/vulkan/radv_sqtt.c             |  2 +-
 src/gallium/drivers/radeonsi/si_sqtt.c |  2 +-
 4 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/src/amd/common/ac_sqtt.c b/src/amd/common/ac_sqtt.c
index 1f8bda500ab..2133b5a9a5c 100644
--- a/src/amd/common/ac_sqtt.c
+++ b/src/amd/common/ac_sqtt.c
@@ -63,14 +63,20 @@ ac_thread_trace_get_data_va(const struct radeon_info *rad_info,
 
 bool
 ac_is_thread_trace_complete(struct radeon_info *rad_info,
+                            const struct ac_thread_trace_data *data,
                             const struct ac_thread_trace_info *info)
 {
    if (rad_info->chip_class >= GFX10) {
-      /* GFX10 doesn't have THREAD_TRACE_CNTR but it reports the
-       * number of dropped bytes for all SEs via
-       * THREAD_TRACE_DROPPED_CNTR.
+      /* GFX10 doesn't have THREAD_TRACE_CNTR but it reports the number of
+       * dropped bytes per SE via THREAD_TRACE_DROPPED_CNTR. Though, this
+       * doesn't seem reliable because it might still report non-zero even if
+       * the SQTT buffer isn't full.
+       *
+       * The solution here is to compare the number of bytes written by the hw
+       * (in units of 32 bytes) to the SQTT buffer size. If it's equal, that
+       * means that the buffer is full and should be resized.
        */
-      return info->gfx10_dropped_cntr == 0;
+      return !(info->cur_offset * 32 == data->buffer_size - 32);
    }
 
    /* Otherwise, compare the current thread trace offset with the number
diff --git a/src/amd/common/ac_sqtt.h b/src/amd/common/ac_sqtt.h
index 267b6093625..a7de3717354 100644
--- a/src/amd/common/ac_sqtt.h
+++ b/src/amd/common/ac_sqtt.h
@@ -88,7 +88,9 @@ ac_thread_trace_get_data_va(const struct radeon_info *rad_info,
                             const struct ac_thread_trace_data *data, uint64_t va, unsigned se);
 
 bool
-ac_is_thread_trace_complete(struct radeon_info *rad_info, const struct ac_thread_trace_info *info);
+ac_is_thread_trace_complete(struct radeon_info *rad_info,
+                            const struct ac_thread_trace_data *data,
+                            const struct ac_thread_trace_info *info);
 
 uint32_t
 ac_get_expected_buffer_size(struct radeon_info *rad_info,
diff --git a/src/amd/vulkan/radv_sqtt.c b/src/amd/vulkan/radv_sqtt.c
index f45c52c65d0..a15249cadbf 100644
--- a/src/amd/vulkan/radv_sqtt.c
+++ b/src/amd/vulkan/radv_sqtt.c
@@ -658,7 +658,7 @@ radv_get_thread_trace(struct radv_queue *queue,
 		if (radv_se_is_disabled(device, se))
 			continue;
 
-		if (!ac_is_thread_trace_complete(&device->physical_device->rad_info, info)) {
+		if (!ac_is_thread_trace_complete(&device->physical_device->rad_info, &device->thread_trace, info)) {
 			uint32_t expected_size =
 				ac_get_expected_buffer_size(&device->physical_device->rad_info, info);
 			uint32_t available_size =
diff --git a/src/gallium/drivers/radeonsi/si_sqtt.c b/src/gallium/drivers/radeonsi/si_sqtt.c
index 3cca3594edf..ffa8c472023 100644
--- a/src/gallium/drivers/radeonsi/si_sqtt.c
+++ b/src/gallium/drivers/radeonsi/si_sqtt.c
@@ -504,7 +504,7 @@ si_get_thread_trace(struct si_context *sctx,
 
       struct ac_thread_trace_se thread_trace_se = {0};
 
-      if (!ac_is_thread_trace_complete(&sctx->screen->info, info)) {
+      if (!ac_is_thread_trace_complete(&sctx->screen->info, sctx->thread_trace, info)) {
          uint32_t expected_size =
             ac_get_expected_buffer_size(&sctx->screen->info, info);
          uint32_t available_size = (info->cur_offset * 32) / 1024;



More information about the mesa-commit mailing list