freedreno/ir3: debug cleanup
[mesa.git] / src / gallium / drivers / freedreno / freedreno_query_sw.c
index 8d81698f31d0024cb2b113cf05d1e18d0e1f17a4..96bc814ccb1a27f5d99120320e76a737d23289f6 100644 (file)
@@ -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>
  *
@@ -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,63 +63,92 @@ 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 void
+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 bool
 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;
+       }
+       return true;
 }
 
 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 +162,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 +174,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;