iris/query: enable amd performance monitors
authorMark Janes <mark.a.janes@intel.com>
Wed, 3 Jul 2019 23:27:22 +0000 (16:27 -0700)
committerMark Janes <mark.a.janes@intel.com>
Sat, 10 Aug 2019 02:28:34 +0000 (19:28 -0700)
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/gallium/drivers/iris/iris_query.c

index a50b47418df7aaf4e3aebbca5f924ce56163e854..c5ebf6b59bd9a74e0062117733d07569e0f79d08 100644 (file)
@@ -43,6 +43,7 @@
 #include "iris_context.h"
 #include "iris_defines.h"
 #include "iris_fence.h"
+#include "iris_monitor.h"
 #include "iris_resource.h"
 #include "iris_screen.h"
 
@@ -439,6 +440,7 @@ iris_create_query(struct pipe_context *ctx,
 
    q->type = query_type;
    q->index = index;
+   q->monitor = NULL;
 
    if (q->type == PIPE_QUERY_PIPELINE_STATISTICS_SINGLE &&
        q->index == PIPE_STAT_QUERY_CS_INVOCATIONS)
@@ -448,12 +450,35 @@ iris_create_query(struct pipe_context *ctx,
    return (struct pipe_query *) q;
 }
 
+static struct pipe_query *
+iris_create_batch_query(struct pipe_context *ctx,
+                        unsigned num_queries,
+                        unsigned *query_types)
+{
+   struct iris_context *ice = (void *) ctx;
+   struct iris_query *q = calloc(1, sizeof(struct iris_query));
+   if (unlikely(!q))
+      return NULL;
+   q->type = PIPE_QUERY_DRIVER_SPECIFIC;
+   q->index = -1;
+   q->monitor = iris_create_monitor_object(ice, num_queries, query_types);
+   if (unlikely(!q->monitor))
+      return NULL;
+
+   return (struct pipe_query *) q;
+}
+
 static void
 iris_destroy_query(struct pipe_context *ctx, struct pipe_query *p_query)
 {
    struct iris_query *query = (void *) p_query;
    struct iris_screen *screen = (void *) ctx->screen;
-   iris_syncpt_reference(screen, &query->syncpt, NULL);
+   if (query->monitor) {
+      iris_destroy_monitor_object(ctx, query->monitor);
+      query->monitor = NULL;
+   } else {
+      iris_syncpt_reference(screen, &query->syncpt, NULL);
+   }
    free(query);
 }
 
@@ -463,6 +488,10 @@ iris_begin_query(struct pipe_context *ctx, struct pipe_query *query)
 {
    struct iris_context *ice = (void *) ctx;
    struct iris_query *q = (void *) query;
+
+   if (q->monitor)
+      return iris_begin_monitor(ctx, q->monitor);
+
    void *ptr = NULL;
    uint32_t size;
 
@@ -508,6 +537,10 @@ iris_end_query(struct pipe_context *ctx, struct pipe_query *query)
 {
    struct iris_context *ice = (void *) ctx;
    struct iris_query *q = (void *) query;
+
+   if (q->monitor)
+      return iris_end_monitor(ctx, q->monitor);
+
    struct iris_batch *batch = &ice->batches[q->batch_idx];
 
    if (q->type == PIPE_QUERY_TIMESTAMP) {
@@ -559,6 +592,10 @@ iris_get_query_result(struct pipe_context *ctx,
 {
    struct iris_context *ice = (void *) ctx;
    struct iris_query *q = (void *) query;
+
+   if (q->monitor)
+      return iris_get_monitor_result(ctx, q->monitor, wait, result->batch);
+
    struct iris_screen *screen = (void *) ctx->screen;
    const struct gen_device_info *devinfo = &screen->devinfo;
 
@@ -812,6 +849,7 @@ genX(init_query)(struct iris_context *ice)
    struct pipe_context *ctx = &ice->ctx;
 
    ctx->create_query = iris_create_query;
+   ctx->create_batch_query = iris_create_batch_query;
    ctx->destroy_query = iris_destroy_query;
    ctx->begin_query = iris_begin_query;
    ctx->end_query = iris_end_query;