Mesa (main): radeonsi: deduplicate query offsets

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu May 12 07:45:03 UTC 2022


Module: Mesa
Branch: main
Commit: 637f09f10e2d68d7fb5d519b1ebe812fc86a3fb8
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=637f09f10e2d68d7fb5d519b1ebe812fc86a3fb8

Author: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Date:   Tue Apr 19 10:27:30 2022 +0200

radeonsi: deduplicate query offsets

Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15861>

---

 src/gallium/drivers/radeonsi/si_query.c | 45 +++++++++++++++++++++++----------
 src/gallium/drivers/radeonsi/si_query.h |  8 ++++++
 2 files changed, 39 insertions(+), 14 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_query.c b/src/gallium/drivers/radeonsi/si_query.c
index 9f75b565a75..5e24fe54e67 100644
--- a/src/gallium/drivers/radeonsi/si_query.c
+++ b/src/gallium/drivers/radeonsi/si_query.c
@@ -637,6 +637,29 @@ static bool si_query_hw_prepare_buffer(struct si_context *sctx, struct si_query_
    return true;
 }
 
+int si_hw_query_dw_offset(int index)
+{
+   /* Offset in dwords in the query buffer of the start value
+    * for the given counter.
+    */
+   switch (index) {
+      case PIPE_STAT_QUERY_IA_VERTICES: return 14;
+      case PIPE_STAT_QUERY_IA_PRIMITIVES: return 12;
+      case PIPE_STAT_QUERY_VS_INVOCATIONS: return 6;
+      case PIPE_STAT_QUERY_GS_INVOCATIONS: return 8;
+      case PIPE_STAT_QUERY_GS_PRIMITIVES: return 10;
+      case PIPE_STAT_QUERY_C_INVOCATIONS: return 4;
+      case PIPE_STAT_QUERY_C_PRIMITIVES: return 2;
+      case PIPE_STAT_QUERY_PS_INVOCATIONS: return 0;
+      case PIPE_STAT_QUERY_HS_INVOCATIONS: return 16;
+      case PIPE_STAT_QUERY_DS_INVOCATIONS: return 18;
+      case PIPE_STAT_QUERY_CS_INVOCATIONS: return 20;
+      default:
+         assert(false);
+      }
+   return -1;
+}
+
 static void si_query_hw_get_result_resource(struct si_context *sctx, struct si_query *squery,
                                             enum pipe_query_flags flags,
                                             enum pipe_query_value_type result_type,
@@ -1244,9 +1267,8 @@ static void si_get_hw_query_params(struct si_context *sctx, struct si_query_hw *
       params->fence_offset = squery->result_size - 4;
       break;
    case PIPE_QUERY_PIPELINE_STATISTICS: {
-      static const unsigned offsets[] = {56, 48, 24, 32, 40, 16, 8, 0, 64, 72, 80};
-      params->start_offset = offsets[index];
-      params->end_offset = 88 + offsets[index];
+      params->start_offset = si_hw_query_dw_offset(index) * 4;
+      params->end_offset = SI_QUERY_STATS_END_OFFSET_DW * 4 + params->start_offset;
       params->fence_offset = 2 * 88;
       break;
    }
@@ -1326,17 +1348,12 @@ static void si_query_hw_add_result(struct si_screen *sscreen, struct si_query_hw
       }
       break;
    case PIPE_QUERY_PIPELINE_STATISTICS:
-      result->pipeline_statistics.ps_invocations += si_query_read_result(buffer, 0, 22, false);
-      result->pipeline_statistics.c_primitives += si_query_read_result(buffer, 2, 24, false);
-      result->pipeline_statistics.c_invocations += si_query_read_result(buffer, 4, 26, false);
-      result->pipeline_statistics.vs_invocations += si_query_read_result(buffer, 6, 28, false);
-      result->pipeline_statistics.gs_invocations += si_query_read_result(buffer, 8, 30, false);
-      result->pipeline_statistics.gs_primitives += si_query_read_result(buffer, 10, 32, false);
-      result->pipeline_statistics.ia_primitives += si_query_read_result(buffer, 12, 34, false);
-      result->pipeline_statistics.ia_vertices += si_query_read_result(buffer, 14, 36, false);
-      result->pipeline_statistics.hs_invocations += si_query_read_result(buffer, 16, 38, false);
-      result->pipeline_statistics.ds_invocations += si_query_read_result(buffer, 18, 40, false);
-      result->pipeline_statistics.cs_invocations += si_query_read_result(buffer, 20, 42, false);
+      for (int i = 0; i < 11; i++) {
+         int start_offset = si_hw_query_dw_offset(i);
+         result->pipeline_statistics.counters[i] +=
+            si_query_read_result(buffer, start_offset,
+                                 start_offset + SI_QUERY_STATS_END_OFFSET_DW, false);
+      }
 #if 0 /* for testing */
       printf("Pipeline stats: IA verts=%llu, IA prims=%llu, VS=%llu, HS=%llu, "
              "DS=%llu, GS=%llu, GS prims=%llu, Clipper=%llu, "
diff --git a/src/gallium/drivers/radeonsi/si_query.h b/src/gallium/drivers/radeonsi/si_query.h
index 4a21c34103c..a5860278eba 100644
--- a/src/gallium/drivers/radeonsi/si_query.h
+++ b/src/gallium/drivers/radeonsi/si_query.h
@@ -127,6 +127,14 @@ enum
    SI_NUM_SW_QUERY_GROUPS
 };
 
+/* The counters are stored in a buffer, each with a start and end value,
+ * with this layout:
+ * [start1][start2][...][startN][end1][end2][...][endN]
+ * N is 11 and each value is a 64-bit int so we get:
+ */
+#define SI_QUERY_STATS_END_OFFSET_DW (11 * 2)
+int si_hw_query_dw_offset(int index);
+
 struct si_query_ops {
    void (*destroy)(struct si_context *, struct si_query *);
    bool (*begin)(struct si_context *, struct si_query *);



More information about the mesa-commit mailing list