Mesa (master): intel/perf: add helper to compute metrics from counters

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed May 20 12:32:35 UTC 2020


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

Author: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Date:   Fri Oct  5 17:31:11 2018 +0100

intel/perf: add helper to compute metrics from counters

The produced array tells use what metric to enable for a given pass.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/2775>

---

 src/intel/perf/gen_perf.c | 24 ++++++++++++++++++++++++
 src/intel/perf/gen_perf.h | 10 ++++++++++
 2 files changed, 34 insertions(+)

diff --git a/src/intel/perf/gen_perf.c b/src/intel/perf/gen_perf.c
index 30b87a02647..8c24344ed04 100644
--- a/src/intel/perf/gen_perf.c
+++ b/src/intel/perf/gen_perf.c
@@ -821,6 +821,30 @@ gen_perf_get_n_passes(struct gen_perf_config *perf,
    return __builtin_popcount(queries_mask);
 }
 
+void
+gen_perf_get_counters_passes(struct gen_perf_config *perf,
+                             const uint32_t *counter_indices,
+                             uint32_t counter_indices_count,
+                             struct gen_perf_counter_pass *counter_pass)
+{
+   uint64_t queries_mask = get_passes_mask(perf, counter_indices, counter_indices_count);
+   uint32_t n_passes = __builtin_popcount(queries_mask);
+
+   for (uint32_t i = 0; i < counter_indices_count; i++) {
+      assert(counter_indices[i] < perf->n_counters);
+
+      uint32_t idx = counter_indices[i];
+      counter_pass[i].counter = perf->counters[idx];
+
+      uint32_t query_idx = ffsll(perf->counters[idx]->query_mask & queries_mask) - 1;
+      counter_pass[i].query = &perf->queries[query_idx];
+
+      uint32_t clear_bits = 63 - query_idx;
+      counter_pass[i].pass = __builtin_popcount((queries_mask << clear_bits) >> clear_bits) - 1;
+      assert(counter_pass[i].pass < n_passes);
+   }
+}
+
 /* Accumulate 32bits OA counters */
 static inline void
 accumulate_uint32(const uint32_t *report0,
diff --git a/src/intel/perf/gen_perf.h b/src/intel/perf/gen_perf.h
index 70525d06441..6e02702ea00 100644
--- a/src/intel/perf/gen_perf.h
+++ b/src/intel/perf/gen_perf.h
@@ -289,6 +289,12 @@ struct gen_perf_config {
    } vtbl;
 };
 
+struct gen_perf_counter_pass {
+   struct gen_perf_query_info *query;
+   struct gen_perf_query_counter *counter;
+   uint32_t pass;
+};
+
 void gen_perf_init_metrics(struct gen_perf_config *perf_cfg,
                            const struct gen_device_info *devinfo,
                            int drm_fd,
@@ -359,5 +365,9 @@ uint32_t gen_perf_get_n_passes(struct gen_perf_config *perf,
                                const uint32_t *counter_indices,
                                uint32_t counter_indices_count,
                                struct gen_perf_query_info **pass_queries);
+void gen_perf_get_counters_passes(struct gen_perf_config *perf,
+                                  const uint32_t *counter_indices,
+                                  uint32_t counter_indices_count,
+                                  struct gen_perf_counter_pass *counter_pass);
 
 #endif /* GEN_PERF_H */



More information about the mesa-commit mailing list