X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Ffreedreno%2Ffreedreno_query_sw.c;h=2164ad55e2e9aa892ab40bfa86a60e24f2219db2;hb=8cdc6c1e4b632cea6934836ca4962a555a1172c6;hp=8d81698f31d0024cb2b113cf05d1e18d0e1f17a4;hpb=13a0cf4480b908aafa337c121cbdfc338318f088;p=mesa.git diff --git a/src/gallium/drivers/freedreno/freedreno_query_sw.c b/src/gallium/drivers/freedreno/freedreno_query_sw.c index 8d81698f31d..2164ad55e2e 100644 --- a/src/gallium/drivers/freedreno/freedreno_query_sw.c +++ b/src/gallium/drivers/freedreno/freedreno_query_sw.c @@ -1,5 +1,3 @@ -/* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */ - /* * Copyright (C) 2014 Rob Clark * @@ -30,7 +28,7 @@ #include "util/u_string.h" #include "util/u_memory.h" #include "util/u_inlines.h" -#include "os/os_time.h" +#include "util/os_time.h" #include "freedreno_query_sw.h" #include "freedreno_context.h" @@ -54,7 +52,7 @@ read_counter(struct fd_context *ctx, int type) { switch (type) { case PIPE_QUERY_PRIMITIVES_GENERATED: - /* for now same thing as _PRIMITIVES_EMITTED */ + return ctx->stats.prims_generated; case PIPE_QUERY_PRIMITIVES_EMITTED: return ctx->stats.prims_emitted; case FD_QUERY_DRAW_CALLS: @@ -65,20 +63,45 @@ read_counter(struct fd_context *ctx, int type) return ctx->stats.batch_sysmem; case FD_QUERY_BATCH_GMEM: return ctx->stats.batch_gmem; + case FD_QUERY_BATCH_NONDRAW: + return ctx->stats.batch_nondraw; case FD_QUERY_BATCH_RESTORE: return ctx->stats.batch_restore; + case FD_QUERY_STAGING_UPLOADS: + return ctx->stats.staging_uploads; + case FD_QUERY_SHADOW_UPLOADS: + return ctx->stats.shadow_uploads; + case FD_QUERY_VS_REGS: + return ctx->stats.vs_regs; + case FD_QUERY_FS_REGS: + return ctx->stats.fs_regs; } return 0; } static bool -is_rate_query(struct fd_query *q) +is_time_rate_query(struct fd_query *q) { switch (q->type) { case FD_QUERY_BATCH_TOTAL: case FD_QUERY_BATCH_SYSMEM: case FD_QUERY_BATCH_GMEM: + case FD_QUERY_BATCH_NONDRAW: case FD_QUERY_BATCH_RESTORE: + case FD_QUERY_STAGING_UPLOADS: + case FD_QUERY_SHADOW_UPLOADS: + return true; + default: + return false; + } +} + +static bool +is_draw_rate_query(struct fd_query *q) +{ + switch (q->type) { + case FD_QUERY_VS_REGS: + case FD_QUERY_FS_REGS: return true; default: return false; @@ -89,39 +112,42 @@ static void fd_sw_begin_query(struct fd_context *ctx, struct fd_query *q) { struct fd_sw_query *sq = fd_sw_query(q); - q->active = true; sq->begin_value = read_counter(ctx, q->type); - if (is_rate_query(q)) + if (is_time_rate_query(q)) { sq->begin_time = os_time_get(); + } else if (is_draw_rate_query(q)) { + sq->begin_time = ctx->stats.draw_calls; + } } static void fd_sw_end_query(struct fd_context *ctx, struct fd_query *q) { struct fd_sw_query *sq = fd_sw_query(q); - q->active = false; sq->end_value = read_counter(ctx, q->type); - if (is_rate_query(q)) + if (is_time_rate_query(q)) { sq->end_time = os_time_get(); + } else if (is_draw_rate_query(q)) { + sq->end_time = ctx->stats.draw_calls; + } } -static boolean +static bool fd_sw_get_query_result(struct fd_context *ctx, struct fd_query *q, - boolean wait, union pipe_query_result *result) + bool wait, union pipe_query_result *result) { struct fd_sw_query *sq = fd_sw_query(q); - if (q->active) - return false; - - util_query_clear_result(result, q->type); - result->u64 = sq->end_value - sq->begin_value; - if (is_rate_query(q)) { + if (is_time_rate_query(q)) { double fps = (result->u64 * 1000000) / (double)(sq->end_time - sq->begin_time); result->u64 = (uint64_t)fps; + } else if (is_draw_rate_query(q)) { + double avg = ((double)result->u64) / + (double)(sq->end_time - sq->begin_time); + result->f = avg; } return true; @@ -135,7 +161,7 @@ static const struct fd_query_funcs sw_query_funcs = { }; struct fd_query * -fd_sw_create_query(struct fd_context *ctx, unsigned query_type) +fd_sw_create_query(struct fd_context *ctx, unsigned query_type, unsigned index) { struct fd_sw_query *sq; struct fd_query *q; @@ -147,7 +173,12 @@ fd_sw_create_query(struct fd_context *ctx, unsigned query_type) case FD_QUERY_BATCH_TOTAL: case FD_QUERY_BATCH_SYSMEM: case FD_QUERY_BATCH_GMEM: + case FD_QUERY_BATCH_NONDRAW: case FD_QUERY_BATCH_RESTORE: + case FD_QUERY_STAGING_UPLOADS: + case FD_QUERY_SHADOW_UPLOADS: + case FD_QUERY_VS_REGS: + case FD_QUERY_FS_REGS: break; default: return NULL;