Mesa (master): etnaviv: move generic perfmon functionality into own file

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun Apr 5 18:12:00 UTC 2020


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

Author: Christian Gmeiner <christian.gmeiner at gmail.com>
Date:   Fri Jul 19 15:27:39 2019 +0200

etnaviv: move generic perfmon functionality into own file

This change removes the basic infrastructure to work with perfmon
from the perfmon query impl and puts it into its own place.
Makes the whole series easier to review and ends smaller changes.

Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/1530>

---

 src/gallium/drivers/etnaviv/Makefile.sources   |   2 +
 src/gallium/drivers/etnaviv/etnaviv_perfmon.c  | 503 +++++++++++++++++++++++++
 src/gallium/drivers/etnaviv/etnaviv_perfmon.h  | 142 +++++++
 src/gallium/drivers/etnaviv/etnaviv_query_pm.c | 501 ------------------------
 src/gallium/drivers/etnaviv/etnaviv_query_pm.h |  78 +---
 src/gallium/drivers/etnaviv/meson.build        |   2 +
 6 files changed, 650 insertions(+), 578 deletions(-)

diff --git a/src/gallium/drivers/etnaviv/Makefile.sources b/src/gallium/drivers/etnaviv/Makefile.sources
index a28ab1bb099..28c24911121 100644
--- a/src/gallium/drivers/etnaviv/Makefile.sources
+++ b/src/gallium/drivers/etnaviv/Makefile.sources
@@ -34,6 +34,8 @@ C_SOURCES :=  \
 	etnaviv_format.c \
 	etnaviv_format.h \
 	etnaviv_internal.h \
+	etnaviv_perfmon.c \
+	etnaviv_perfmon.h \
 	etnaviv_query.c \
 	etnaviv_query.h \
 	etnaviv_query_acc_occlusion.c \
diff --git a/src/gallium/drivers/etnaviv/etnaviv_perfmon.c b/src/gallium/drivers/etnaviv/etnaviv_perfmon.c
new file mode 100644
index 00000000000..04925644692
--- /dev/null
+++ b/src/gallium/drivers/etnaviv/etnaviv_perfmon.c
@@ -0,0 +1,503 @@
+/*
+ * Copyright (c) 2017 Etnaviv Project
+ * Copyright (C) 2017 Zodiac Inflight Innovations
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Christian Gmeiner <christian.gmeiner at gmail.com>
+ */
+
+#include "etnaviv_context.h"
+#include "etnaviv_perfmon.h"
+#include "etnaviv_screen.h"
+
+static const char *group_names[] = {
+   [ETNA_QUERY_HI_GROUP_ID] = "HI",
+   [ETNA_QUERY_PE_GROUP_ID] = "PE",
+   [ETNA_QUERY_SH_GROUP_ID] = "SH",
+   [ETNA_QUERY_PA_GROUP_ID] = "PA",
+   [ETNA_QUERY_SE_GROUP_ID] = "SE",
+   [ETNA_QUERY_RA_GROUP_ID] = "RA",
+   [ETNA_QUERY_TX_GROUP_ID] = "TX",
+   [ETNA_QUERY_MC_GROUP_ID] = "MC",
+};
+
+static const struct etna_perfmon_config query_config[] = {
+   {
+      .name = "hi-total-cycles",
+      .type = ETNA_QUERY_HI_TOTAL_CYCLES,
+      .group_id = ETNA_QUERY_HI_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "HI", "TOTAL_CYCLES" }
+      }
+   },
+   {
+      .name = "hi-idle-cycles",
+      .type = ETNA_QUERY_HI_IDLE_CYCLES,
+      .group_id = ETNA_QUERY_HI_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "HI", "IDLE_CYCLES" }
+      }
+   },
+   {
+      .name = "hi-axi-cycles-read-request-stalled",
+      .type = ETNA_QUERY_HI_AXI_CYCLES_READ_REQUEST_STALLED,
+      .group_id = ETNA_QUERY_HI_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "HI", "AXI_CYCLES_READ_REQUEST_STALLED" }
+      }
+   },
+   {
+      .name = "hi-axi-cycles-write-request-stalled",
+      .type = ETNA_QUERY_HI_AXI_CYCLES_WRITE_REQUEST_STALLED,
+      .group_id = ETNA_QUERY_HI_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "HI", "AXI_CYCLES_WRITE_REQUEST_STALLED" }
+      }
+   },
+   {
+      .name = "hi-axi-cycles-write-data-stalled",
+      .type = ETNA_QUERY_HI_AXI_CYCLES_WRITE_DATA_STALLED,
+      .group_id = ETNA_QUERY_HI_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "HI", "AXI_CYCLES_WRITE_DATA_STALLED" }
+      }
+   },
+   {
+      .name = "pe-pixel-count-killed-by-color-pipe",
+      .type = ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_COLOR_PIPE,
+      .group_id = ETNA_QUERY_PE_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "PE", "PIXEL_COUNT_KILLED_BY_COLOR_PIPE" }
+      }
+   },
+   {
+      .name = "pe-pixel-count-killed-by-depth-pipe",
+      .type = ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_DEPTH_PIPE,
+      .group_id = ETNA_QUERY_PE_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "PE", "PIXEL_COUNT_KILLED_BY_DEPTH_PIPE" }
+      }
+   },
+   {
+      .name = "pe-pixel-count-drawn-by-color-pipe",
+      .type = ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_COLOR_PIPE,
+      .group_id = ETNA_QUERY_PE_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "PE", "PIXEL_COUNT_DRAWN_BY_COLOR_PIPE" }
+      }
+   },
+   {
+      .name = "pe-pixel-count-drawn-by-depth-pipe",
+      .type = ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_DEPTH_PIPE,
+      .group_id = ETNA_QUERY_PE_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "PE", "PIXEL_COUNT_DRAWN_BY_DEPTH_PIPE" }
+      }
+   },
+   {
+      .name = "sh-shader-cycles",
+      .type = ETNA_QUERY_SH_SHADER_CYCLES,
+      .group_id = ETNA_QUERY_SH_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "SH", "SHADER_CYCLES" }
+      }
+   },
+   {
+      .name = "sh-ps-inst-counter",
+      .type = ETNA_QUERY_SH_PS_INST_COUNTER,
+      .group_id = ETNA_QUERY_SH_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "SH", "PS_INST_COUNTER" }
+      }
+   },
+   {
+      .name = "sh-rendered-pixel-counter",
+      .type = ETNA_QUERY_SH_RENDERED_PIXEL_COUNTER,
+      .group_id = ETNA_QUERY_SH_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "SH", "RENDERED_PIXEL_COUNTER" }
+      }
+   },
+   {
+      .name = "sh-vs-inst-counter",
+      .type = ETNA_QUERY_SH_VS_INST_COUNTER,
+      .group_id = ETNA_QUERY_SH_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "SH", "VS_INST_COUNTER" }
+      }
+   },
+   {
+      .name = "sh-rendered-vertice-counter",
+      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
+      .group_id = ETNA_QUERY_SH_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "SH", "RENDERED_VERTICE_COUNTER" }
+      }
+   },
+   {
+      .name = "sh-vtx-branch-inst-counter",
+      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
+      .group_id = ETNA_QUERY_SH_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "SH", "VTX_BRANCH_INST_COUNTER" }
+      }
+   },
+   {
+      .name = "sh-vtx-texld-inst-counter",
+      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
+      .group_id = ETNA_QUERY_SH_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "SH", "VTX_TEXLD_INST_COUNTER" }
+      }
+   },
+   {
+      .name = "sh-plx-branch-inst-counter",
+      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
+      .group_id = ETNA_QUERY_SH_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "SH", "PXL_BRANCH_INST_COUNTER" }
+      }
+   },
+   {
+      .name = "sh-plx-texld-inst-counter",
+      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
+      .group_id = ETNA_QUERY_SH_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "SH", "PXL_TEXLD_INST_COUNTER" }
+      }
+   },
+   {
+      .name = "pa-input-vtx-counter",
+      .type = ETNA_QUERY_PA_INPUT_VTX_COUNTER,
+      .group_id = ETNA_QUERY_PA_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "PA", "INPUT_VTX_COUNTER" }
+      }
+   },
+   {
+      .name = "pa-input-prim-counter",
+      .type = ETNA_QUERY_PA_INPUT_PRIM_COUNTER,
+      .group_id = ETNA_QUERY_PA_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "PA", "INPUT_PRIM_COUNTER" }
+      }
+   },
+   {
+      .name = "pa-output-prim-counter",
+      .type = ETNA_QUERY_PA_OUTPUT_PRIM_COUNTER,
+      .group_id = ETNA_QUERY_PA_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "PA", "OUTPUT_PRIM_COUNTER" }
+      }
+   },
+   {
+      .name = "pa-depth-clipped-counter",
+      .type = ETNA_QUERY_PA_DEPTH_CLIPPED_COUNTER,
+      .group_id = ETNA_QUERY_PA_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "PA", "DEPTH_CLIPPED_COUNTER" }
+      }
+   },
+   {
+      .name = "pa-trivial-rejected-counter",
+      .type = ETNA_QUERY_PA_TRIVIAL_REJECTED_COUNTER,
+      .group_id = ETNA_QUERY_PA_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "PA", "TRIVIAL_REJECTED_COUNTER" }
+      }
+   },
+   {
+      .name = "pa-culled-counter",
+      .type = ETNA_QUERY_PA_CULLED_COUNTER,
+      .group_id = ETNA_QUERY_PA_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "PA", "CULLED_COUNTER" }
+      }
+   },
+   {
+      .name = "se-culled-triangle-count",
+      .type = ETNA_QUERY_SE_CULLED_TRIANGLE_COUNT,
+      .group_id = ETNA_QUERY_SE_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "SE", "CULLED_TRIANGLE_COUNT" }
+      }
+   },
+   {
+      .name = "se-culled-lines-count",
+      .type = ETNA_QUERY_SE_CULLED_LINES_COUNT,
+      .group_id = ETNA_QUERY_SE_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "SE", "CULLED_LINES_COUNT" }
+      }
+   },
+   {
+      .name = "ra-valid-pixel-count",
+      .type = ETNA_QUERY_RA_VALID_PIXEL_COUNT,
+      .group_id = ETNA_QUERY_RA_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "RA", "VALID_PIXEL_COUNT" }
+      }
+   },
+   {
+      .name = "ra-total-quad-count",
+      .type = ETNA_QUERY_RA_TOTAL_QUAD_COUNT,
+      .group_id = ETNA_QUERY_RA_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "RA", "TOTAL_QUAD_COUNT" }
+      }
+   },
+   {
+      .name = "ra-valid-quad-count-after-early-z",
+      .type = ETNA_QUERY_RA_VALID_QUAD_COUNT_AFTER_EARLY_Z,
+      .group_id = ETNA_QUERY_RA_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "RA", "VALID_QUAD_COUNT_AFTER_EARLY_Z" }
+      }
+   },
+   {
+      .name = "ra-total-primitive-count",
+      .type = ETNA_QUERY_RA_TOTAL_PRIMITIVE_COUNT,
+      .group_id = ETNA_QUERY_RA_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "RA", "TOTAL_PRIMITIVE_COUNT" }
+      }
+   },
+   {
+      .name = "ra-pipe-cache-miss-counter",
+      .type = ETNA_QUERY_RA_PIPE_CACHE_MISS_COUNTER,
+      .group_id = ETNA_QUERY_RA_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "RA", "PIPE_CACHE_MISS_COUNTER" }
+      }
+   },
+   {
+      .name = "ra-prefetch-cache-miss-counter",
+      .type = ETNA_QUERY_RA_PREFETCH_CACHE_MISS_COUNTER,
+      .group_id = ETNA_QUERY_RA_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "RA", "PREFETCH_CACHE_MISS_COUNTER" }
+      }
+   },
+   {
+      .name = "ra-pculled-quad-count",
+      .type = ETNA_QUERY_RA_CULLED_QUAD_COUNT,
+      .group_id = ETNA_QUERY_RA_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "RA", "CULLED_QUAD_COUNT" }
+      }
+   },
+   {
+      .name = "tx-total-bilinear-requests",
+      .type = ETNA_QUERY_TX_TOTAL_BILINEAR_REQUESTS,
+      .group_id = ETNA_QUERY_TX_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "TX", "TOTAL_BILINEAR_REQUESTS" }
+      }
+   },
+   {
+      .name = "tx-total-trilinear-requests",
+      .type = ETNA_QUERY_TX_TOTAL_TRILINEAR_REQUESTS,
+      .group_id = ETNA_QUERY_TX_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "TX", "TOTAL_TRILINEAR_REQUESTS" }
+      }
+   },
+   {
+      .name = "tx-total-discarded-texture-requests",
+      .type = ETNA_QUERY_TX_TOTAL_DISCARDED_TEXTURE_REQUESTS,
+      .group_id = ETNA_QUERY_TX_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "TX", "TOTAL_DISCARDED_TEXTURE_REQUESTS" }
+      }
+   },
+   {
+      .name = "tx-total-texture-requests",
+      .type = ETNA_QUERY_TX_TOTAL_TEXTURE_REQUESTS,
+      .group_id = ETNA_QUERY_TX_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "TX", "TOTAL_TEXTURE_REQUESTS" }
+      }
+   },
+   {
+      .name = "tx-mem-read-count",
+      .type = ETNA_QUERY_TX_MEM_READ_COUNT,
+      .group_id = ETNA_QUERY_TX_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "TX", "MEM_READ_COUNT" }
+      }
+   },
+   {
+      .name = "tx-mem-read-in-8b-count",
+      .type = ETNA_QUERY_TX_MEM_READ_IN_8B_COUNT,
+      .group_id = ETNA_QUERY_TX_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "TX", "MEM_READ_IN_8B_COUNT" }
+      }
+   },
+   {
+      .name = "tx-cache-miss-count",
+      .type = ETNA_QUERY_TX_CACHE_MISS_COUNT,
+      .group_id = ETNA_QUERY_TX_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "TX", "CACHE_MISS_COUNT" }
+      }
+   },
+   {
+      .name = "tx-cache-hit-texel-count",
+      .type = ETNA_QUERY_TX_CACHE_HIT_TEXEL_COUNT,
+      .group_id = ETNA_QUERY_TX_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "TX", "CACHE_HIT_TEXEL_COUNT" }
+      }
+   },
+   {
+      .name = "tx-cache-miss-texel-count",
+      .type = ETNA_QUERY_TX_CACHE_MISS_TEXEL_COUNT,
+      .group_id = ETNA_QUERY_TX_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "TX", "CACHE_MISS_TEXEL_COUNT" }
+      }
+   },
+   {
+      .name = "mc-total-read-req-8b-from-pipeline",
+      .type = ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_PIPELINE,
+      .group_id = ETNA_QUERY_MC_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "MC", "TOTAL_READ_REQ_8B_FROM_PIPELINE" }
+      }
+   },
+   {
+      .name = "mc-total-read-req-8b-from-ip",
+      .type = ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_IP,
+      .group_id = ETNA_QUERY_MC_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "MC", "TOTAL_READ_REQ_8B_FROM_IP" }
+      }
+   },
+   {
+      .name = "mc-total-write-req-8b-from-pipeline",
+      .type = ETNA_QUERY_MC_TOTAL_WRITE_REQ_8B_FROM_PIPELINE,
+      .group_id = ETNA_QUERY_MC_GROUP_ID,
+      .source = (const struct etna_perfmon_source[]) {
+         { "MC", "TOTAL_WRITE_REQ_8B_FROM_PIPELINE" }
+      }
+   }
+};
+
+struct etna_perfmon_signal *
+etna_pm_query_signal(struct etna_perfmon *perfmon,
+                     const struct etna_perfmon_source *source)
+{
+   struct etna_perfmon_domain *domain;
+
+   domain = etna_perfmon_get_dom_by_name(perfmon, source->domain);
+   if (!domain)
+      return NULL;
+
+   return etna_perfmon_get_sig_by_name(domain, source->signal);
+}
+
+void
+etna_pm_query_setup(struct etna_screen *screen)
+{
+   screen->perfmon = etna_perfmon_create(screen->pipe);
+
+   if (!screen->perfmon)
+      return;
+
+   for (unsigned i = 0; i < ARRAY_SIZE(query_config); i++) {
+      const struct etna_perfmon_config *cfg = &query_config[i];
+
+      if (!etna_pm_cfg_supported(screen->perfmon, cfg))
+         continue;
+
+      util_dynarray_append(&screen->supported_pm_queries, unsigned, i);
+   }
+}
+
+const struct etna_perfmon_config *
+etna_pm_query_config(unsigned type)
+{
+   for (unsigned i = 0; i < ARRAY_SIZE(query_config); i++)
+      if (query_config[i].type == type)
+         return &query_config[i];
+
+   return NULL;
+}
+
+int
+etna_pm_get_driver_query_info(struct pipe_screen *pscreen, unsigned index,
+                              struct pipe_driver_query_info *info)
+{
+   const struct etna_screen *screen = etna_screen(pscreen);
+   const unsigned num = screen->supported_pm_queries.size / sizeof(unsigned);
+   unsigned i;
+
+   if (!info)
+      return num;
+
+   if (index >= num)
+      return 0;
+
+   i = *util_dynarray_element(&screen->supported_pm_queries, unsigned, index);
+   assert(i < ARRAY_SIZE(query_config));
+
+   info->name = query_config[i].name;
+   info->query_type = query_config[i].type;
+   info->group_id = query_config[i].group_id;
+
+   return 1;
+}
+
+static
+unsigned query_count(unsigned group)
+{
+   unsigned count = 0;
+
+   for (unsigned i = 0; i < ARRAY_SIZE(query_config); i++)
+      if (query_config[i].group_id == group)
+         count++;
+
+   assert(count);
+
+   return count;
+}
+
+int
+etna_pm_get_driver_query_group_info(struct pipe_screen *pscreen,
+                                    unsigned index,
+                                    struct pipe_driver_query_group_info *info)
+{
+   if (!info)
+      return ARRAY_SIZE(group_names);
+
+   if (index >= ARRAY_SIZE(group_names))
+      return 0;
+
+   unsigned count = query_count(index);
+
+   info->name = group_names[index];
+   info->max_active_queries = count;
+   info->num_queries = count;
+
+   return 1;
+}
diff --git a/src/gallium/drivers/etnaviv/etnaviv_perfmon.h b/src/gallium/drivers/etnaviv/etnaviv_perfmon.h
new file mode 100644
index 00000000000..bd658d46e39
--- /dev/null
+++ b/src/gallium/drivers/etnaviv/etnaviv_perfmon.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2017 Etnaviv Project
+ * Copyright (C) 2017 Zodiac Inflight Innovations
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Rob Clark <robclark at freedesktop.org>
+ *    Christian Gmeiner <christian.gmeiner at gmail.com>
+ */
+
+#ifndef H_ETNAVIV_PERFMON
+#define H_ETNAVIV_PERFMON
+
+#include "etnaviv_query.h"
+#include <pipe/p_screen.h>
+
+struct etna_screen;
+
+#define ETNA_QUERY_HI_GROUP_ID                           1
+#define ETNA_QUERY_PE_GROUP_ID                           2
+#define ETNA_QUERY_SH_GROUP_ID                           3
+#define ETNA_QUERY_PA_GROUP_ID                           4
+#define ETNA_QUERY_SE_GROUP_ID                           5
+#define ETNA_QUERY_RA_GROUP_ID                           6
+#define ETNA_QUERY_TX_GROUP_ID                           7
+#define ETNA_QUERY_MC_GROUP_ID                           8
+
+#define ETNA_QUERY_HI_TOTAL_CYCLES                       (ETNA_PM_QUERY_BASE + 0)
+#define ETNA_QUERY_HI_IDLE_CYCLES                        (ETNA_PM_QUERY_BASE + 1)
+#define ETNA_QUERY_HI_AXI_CYCLES_READ_REQUEST_STALLED    (ETNA_PM_QUERY_BASE + 2)
+#define ETNA_QUERY_HI_AXI_CYCLES_WRITE_REQUEST_STALLED   (ETNA_PM_QUERY_BASE + 3)
+#define ETNA_QUERY_HI_AXI_CYCLES_WRITE_DATA_STALLED      (ETNA_PM_QUERY_BASE + 4)
+
+#define ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_COLOR_PIPE   (ETNA_PM_QUERY_BASE + 5)
+#define ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_DEPTH_PIPE   (ETNA_PM_QUERY_BASE + 6)
+#define ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_COLOR_PIPE    (ETNA_PM_QUERY_BASE + 7)
+#define ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_DEPTH_PIPE    (ETNA_PM_QUERY_BASE + 8)
+#define ETNA_QUERY_PE_PIXELS_RENDERED_2D                 (ETNA_PM_QUERY_BASE + 9)
+
+#define ETNA_QUERY_SH_SHADER_CYCLES                      (ETNA_PM_QUERY_BASE + 10)
+#define ETNA_QUERY_SH_PS_INST_COUNTER                    (ETNA_PM_QUERY_BASE + 11)
+#define ETNA_QUERY_SH_RENDERED_PIXEL_COUNTER             (ETNA_PM_QUERY_BASE + 12)
+#define ETNA_QUERY_SH_VS_INST_COUNTER                    (ETNA_PM_QUERY_BASE + 13)
+#define ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER           (ETNA_PM_QUERY_BASE + 14)
+#define ETNA_QUERY_SH_VTX_BRANCH_INST_COUNTER            (ETNA_PM_QUERY_BASE + 15)
+#define ETNA_QUERY_SH_VTX_TEXLD_INST_COUNTER             (ETNA_PM_QUERY_BASE + 16)
+#define ETNA_QUERY_SH_PXL_BRANCH_INST_COUNTER            (ETNA_PM_QUERY_BASE + 17)
+#define ETNA_QUERY_SH_PXL_TEXLD_INST_COUNTER             (ETNA_PM_QUERY_BASE + 18)
+
+#define ETNA_QUERY_PA_INPUT_VTX_COUNTER                  (ETNA_PM_QUERY_BASE + 19)
+#define ETNA_QUERY_PA_INPUT_PRIM_COUNTER                 (ETNA_PM_QUERY_BASE + 20)
+#define ETNA_QUERY_PA_OUTPUT_PRIM_COUNTER                (ETNA_PM_QUERY_BASE + 21)
+#define ETNA_QUERY_PA_DEPTH_CLIPPED_COUNTER              (ETNA_PM_QUERY_BASE + 22)
+#define ETNA_QUERY_PA_TRIVIAL_REJECTED_COUNTER           (ETNA_PM_QUERY_BASE + 23)
+#define ETNA_QUERY_PA_CULLED_COUNTER                     (ETNA_PM_QUERY_BASE + 24)
+
+#define ETNA_QUERY_SE_CULLED_TRIANGLE_COUNT              (ETNA_PM_QUERY_BASE + 25)
+#define ETNA_QUERY_SE_CULLED_LINES_COUNT                 (ETNA_PM_QUERY_BASE + 26)
+
+#define ETNA_QUERY_RA_VALID_PIXEL_COUNT                  (ETNA_PM_QUERY_BASE + 27)
+#define ETNA_QUERY_RA_TOTAL_QUAD_COUNT                   (ETNA_PM_QUERY_BASE + 28)
+#define ETNA_QUERY_RA_VALID_QUAD_COUNT_AFTER_EARLY_Z     (ETNA_PM_QUERY_BASE + 29)
+#define ETNA_QUERY_RA_TOTAL_PRIMITIVE_COUNT              (ETNA_PM_QUERY_BASE + 30)
+#define ETNA_QUERY_RA_PIPE_CACHE_MISS_COUNTER            (ETNA_PM_QUERY_BASE + 31)
+#define ETNA_QUERY_RA_PREFETCH_CACHE_MISS_COUNTER        (ETNA_PM_QUERY_BASE + 32)
+#define ETNA_QUERY_RA_CULLED_QUAD_COUNT                  (ETNA_PM_QUERY_BASE + 33)
+
+#define ETNA_QUERY_TX_TOTAL_BILINEAR_REQUESTS            (ETNA_PM_QUERY_BASE + 34)
+#define ETNA_QUERY_TX_TOTAL_TRILINEAR_REQUESTS           (ETNA_PM_QUERY_BASE + 35)
+#define ETNA_QUERY_TX_TOTAL_DISCARDED_TEXTURE_REQUESTS   (ETNA_PM_QUERY_BASE + 36)
+#define ETNA_QUERY_TX_TOTAL_TEXTURE_REQUESTS             (ETNA_PM_QUERY_BASE + 37)
+#define ETNA_QUERY_TX_MEM_READ_COUNT                     (ETNA_PM_QUERY_BASE + 38)
+#define ETNA_QUERY_TX_MEM_READ_IN_8B_COUNT               (ETNA_PM_QUERY_BASE + 39)
+#define ETNA_QUERY_TX_CACHE_MISS_COUNT                   (ETNA_PM_QUERY_BASE + 40)
+#define ETNA_QUERY_TX_CACHE_HIT_TEXEL_COUNT              (ETNA_PM_QUERY_BASE + 41)
+#define ETNA_QUERY_TX_CACHE_MISS_TEXEL_COUNT             (ETNA_PM_QUERY_BASE + 42)
+
+#define ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_PIPELINE    (ETNA_PM_QUERY_BASE + 43)
+#define ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_IP          (ETNA_PM_QUERY_BASE + 44)
+#define ETNA_QUERY_MC_TOTAL_WRITE_REQ_8B_FROM_PIPELINE   (ETNA_PM_QUERY_BASE + 45)
+
+struct etna_perfmon_source
+{
+   const char *domain;
+   const char *signal;
+};
+
+struct etna_perfmon_config
+{
+   const char *name;
+   unsigned type;
+   unsigned group_id;
+   const struct etna_perfmon_source *source;
+};
+
+struct etna_perfmon_signal *
+etna_pm_query_signal(struct etna_perfmon *perfmon,
+                     const struct etna_perfmon_source *source);
+
+static inline bool
+etna_pm_cfg_supported(struct etna_perfmon *perfmon,
+                      const struct etna_perfmon_config *cfg)
+{
+   struct etna_perfmon_signal *signal = etna_pm_query_signal(perfmon, cfg->source);
+
+   return !!signal;
+}
+
+void
+etna_pm_query_setup(struct etna_screen *screen);
+
+const struct etna_perfmon_config *
+etna_pm_query_config(unsigned type);
+
+int
+etna_pm_get_driver_query_info(struct pipe_screen *pscreen, unsigned index,
+                              struct pipe_driver_query_info *info);
+
+int
+etna_pm_get_driver_query_group_info(struct pipe_screen *pscreen,
+                                    unsigned index,
+                                    struct pipe_driver_query_group_info *info);
+
+#endif
diff --git a/src/gallium/drivers/etnaviv/etnaviv_query_pm.c b/src/gallium/drivers/etnaviv/etnaviv_query_pm.c
index 1c9061f8abb..a4136516e14 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_query_pm.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_query_pm.c
@@ -25,433 +25,12 @@
  *    Christian Gmeiner <christian.gmeiner at gmail.com>
  */
 
-#include "util/u_inlines.h"
 #include "util/u_memory.h"
 
 #include "etnaviv_context.h"
 #include "etnaviv_query_pm.h"
 #include "etnaviv_screen.h"
 
-struct etna_perfmon_source
-{
-   const char *domain;
-   const char *signal;
-};
-
-struct etna_perfmon_config
-{
-   const char *name;
-   unsigned type;
-   unsigned group_id;
-   const struct etna_perfmon_source *source;
-};
-
-static const char *group_names[] = {
-   [ETNA_QUERY_HI_GROUP_ID] = "HI",
-   [ETNA_QUERY_PE_GROUP_ID] = "PE",
-   [ETNA_QUERY_SH_GROUP_ID] = "SH",
-   [ETNA_QUERY_PA_GROUP_ID] = "PA",
-   [ETNA_QUERY_SE_GROUP_ID] = "SE",
-   [ETNA_QUERY_RA_GROUP_ID] = "RA",
-   [ETNA_QUERY_TX_GROUP_ID] = "TX",
-   [ETNA_QUERY_MC_GROUP_ID] = "MC",
-};
-
-static const struct etna_perfmon_config query_config[] = {
-   {
-      .name = "hi-total-cycles",
-      .type = ETNA_QUERY_HI_TOTAL_CYCLES,
-      .group_id = ETNA_QUERY_HI_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "HI", "TOTAL_CYCLES" }
-      }
-   },
-   {
-      .name = "hi-idle-cycles",
-      .type = ETNA_QUERY_HI_IDLE_CYCLES,
-      .group_id = ETNA_QUERY_HI_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "HI", "IDLE_CYCLES" }
-      }
-   },
-   {
-      .name = "hi-axi-cycles-read-request-stalled",
-      .type = ETNA_QUERY_HI_AXI_CYCLES_READ_REQUEST_STALLED,
-      .group_id = ETNA_QUERY_HI_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "HI", "AXI_CYCLES_READ_REQUEST_STALLED" }
-      }
-   },
-   {
-      .name = "hi-axi-cycles-write-request-stalled",
-      .type = ETNA_QUERY_HI_AXI_CYCLES_WRITE_REQUEST_STALLED,
-      .group_id = ETNA_QUERY_HI_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "HI", "AXI_CYCLES_WRITE_REQUEST_STALLED" }
-      }
-   },
-   {
-      .name = "hi-axi-cycles-write-data-stalled",
-      .type = ETNA_QUERY_HI_AXI_CYCLES_WRITE_DATA_STALLED,
-      .group_id = ETNA_QUERY_HI_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "HI", "AXI_CYCLES_WRITE_DATA_STALLED" }
-      }
-   },
-   {
-      .name = "pe-pixel-count-killed-by-color-pipe",
-      .type = ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_COLOR_PIPE,
-      .group_id = ETNA_QUERY_PE_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "PE", "PIXEL_COUNT_KILLED_BY_COLOR_PIPE" }
-      }
-   },
-   {
-      .name = "pe-pixel-count-killed-by-depth-pipe",
-      .type = ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_DEPTH_PIPE,
-      .group_id = ETNA_QUERY_PE_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "PE", "PIXEL_COUNT_KILLED_BY_DEPTH_PIPE" }
-      }
-   },
-   {
-      .name = "pe-pixel-count-drawn-by-color-pipe",
-      .type = ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_COLOR_PIPE,
-      .group_id = ETNA_QUERY_PE_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "PE", "PIXEL_COUNT_DRAWN_BY_COLOR_PIPE" }
-      }
-   },
-   {
-      .name = "pe-pixel-count-drawn-by-depth-pipe",
-      .type = ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_DEPTH_PIPE,
-      .group_id = ETNA_QUERY_PE_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "PE", "PIXEL_COUNT_DRAWN_BY_DEPTH_PIPE" }
-      }
-   },
-   {
-      .name = "sh-shader-cycles",
-      .type = ETNA_QUERY_SH_SHADER_CYCLES,
-      .group_id = ETNA_QUERY_SH_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "SH", "SHADER_CYCLES" }
-      }
-   },
-   {
-      .name = "sh-ps-inst-counter",
-      .type = ETNA_QUERY_SH_PS_INST_COUNTER,
-      .group_id = ETNA_QUERY_SH_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "SH", "PS_INST_COUNTER" }
-      }
-   },
-   {
-      .name = "sh-rendered-pixel-counter",
-      .type = ETNA_QUERY_SH_RENDERED_PIXEL_COUNTER,
-      .group_id = ETNA_QUERY_SH_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "SH", "RENDERED_PIXEL_COUNTER" }
-      }
-   },
-   {
-      .name = "sh-vs-inst-counter",
-      .type = ETNA_QUERY_SH_VS_INST_COUNTER,
-      .group_id = ETNA_QUERY_SH_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "SH", "VS_INST_COUNTER" }
-      }
-   },
-   {
-      .name = "sh-rendered-vertice-counter",
-      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
-      .group_id = ETNA_QUERY_SH_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "SH", "RENDERED_VERTICE_COUNTER" }
-      }
-   },
-   {
-      .name = "sh-vtx-branch-inst-counter",
-      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
-      .group_id = ETNA_QUERY_SH_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "SH", "VTX_BRANCH_INST_COUNTER" }
-      }
-   },
-   {
-      .name = "sh-vtx-texld-inst-counter",
-      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
-      .group_id = ETNA_QUERY_SH_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "SH", "VTX_TEXLD_INST_COUNTER" }
-      }
-   },
-   {
-      .name = "sh-plx-branch-inst-counter",
-      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
-      .group_id = ETNA_QUERY_SH_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "SH", "PXL_BRANCH_INST_COUNTER" }
-      }
-   },
-   {
-      .name = "sh-plx-texld-inst-counter",
-      .type = ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER,
-      .group_id = ETNA_QUERY_SH_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "SH", "PXL_TEXLD_INST_COUNTER" }
-      }
-   },
-   {
-      .name = "pa-input-vtx-counter",
-      .type = ETNA_QUERY_PA_INPUT_VTX_COUNTER,
-      .group_id = ETNA_QUERY_PA_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "PA", "INPUT_VTX_COUNTER" }
-      }
-   },
-   {
-      .name = "pa-input-prim-counter",
-      .type = ETNA_QUERY_PA_INPUT_PRIM_COUNTER,
-      .group_id = ETNA_QUERY_PA_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "PA", "INPUT_PRIM_COUNTER" }
-      }
-   },
-   {
-      .name = "pa-output-prim-counter",
-      .type = ETNA_QUERY_PA_OUTPUT_PRIM_COUNTER,
-      .group_id = ETNA_QUERY_PA_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "PA", "OUTPUT_PRIM_COUNTER" }
-      }
-   },
-   {
-      .name = "pa-depth-clipped-counter",
-      .type = ETNA_QUERY_PA_DEPTH_CLIPPED_COUNTER,
-      .group_id = ETNA_QUERY_PA_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "PA", "DEPTH_CLIPPED_COUNTER" }
-      }
-   },
-   {
-      .name = "pa-trivial-rejected-counter",
-      .type = ETNA_QUERY_PA_TRIVIAL_REJECTED_COUNTER,
-      .group_id = ETNA_QUERY_PA_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "PA", "TRIVIAL_REJECTED_COUNTER" }
-      }
-   },
-   {
-      .name = "pa-culled-counter",
-      .type = ETNA_QUERY_PA_CULLED_COUNTER,
-      .group_id = ETNA_QUERY_PA_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "PA", "CULLED_COUNTER" }
-      }
-   },
-   {
-      .name = "se-culled-triangle-count",
-      .type = ETNA_QUERY_SE_CULLED_TRIANGLE_COUNT,
-      .group_id = ETNA_QUERY_SE_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "SE", "CULLED_TRIANGLE_COUNT" }
-      }
-   },
-   {
-      .name = "se-culled-lines-count",
-      .type = ETNA_QUERY_SE_CULLED_LINES_COUNT,
-      .group_id = ETNA_QUERY_SE_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "SE", "CULLED_LINES_COUNT" }
-      }
-   },
-   {
-      .name = "ra-valid-pixel-count",
-      .type = ETNA_QUERY_RA_VALID_PIXEL_COUNT,
-      .group_id = ETNA_QUERY_RA_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "RA", "VALID_PIXEL_COUNT" }
-      }
-   },
-   {
-      .name = "ra-total-quad-count",
-      .type = ETNA_QUERY_RA_TOTAL_QUAD_COUNT,
-      .group_id = ETNA_QUERY_RA_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "RA", "TOTAL_QUAD_COUNT" }
-      }
-   },
-   {
-      .name = "ra-valid-quad-count-after-early-z",
-      .type = ETNA_QUERY_RA_VALID_QUAD_COUNT_AFTER_EARLY_Z,
-      .group_id = ETNA_QUERY_RA_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "RA", "VALID_QUAD_COUNT_AFTER_EARLY_Z" }
-      }
-   },
-   {
-      .name = "ra-total-primitive-count",
-      .type = ETNA_QUERY_RA_TOTAL_PRIMITIVE_COUNT,
-      .group_id = ETNA_QUERY_RA_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "RA", "TOTAL_PRIMITIVE_COUNT" }
-      }
-   },
-   {
-      .name = "ra-pipe-cache-miss-counter",
-      .type = ETNA_QUERY_RA_PIPE_CACHE_MISS_COUNTER,
-      .group_id = ETNA_QUERY_RA_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "RA", "PIPE_CACHE_MISS_COUNTER" }
-      }
-   },
-   {
-      .name = "ra-prefetch-cache-miss-counter",
-      .type = ETNA_QUERY_RA_PREFETCH_CACHE_MISS_COUNTER,
-      .group_id = ETNA_QUERY_RA_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "RA", "PREFETCH_CACHE_MISS_COUNTER" }
-      }
-   },
-   {
-      .name = "ra-pculled-quad-count",
-      .type = ETNA_QUERY_RA_CULLED_QUAD_COUNT,
-      .group_id = ETNA_QUERY_RA_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "RA", "CULLED_QUAD_COUNT" }
-      }
-   },
-   {
-      .name = "tx-total-bilinear-requests",
-      .type = ETNA_QUERY_TX_TOTAL_BILINEAR_REQUESTS,
-      .group_id = ETNA_QUERY_TX_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "TX", "TOTAL_BILINEAR_REQUESTS" }
-      }
-   },
-   {
-      .name = "tx-total-trilinear-requests",
-      .type = ETNA_QUERY_TX_TOTAL_TRILINEAR_REQUESTS,
-      .group_id = ETNA_QUERY_TX_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "TX", "TOTAL_TRILINEAR_REQUESTS" }
-      }
-   },
-   {
-      .name = "tx-total-discarded-texture-requests",
-      .type = ETNA_QUERY_TX_TOTAL_DISCARDED_TEXTURE_REQUESTS,
-      .group_id = ETNA_QUERY_TX_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "TX", "TOTAL_DISCARDED_TEXTURE_REQUESTS" }
-      }
-   },
-   {
-      .name = "tx-total-texture-requests",
-      .type = ETNA_QUERY_TX_TOTAL_TEXTURE_REQUESTS,
-      .group_id = ETNA_QUERY_TX_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "TX", "TOTAL_TEXTURE_REQUESTS" }
-      }
-   },
-   {
-      .name = "tx-mem-read-count",
-      .type = ETNA_QUERY_TX_MEM_READ_COUNT,
-      .group_id = ETNA_QUERY_TX_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "TX", "MEM_READ_COUNT" }
-      }
-   },
-   {
-      .name = "tx-mem-read-in-8b-count",
-      .type = ETNA_QUERY_TX_MEM_READ_IN_8B_COUNT,
-      .group_id = ETNA_QUERY_TX_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "TX", "MEM_READ_IN_8B_COUNT" }
-      }
-   },
-   {
-      .name = "tx-cache-miss-count",
-      .type = ETNA_QUERY_TX_CACHE_MISS_COUNT,
-      .group_id = ETNA_QUERY_TX_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "TX", "CACHE_MISS_COUNT" }
-      }
-   },
-   {
-      .name = "tx-cache-hit-texel-count",
-      .type = ETNA_QUERY_TX_CACHE_HIT_TEXEL_COUNT,
-      .group_id = ETNA_QUERY_TX_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "TX", "CACHE_HIT_TEXEL_COUNT" }
-      }
-   },
-   {
-      .name = "tx-cache-miss-texel-count",
-      .type = ETNA_QUERY_TX_CACHE_MISS_TEXEL_COUNT,
-      .group_id = ETNA_QUERY_TX_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "TX", "CACHE_MISS_TEXEL_COUNT" }
-      }
-   },
-   {
-      .name = "mc-total-read-req-8b-from-pipeline",
-      .type = ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_PIPELINE,
-      .group_id = ETNA_QUERY_MC_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "MC", "TOTAL_READ_REQ_8B_FROM_PIPELINE" }
-      }
-   },
-   {
-      .name = "mc-total-read-req-8b-from-ip",
-      .type = ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_IP,
-      .group_id = ETNA_QUERY_MC_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "MC", "TOTAL_READ_REQ_8B_FROM_IP" }
-      }
-   },
-   {
-      .name = "mc-total-write-req-8b-from-pipeline",
-      .type = ETNA_QUERY_MC_TOTAL_WRITE_REQ_8B_FROM_PIPELINE,
-      .group_id = ETNA_QUERY_MC_GROUP_ID,
-      .source = (const struct etna_perfmon_source[]) {
-         { "MC", "TOTAL_WRITE_REQ_8B_FROM_PIPELINE" }
-      }
-   }
-};
-
-static const struct etna_perfmon_config *
-etna_pm_query_config(unsigned type)
-{
-   for (unsigned i = 0; i < ARRAY_SIZE(query_config); i++)
-      if (query_config[i].type == type)
-         return &query_config[i];
-
-   return NULL;
-}
-
-static struct etna_perfmon_signal *
-etna_pm_query_signal(struct etna_perfmon *perfmon,
-                     const struct etna_perfmon_source *source)
-{
-   struct etna_perfmon_domain *domain;
-
-   domain = etna_perfmon_get_dom_by_name(perfmon, source->domain);
-   if (!domain)
-      return NULL;
-
-   return etna_perfmon_get_sig_by_name(domain, source->signal);
-}
-
-static inline bool
-etna_pm_cfg_supported(struct etna_perfmon *perfmon,
-                      const struct etna_perfmon_config *cfg)
-{
-   struct etna_perfmon_signal *signal = etna_pm_query_signal(perfmon, cfg->source);
-
-   return !!signal;
-}
-
 static inline void
 etna_pm_add_signal(struct etna_pm_query *pq, struct etna_perfmon *perfmon,
                    const struct etna_perfmon_config *cfg)
@@ -600,83 +179,3 @@ etna_pm_create_query(struct etna_context *ctx, unsigned query_type)
 
    return q;
 }
-
-void
-etna_pm_query_setup(struct etna_screen *screen)
-{
-   screen->perfmon = etna_perfmon_create(screen->pipe);
-
-   if (!screen->perfmon)
-      return;
-
-   for (unsigned i = 0; i < ARRAY_SIZE(query_config); i++) {
-      const struct etna_perfmon_config *cfg = &query_config[i];
-
-      if (!etna_pm_cfg_supported(screen->perfmon, cfg))
-         continue;
-
-      util_dynarray_append(&screen->supported_pm_queries, unsigned, i);
-   }
-}
-
-int
-etna_pm_get_driver_query_info(struct pipe_screen *pscreen, unsigned index,
-                              struct pipe_driver_query_info *info)
-{
-   const struct etna_screen *screen = etna_screen(pscreen);
-   const unsigned num = screen->supported_pm_queries.size / sizeof(unsigned);
-   unsigned i;
-
-   if (!info)
-      return num;
-
-   if (index >= num)
-      return 0;
-
-   i = *util_dynarray_element(&screen->supported_pm_queries, unsigned, index);
-   assert(i < ARRAY_SIZE(query_config));
-
-   info->name = query_config[i].name;
-   info->query_type = query_config[i].type;
-   info->group_id = query_config[i].group_id;
-   info->type = PIPE_DRIVER_QUERY_TYPE_UINT;
-   info->result_type = PIPE_DRIVER_QUERY_RESULT_TYPE_AVERAGE;
-   info->max_value.u32 = 0;
-   info->flags = 0;
-
-   return 1;
-}
-
-static
-unsigned query_count(unsigned group)
-{
-   unsigned count = 0;
-
-   for (unsigned i = 0; i < ARRAY_SIZE(query_config); i++)
-      if (query_config[i].group_id == group)
-         count++;
-
-   assert(count);
-
-   return count;
-}
-
-int
-etna_pm_get_driver_query_group_info(struct pipe_screen *pscreen,
-                                    unsigned index,
-                                    struct pipe_driver_query_group_info *info)
-{
-   if (!info)
-      return ARRAY_SIZE(group_names);
-
-   if (index >= ARRAY_SIZE(group_names))
-      return 0;
-
-   unsigned count = query_count(index);
-
-   info->name = group_names[index];
-   info->max_active_queries = count;
-   info->num_queries = count;
-
-   return 1;
-}
diff --git a/src/gallium/drivers/etnaviv/etnaviv_query_pm.h b/src/gallium/drivers/etnaviv/etnaviv_query_pm.h
index e80310cabf8..1e279f6df9f 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_query_pm.h
+++ b/src/gallium/drivers/etnaviv/etnaviv_query_pm.h
@@ -29,73 +29,9 @@
 #ifndef H_ETNAVIV_QUERY_PM
 #define H_ETNAVIV_QUERY_PM
 
+#include "etnaviv_perfmon.h"
 #include "etnaviv_query.h"
 
-struct etna_screen;
-
-#define ETNA_QUERY_HI_GROUP_ID                           1
-#define ETNA_QUERY_PE_GROUP_ID                           2
-#define ETNA_QUERY_SH_GROUP_ID                           3
-#define ETNA_QUERY_PA_GROUP_ID                           4
-#define ETNA_QUERY_SE_GROUP_ID                           5
-#define ETNA_QUERY_RA_GROUP_ID                           6
-#define ETNA_QUERY_TX_GROUP_ID                           7
-#define ETNA_QUERY_MC_GROUP_ID                           8
-
-#define ETNA_QUERY_HI_TOTAL_CYCLES                       (ETNA_PM_QUERY_BASE + 0)
-#define ETNA_QUERY_HI_IDLE_CYCLES                        (ETNA_PM_QUERY_BASE + 1)
-#define ETNA_QUERY_HI_AXI_CYCLES_READ_REQUEST_STALLED    (ETNA_PM_QUERY_BASE + 2)
-#define ETNA_QUERY_HI_AXI_CYCLES_WRITE_REQUEST_STALLED   (ETNA_PM_QUERY_BASE + 3)
-#define ETNA_QUERY_HI_AXI_CYCLES_WRITE_DATA_STALLED      (ETNA_PM_QUERY_BASE + 4)
-
-#define ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_COLOR_PIPE   (ETNA_PM_QUERY_BASE + 5)
-#define ETNA_QUERY_PE_PIXEL_COUNT_KILLED_BY_DEPTH_PIPE   (ETNA_PM_QUERY_BASE + 6)
-#define ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_COLOR_PIPE    (ETNA_PM_QUERY_BASE + 7)
-#define ETNA_QUERY_PE_PIXEL_COUNT_DRAWN_BY_DEPTH_PIPE    (ETNA_PM_QUERY_BASE + 8)
-#define ETNA_QUERY_PE_PIXELS_RENDERED_2D                 (ETNA_PM_QUERY_BASE + 9)
-
-#define ETNA_QUERY_SH_SHADER_CYCLES                      (ETNA_PM_QUERY_BASE + 10)
-#define ETNA_QUERY_SH_PS_INST_COUNTER                    (ETNA_PM_QUERY_BASE + 11)
-#define ETNA_QUERY_SH_RENDERED_PIXEL_COUNTER             (ETNA_PM_QUERY_BASE + 12)
-#define ETNA_QUERY_SH_VS_INST_COUNTER                    (ETNA_PM_QUERY_BASE + 13)
-#define ETNA_QUERY_SH_RENDERED_VERTICE_COUNTER           (ETNA_PM_QUERY_BASE + 14)
-#define ETNA_QUERY_SH_VTX_BRANCH_INST_COUNTER            (ETNA_PM_QUERY_BASE + 15)
-#define ETNA_QUERY_SH_VTX_TEXLD_INST_COUNTER             (ETNA_PM_QUERY_BASE + 16)
-#define ETNA_QUERY_SH_PXL_BRANCH_INST_COUNTER            (ETNA_PM_QUERY_BASE + 17)
-#define ETNA_QUERY_SH_PXL_TEXLD_INST_COUNTER             (ETNA_PM_QUERY_BASE + 18)
-
-#define ETNA_QUERY_PA_INPUT_VTX_COUNTER                  (ETNA_PM_QUERY_BASE + 19)
-#define ETNA_QUERY_PA_INPUT_PRIM_COUNTER                 (ETNA_PM_QUERY_BASE + 20)
-#define ETNA_QUERY_PA_OUTPUT_PRIM_COUNTER                (ETNA_PM_QUERY_BASE + 21)
-#define ETNA_QUERY_PA_DEPTH_CLIPPED_COUNTER              (ETNA_PM_QUERY_BASE + 22)
-#define ETNA_QUERY_PA_TRIVIAL_REJECTED_COUNTER           (ETNA_PM_QUERY_BASE + 23)
-#define ETNA_QUERY_PA_CULLED_COUNTER                     (ETNA_PM_QUERY_BASE + 24)
-
-#define ETNA_QUERY_SE_CULLED_TRIANGLE_COUNT              (ETNA_PM_QUERY_BASE + 25)
-#define ETNA_QUERY_SE_CULLED_LINES_COUNT                 (ETNA_PM_QUERY_BASE + 26)
-
-#define ETNA_QUERY_RA_VALID_PIXEL_COUNT                  (ETNA_PM_QUERY_BASE + 27)
-#define ETNA_QUERY_RA_TOTAL_QUAD_COUNT                   (ETNA_PM_QUERY_BASE + 28)
-#define ETNA_QUERY_RA_VALID_QUAD_COUNT_AFTER_EARLY_Z     (ETNA_PM_QUERY_BASE + 29)
-#define ETNA_QUERY_RA_TOTAL_PRIMITIVE_COUNT              (ETNA_PM_QUERY_BASE + 30)
-#define ETNA_QUERY_RA_PIPE_CACHE_MISS_COUNTER            (ETNA_PM_QUERY_BASE + 31)
-#define ETNA_QUERY_RA_PREFETCH_CACHE_MISS_COUNTER        (ETNA_PM_QUERY_BASE + 32)
-#define ETNA_QUERY_RA_CULLED_QUAD_COUNT                  (ETNA_PM_QUERY_BASE + 33)
-
-#define ETNA_QUERY_TX_TOTAL_BILINEAR_REQUESTS            (ETNA_PM_QUERY_BASE + 34)
-#define ETNA_QUERY_TX_TOTAL_TRILINEAR_REQUESTS           (ETNA_PM_QUERY_BASE + 35)
-#define ETNA_QUERY_TX_TOTAL_DISCARDED_TEXTURE_REQUESTS   (ETNA_PM_QUERY_BASE + 36)
-#define ETNA_QUERY_TX_TOTAL_TEXTURE_REQUESTS             (ETNA_PM_QUERY_BASE + 37)
-#define ETNA_QUERY_TX_MEM_READ_COUNT                     (ETNA_PM_QUERY_BASE + 38)
-#define ETNA_QUERY_TX_MEM_READ_IN_8B_COUNT               (ETNA_PM_QUERY_BASE + 39)
-#define ETNA_QUERY_TX_CACHE_MISS_COUNT                   (ETNA_PM_QUERY_BASE + 40)
-#define ETNA_QUERY_TX_CACHE_HIT_TEXEL_COUNT              (ETNA_PM_QUERY_BASE + 41)
-#define ETNA_QUERY_TX_CACHE_MISS_TEXEL_COUNT             (ETNA_PM_QUERY_BASE + 42)
-
-#define ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_PIPELINE    (ETNA_PM_QUERY_BASE + 43)
-#define ETNA_QUERY_MC_TOTAL_READ_REQ_8B_FROM_IP          (ETNA_PM_QUERY_BASE + 44)
-#define ETNA_QUERY_MC_TOTAL_WRITE_REQ_8B_FROM_PIPELINE   (ETNA_PM_QUERY_BASE + 45)
-
 struct etna_pm_query {
    struct etna_query base;
    struct etna_perfmon_signal *signal;
@@ -111,19 +47,7 @@ etna_pm_query(struct etna_query *q)
    return (struct etna_pm_query *)q;
 }
 
-void
-etna_pm_query_setup(struct etna_screen *screen);
-
 struct etna_query *
 etna_pm_create_query(struct etna_context *ctx, unsigned query_type);
 
-int
-etna_pm_get_driver_query_info(struct pipe_screen *pscreen, unsigned index,
-                              struct pipe_driver_query_info *info);
-
-int
-etna_pm_get_driver_query_group_info(struct pipe_screen *pscreen,
-                                    unsigned index,
-                                    struct pipe_driver_query_group_info *info);
-
 #endif
diff --git a/src/gallium/drivers/etnaviv/meson.build b/src/gallium/drivers/etnaviv/meson.build
index a64b10ba1b3..61b431f015b 100644
--- a/src/gallium/drivers/etnaviv/meson.build
+++ b/src/gallium/drivers/etnaviv/meson.build
@@ -53,6 +53,8 @@ files_etnaviv = files(
   'etnaviv_format.c',
   'etnaviv_format.h',
   'etnaviv_internal.h',
+  'etnaviv_perfmon.c',
+  'etnaviv_perfmon.h',
   'etnaviv_query.c',
   'etnaviv_query.h',
   'etnaviv_query_acc_occlusion.c',



More information about the mesa-commit mailing list