From eed5a009897a859ec118ef84c0437be174a49da3 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Tue, 23 Jul 2019 22:02:56 +0200 Subject: [PATCH] etnaviv: convert perfmon queries to acc queries Signed-off-by: Christian Gmeiner Tested-by: Marge Bot Part-of: --- src/gallium/drivers/etnaviv/Makefile.sources | 3 +- src/gallium/drivers/etnaviv/etnaviv_query.c | 4 +- .../drivers/etnaviv/etnaviv_query_acc.c | 2 + .../etnaviv/etnaviv_query_acc_perfmon.c | 166 ++++++++++++++++ .../drivers/etnaviv/etnaviv_query_pm.c | 181 ------------------ .../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(-) create mode 100644 src/gallium/drivers/etnaviv/etnaviv_query_acc_perfmon.c delete mode 100644 src/gallium/drivers/etnaviv/etnaviv_query_pm.c delete mode 100644 src/gallium/drivers/etnaviv/etnaviv_query_pm.h 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 + * Christian Gmeiner + */ + +#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 - */ - -#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 - * Christian Gmeiner - */ - -#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',