-/* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
-
/*
* Copyright (C) 2014 Rob Clark <robclark@freedesktop.org>
*
#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"
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;
}
}
-static boolean
+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();
- return true;
+ } 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;
};
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;
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;