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