radeonsi: use shader_info::cs::local_size_variable to clean up some code
[mesa.git] / src / gallium / drivers / etnaviv / etnaviv_query.c
index 2d257a9d34f99bbaa5a45d4930fd6547956c04a1..01ec3bebc8e5d1ac59058126eb1acb00c1e8b7d6 100644 (file)
@@ -29,8 +29,9 @@
 #include "util/u_inlines.h"
 
 #include "etnaviv_context.h"
+#include "etnaviv_perfmon.h"
 #include "etnaviv_query.h"
-#include "etnaviv_query_hw.h"
+#include "etnaviv_query_acc.h"
 #include "etnaviv_query_sw.h"
 
 static struct pipe_query *
@@ -42,7 +43,7 @@ etna_create_query(struct pipe_context *pctx, unsigned query_type,
 
    q = etna_sw_create_query(ctx, query_type);
    if (!q)
-      q = etna_hw_create_query(ctx, query_type);
+      q = etna_acc_create_query(ctx, query_type);
 
    return (struct pipe_query *)q;
 }
@@ -55,19 +56,14 @@ etna_destroy_query(struct pipe_context *pctx, struct pipe_query *pq)
    q->funcs->destroy_query(etna_context(pctx), q);
 }
 
-static boolean
+static bool
 etna_begin_query(struct pipe_context *pctx, struct pipe_query *pq)
 {
    struct etna_query *q = etna_query(pq);
-   boolean ret;
-
-   if (q->active)
-      return false;
 
-   ret = q->funcs->begin_query(etna_context(pctx), q);
-   q->active = ret;
+   q->funcs->begin_query(etna_context(pctx), q);
 
-   return ret;
+   return true;
 }
 
 static bool
@@ -75,24 +71,17 @@ etna_end_query(struct pipe_context *pctx, struct pipe_query *pq)
 {
    struct etna_query *q = etna_query(pq);
 
-   if (!q->active)
-      return false;
-
    q->funcs->end_query(etna_context(pctx), q);
-   q->active = false;
 
    return true;
 }
 
-static boolean
+static bool
 etna_get_query_result(struct pipe_context *pctx, struct pipe_query *pq,
-                      boolean wait, union pipe_query_result *result)
+                      bool wait, union pipe_query_result *result)
 {
    struct etna_query *q = etna_query(pq);
 
-   if (q->active)
-      return false;
-
    util_query_clear_result(result, q->type);
 
    return q->funcs->get_query_result(etna_context(pctx), q, wait, result);
@@ -103,11 +92,15 @@ etna_get_driver_query_info(struct pipe_screen *pscreen, unsigned index,
                            struct pipe_driver_query_info *info)
 {
    int nr_sw_queries = etna_sw_get_driver_query_info(pscreen, 0, NULL);
+   int nr_pm_queries = etna_pm_get_driver_query_info(pscreen, 0, NULL);
 
    if (!info)
-      return nr_sw_queries;
+      return nr_sw_queries + nr_pm_queries;
+
+   if (index < nr_sw_queries)
+      return etna_sw_get_driver_query_info(pscreen, index, info);
 
-   return etna_sw_get_driver_query_info(pscreen, index, info);
+   return etna_pm_get_driver_query_info(pscreen, index - nr_sw_queries, info);
 }
 
 static int
@@ -115,16 +108,29 @@ etna_get_driver_query_group_info(struct pipe_screen *pscreen, unsigned index,
                                  struct pipe_driver_query_group_info *info)
 {
    int nr_sw_groups = etna_sw_get_driver_query_group_info(pscreen, 0, NULL);
+   int nr_pm_groups = etna_pm_get_driver_query_group_info(pscreen, 0, NULL);
 
    if (!info)
-      return nr_sw_groups;
+      return nr_sw_groups + nr_pm_groups;
+
+   if (index < nr_sw_groups)
+      return etna_sw_get_driver_query_group_info(pscreen, index, info);
 
-   return etna_sw_get_driver_query_group_info(pscreen, index, info);
+   return etna_pm_get_driver_query_group_info(pscreen, index, info);
 }
 
 static void
-etna_set_active_query_state(struct pipe_context *pipe, boolean enable)
+etna_set_active_query_state(struct pipe_context *pctx, bool enable)
 {
+   struct etna_context *ctx = etna_context(pctx);
+
+   if (enable) {
+      list_for_each_entry(struct etna_acc_query, aq, &ctx->active_acc_queries, node)
+         etna_acc_query_resume(aq, ctx);
+   } else {
+      list_for_each_entry(struct etna_acc_query, aq, &ctx->active_acc_queries, node)
+         etna_acc_query_suspend(aq, ctx);
+   }
 }
 
 void