a4xx: add noperspective interpolation support
[mesa.git] / src / gallium / drivers / freedreno / freedreno_query_sw.c
index 50965161146ea6da83b55e32b840e83b620a7659..2164ad55e2e9aa892ab40bfa86a60e24f2219db2 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>
  *
@@ -65,34 +63,61 @@ 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 boolean
+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 void
 fd_sw_begin_query(struct fd_context *ctx, struct fd_query *q)
 {
        struct fd_sw_query *sq = fd_sw_query(q);
        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
@@ -100,22 +125,29 @@ fd_sw_end_query(struct fd_context *ctx, struct fd_query *q)
 {
        struct fd_sw_query *sq = fd_sw_query(q);
        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);
 
        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;
@@ -129,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;
@@ -141,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;