iris/query: enable amd performance monitors

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Mark Janes 2019-07-03 16:27:22 -07:00
parent 469af7fdc9
commit 9c597514d4

View 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;