Mesa (master): etnaviv: convert perfmon queries to acc queries

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


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

Author: Christian Gmeiner <christian.gmeiner at gmail.com>
Date:   Tue Jul 23 22:02:56 2019 +0200

etnaviv: convert perfmon queries to acc queries

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

---

 src/gallium/drivers/etnaviv/Makefile.sources       |   3 +-
 src/gallium/drivers/etnaviv/etnaviv_query.c        |   4 +-
 src/gallium/drivers/etnaviv/etnaviv_query_acc.c    |   2 +
 .../drivers/etnaviv/etnaviv_query_acc_perfmon.c    | 166 +++++++++++++++++++
 src/gallium/drivers/etnaviv/etnaviv_query_pm.c     | 181 ---------------------
 src/gallium/drivers/etnaviv/etnaviv_query_pm.h     |  53 ------
 src/gallium/drivers/etnaviv/etnaviv_screen.h       |   2 +-
 src/gallium/drivers/etnaviv/meson.build            |   3 +-
 8 files changed, 172 insertions(+), 242 deletions(-)

diff --git a/src/gallium/drivers/etnaviv/Makefile.sources b/src/gallium/drivers/etnaviv/Makefile.sources
index 28c24911121..e74f7efe985 100644
--- a/src/gallium/drivers/etnaviv/Makefile.sources
+++ b/src/gallium/drivers/etnaviv/Makefile.sources
@@ -39,12 +39,11 @@ C_SOURCES :=  \
 	etnaviv_query.c \
 	etnaviv_query.h \
 	etnaviv_query_acc_occlusion.c \
+	etnaviv_query_acc_perfmon.c \
 	etnaviv_query_acc.c \
 	etnaviv_query_acc.h \
 	etnaviv_query_sw.c \
 	etnaviv_query_sw.h \
-	etnaviv_query_pm.c \
-	etnaviv_query_pm.h \
 	etnaviv_rasterizer.c \
 	etnaviv_rasterizer.h \
 	etnaviv_resource.c \
diff --git a/src/gallium/drivers/etnaviv/etnaviv_query.c b/src/gallium/drivers/etnaviv/etnaviv_query.c
index deb74258e7f..4168629beaa 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_query.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_query.c
@@ -29,10 +29,10 @@
 #include "util/u_inlines.h"
 
 #include "etnaviv_context.h"
+#include "etnaviv_perfmon.h"
 #include "etnaviv_query.h"
 #include "etnaviv_query_acc.h"
 #include "etnaviv_query_sw.h"
-#include "etnaviv_query_pm.h"
 
 static struct pipe_query *
 etna_create_query(struct pipe_context *pctx, unsigned query_type,
@@ -44,8 +44,6 @@ etna_create_query(struct pipe_context *pctx, unsigned query_type,
    q = etna_sw_create_query(ctx, query_type);
    if (!q)
       q = etna_acc_create_query(ctx, query_type);
-   if (!q)
-      q = etna_pm_create_query(ctx, query_type);
 
    return (struct pipe_query *)q;
 }
diff --git a/src/gallium/drivers/etnaviv/etnaviv_query_acc.c b/src/gallium/drivers/etnaviv/etnaviv_query_acc.c
index 3c8dd304204..58ad132a902 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_query_acc.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_query_acc.c
@@ -37,10 +37,12 @@
 
 
 extern const struct etna_acc_sample_provider occlusion_provider;
+extern const struct etna_acc_sample_provider perfmon_provider;
 
 static const struct etna_acc_sample_provider *acc_sample_provider[] =
 {
    &occlusion_provider,
+   &perfmon_provider,
 };
 
 static void
diff --git a/src/gallium/drivers/etnaviv/etnaviv_query_acc_perfmon.c b/src/gallium/drivers/etnaviv/etnaviv_query_acc_perfmon.c
new file mode 100644
index 00000000000..5a5ffdb5d61
--- /dev/null
+++ b/src/gallium/drivers/etnaviv/etnaviv_query_acc_perfmon.c
@@ -0,0 +1,166 @@
+/*
+ * 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>
+ */
+
+#include "util/u_memory.h"
+
+#include "etnaviv_context.h"
+#include "etnaviv_debug.h"
+#include "etnaviv_emit.h"
+#include "etnaviv_query_acc.h"
+
+struct etna_pm_query
+{
+   struct etna_acc_query base;
+
+   struct etna_perfmon_signal *signal;
+   unsigned sequence;
+};
+
+static inline struct etna_pm_query *
+etna_pm_query(struct etna_acc_query *aq)
+{
+   return (struct etna_pm_query *)aq;
+}
+
+static inline void
+pm_add_signal(struct etna_pm_query *pq, struct etna_perfmon *perfmon,
+              const struct etna_perfmon_config *cfg)
+{
+   struct etna_perfmon_signal *signal = etna_pm_query_signal(perfmon, cfg->source);
+
+   pq->signal = signal;
+}
+
+static void
+pm_query(struct etna_context *ctx, struct etna_acc_query *aq, unsigned flags)
+{
+   struct etna_cmd_stream *stream = ctx->stream;
+   struct etna_pm_query *pq = etna_pm_query(aq);
+   unsigned offset;
+   assert(flags);
+
+   if (aq->samples > 127) {
+      aq->samples = 127;
+      BUG("samples overflow perfmon");
+   }
+
+   /* offset 0 is reserved for seq number */
+   offset = 1 + aq->samples;
+
+   pq->sequence++;
+
+   /* skip seq number of 0 as the buffer got zeroed out */
+   pq->sequence = MAX2(pq->sequence, 1);
+
+   struct etna_perf p = {
+      .flags = flags,
+      .sequence = pq->sequence,
+      .bo = etna_resource(aq->prsc)->bo,
+      .signal = pq->signal,
+      .offset = offset
+   };
+
+   etna_cmd_stream_perf(stream, &p);
+   resource_written(ctx, aq->prsc);
+
+   /* force a flush in !wait case in etna_acc_get_query_result(..) */
+   aq->no_wait_cnt = 10;
+}
+
+static bool
+perfmon_supports(unsigned query_type)
+{
+   return !!etna_pm_query_config(query_type);
+}
+
+static struct etna_acc_query *
+perfmon_allocate(struct etna_context *ctx, unsigned query_type)
+{
+   struct etna_pm_query *pq = CALLOC_STRUCT(etna_pm_query);
+   const struct etna_perfmon_config *cfg;
+
+   if (!pq)
+      return NULL;
+
+   cfg = etna_pm_query_config(query_type);
+   if (!cfg)
+      return false;
+
+   if (!etna_pm_cfg_supported(ctx->screen->perfmon, cfg))
+      return false;
+
+   pm_add_signal(pq, ctx->screen->perfmon, cfg);
+
+   return &pq->base;
+}
+
+static void
+perfmon_resume(struct etna_acc_query *aq, struct etna_context *ctx)
+{
+   pm_query(ctx, aq, ETNA_PM_PROCESS_PRE);
+}
+
+static void
+perfmon_suspend(struct etna_acc_query *aq, struct etna_context *ctx)
+{
+   pm_query(ctx, aq, ETNA_PM_PROCESS_POST);
+}
+
+static bool
+perfmon_result(struct etna_acc_query *aq, void *buf,
+               union pipe_query_result *result)
+{
+   const struct etna_pm_query *pq = etna_pm_query(aq);
+   uint32_t sum = 0;
+   uint32_t *ptr = (uint32_t *)buf;
+
+   /* check seq number */
+   if (pq->sequence > ptr[0])
+      return false;
+
+   /* jump over seq number */
+   ptr++;
+
+   assert(aq->samples % 2 == 0);
+
+   /* each pair has a start and end value */
+   for (unsigned i = 0; i < aq->samples; i += 2)
+      sum += *(ptr + i + 1) - *(ptr + i);
+
+   result->u32 = sum;
+
+   return true;
+}
+
+const struct etna_acc_sample_provider perfmon_provider = {
+   .supports = perfmon_supports,
+   .allocate = perfmon_allocate,
+   .resume = perfmon_resume,
+   .suspend = perfmon_suspend,
+   .result = perfmon_result,
+};
diff --git a/src/gallium/drivers/etnaviv/etnaviv_query_pm.c b/src/gallium/drivers/etnaviv/etnaviv_query_pm.c
deleted file mode 100644
index a4136516e14..00000000000
--- a/src/gallium/drivers/etnaviv/etnaviv_query_pm.c
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * 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 "util/u_memory.h"
-
-#include "etnaviv_context.h"
-#include "etnaviv_query_pm.h"
-#include "etnaviv_screen.h"
-
-static inline void
-etna_pm_add_signal(struct etna_pm_query *pq, struct etna_perfmon *perfmon,
-                   const struct etna_perfmon_config *cfg)
-{
-   struct etna_perfmon_signal *signal = etna_pm_query_signal(perfmon, cfg->source);
-
-   pq->signal = signal;
-}
-
-static bool
-realloc_query_bo(struct etna_context *ctx, struct etna_pm_query *pq)
-{
-   if (pq->bo)
-      etna_bo_del(pq->bo);
-
-   pq->bo = etna_bo_new(ctx->screen->dev, 64, DRM_ETNA_GEM_CACHE_WC);
-   if (unlikely(!pq->bo))
-      return false;
-
-   pq->data = etna_bo_map(pq->bo);
-
-   return true;
-}
-
-static void
-etna_pm_query_get(struct etna_cmd_stream *stream, struct etna_query *q,
-                  unsigned flags)
-{
-   struct etna_pm_query *pq = etna_pm_query(q);
-   unsigned offset;
-   assert(flags);
-
-   if (flags == ETNA_PM_PROCESS_PRE)
-      offset = 1;
-   else
-      offset = 2;
-
-   struct etna_perf p = {
-      .flags = flags,
-      .sequence = pq->sequence,
-      .bo = pq->bo,
-      .signal = pq->signal,
-      .offset = offset
-   };
-
-   etna_cmd_stream_perf(stream, &p);
-}
-
-static inline void
-etna_pm_query_update(struct etna_query *q)
-{
-   struct etna_pm_query *pq = etna_pm_query(q);
-
-   if (pq->data[0] == pq->sequence)
-      pq->ready = true;
-}
-
-static void
-etna_pm_destroy_query(struct etna_context *ctx, struct etna_query *q)
-{
-   struct etna_pm_query *pq = etna_pm_query(q);
-
-   etna_bo_del(pq->bo);
-   FREE(pq);
-}
-
-static bool
-etna_pm_begin_query(struct etna_context *ctx, struct etna_query *q)
-{
-   struct etna_pm_query *pq = etna_pm_query(q);
-
-   pq->ready = false;
-   pq->sequence++;
-
-   etna_pm_query_get(ctx->stream, q, ETNA_PM_PROCESS_PRE);
-
-   return true;
-}
-
-static void
-etna_pm_end_query(struct etna_context *ctx, struct etna_query *q)
-{
-   etna_pm_query_get(ctx->stream, q, ETNA_PM_PROCESS_POST);
-}
-
-static bool
-etna_pm_get_query_result(struct etna_context *ctx, struct etna_query *q,
-                         bool wait, union pipe_query_result *result)
-{
-   struct etna_pm_query *pq = etna_pm_query(q);
-
-   etna_pm_query_update(q);
-
-   if (!pq->ready) {
-      if (!wait)
-         return false;
-
-      if (!etna_bo_cpu_prep(pq->bo, DRM_ETNA_PREP_READ))
-         return false;
-
-      pq->ready = true;
-      etna_bo_cpu_fini(pq->bo);
-   }
-
-   result->u32 = pq->data[2] - pq->data[1];
-
-   return true;
-}
-
-static const struct etna_query_funcs hw_query_funcs = {
-   .destroy_query = etna_pm_destroy_query,
-   .begin_query = etna_pm_begin_query,
-   .end_query = etna_pm_end_query,
-   .get_query_result = etna_pm_get_query_result,
-};
-
-struct etna_query *
-etna_pm_create_query(struct etna_context *ctx, unsigned query_type)
-{
-   struct etna_perfmon *perfmon = ctx->screen->perfmon;
-   const struct etna_perfmon_config *cfg;
-   struct etna_pm_query *pq;
-   struct etna_query *q;
-
-   cfg = etna_pm_query_config(query_type);
-   if (!cfg)
-      return NULL;
-
-   if (!etna_pm_cfg_supported(perfmon, cfg))
-      return NULL;
-
-   pq = CALLOC_STRUCT(etna_pm_query);
-   if (!pq)
-      return NULL;
-
-   if (!realloc_query_bo(ctx, pq)) {
-      FREE(pq);
-      return NULL;
-   }
-
-   q = &pq->base;
-   q->funcs = &hw_query_funcs;
-   q->type = query_type;
-
-   etna_pm_add_signal(pq, perfmon, cfg);
-
-   return q;
-}
diff --git a/src/gallium/drivers/etnaviv/etnaviv_query_pm.h b/src/gallium/drivers/etnaviv/etnaviv_query_pm.h
deleted file mode 100644
index 1e279f6df9f..00000000000
--- a/src/gallium/drivers/etnaviv/etnaviv_query_pm.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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_QUERY_PM
-#define H_ETNAVIV_QUERY_PM
-
-#include "etnaviv_perfmon.h"
-#include "etnaviv_query.h"
-
-struct etna_pm_query {
-   struct etna_query base;
-   struct etna_perfmon_signal *signal;
-   struct etna_bo *bo;
-   uint32_t *data;
-   uint32_t sequence;
-   bool ready;
-};
-
-static inline struct etna_pm_query *
-etna_pm_query(struct etna_query *q)
-{
-   return (struct etna_pm_query *)q;
-}
-
-struct etna_query *
-etna_pm_create_query(struct etna_context *ctx, unsigned query_type);
-
-#endif
diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.h b/src/gallium/drivers/etnaviv/etnaviv_screen.h
index e69d598c463..1bdae5a163a 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_screen.h
+++ b/src/gallium/drivers/etnaviv/etnaviv_screen.h
@@ -29,7 +29,7 @@
 #define H_ETNAVIV_SCREEN
 
 #include "etnaviv_internal.h"
-#include "etnaviv_query_pm.h"
+#include "etnaviv_perfmon.h"
 
 #include "os/os_thread.h"
 #include "pipe/p_screen.h"
diff --git a/src/gallium/drivers/etnaviv/meson.build b/src/gallium/drivers/etnaviv/meson.build
index 61b431f015b..102797807be 100644
--- a/src/gallium/drivers/etnaviv/meson.build
+++ b/src/gallium/drivers/etnaviv/meson.build
@@ -58,12 +58,11 @@ files_etnaviv = files(
   'etnaviv_query.c',
   'etnaviv_query.h',
   'etnaviv_query_acc_occlusion.c',
+  'etnaviv_query_acc_perfmon.c',
   'etnaviv_query_acc.c',
   'etnaviv_query_acc.h',
   'etnaviv_query_sw.c',
   'etnaviv_query_sw.h',
-  'etnaviv_query_pm.c',
-  'etnaviv_query_pm.h',
   'etnaviv_rasterizer.c',
   'etnaviv_rasterizer.h',
   'etnaviv_resource.c',



More information about the mesa-commit mailing list