projects
/
mesa.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
freedreno/a6xx: Fix timestamp queries.
[mesa.git]
/
src
/
gallium
/
drivers
/
freedreno
/
freedreno_query_sw.c
diff --git
a/src/gallium/drivers/freedreno/freedreno_query_sw.c
b/src/gallium/drivers/freedreno/freedreno_query_sw.c
index 4af6a125e03c496e97cb87f7740157d7557cc6bd..2164ad55e2e9aa892ab40bfa86a60e24f2219db2 100644
(file)
--- 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 <robclark@freedesktop.org>
*
/*
* Copyright (C) 2014 Rob Clark <robclark@freedesktop.org>
*
@@
-30,7
+28,7
@@
#include "util/u_string.h"
#include "util/u_memory.h"
#include "util/u_inlines.h"
#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"
#include "freedreno_query_sw.h"
#include "freedreno_context.h"
@@
-65,64
+63,91
@@
read_counter(struct fd_context *ctx, int type)
return ctx->stats.batch_sysmem;
case FD_QUERY_BATCH_GMEM:
return ctx->stats.batch_gmem;
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_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
}
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:
{
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_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;
}
}
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);
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);
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();
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);
}
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);
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();
sq->end_time = os_time_get();
+ } else if (is_draw_rate_query(q)) {
+ sq->end_time = ctx->stats.draw_calls;
+ }
}
}
-static bool
ean
+static bool
fd_sw_get_query_result(struct fd_context *ctx, struct fd_query *q,
fd_sw_get_query_result(struct fd_context *ctx, struct fd_query *q,
- bool
ean
wait, union pipe_query_result *result)
+ bool wait, union pipe_query_result *result)
{
struct fd_sw_query *sq = fd_sw_query(q);
{
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;
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;
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;
}
return true;
@@
-136,7
+161,7
@@
static const struct fd_query_funcs sw_query_funcs = {
};
struct fd_query *
};
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;
{
struct fd_sw_query *sq;
struct fd_query *q;
@@
-148,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_TOTAL:
case FD_QUERY_BATCH_SYSMEM:
case FD_QUERY_BATCH_GMEM:
+ case FD_QUERY_BATCH_NONDRAW:
case FD_QUERY_BATCH_RESTORE:
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;
break;
default:
return NULL;