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