intel/perf: print debug information

INTEL_DEBUG=perfmon will iterate over the perf queries, printing
information about the state of each query.  Some of this information
will be private to intel/perf, and needs to a dump routine that can be
called from i965.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Mark Janes
2019-07-17 14:36:44 -07:00
parent a663c8c26e
commit 1f4f421ce0
3 changed files with 43 additions and 25 deletions

View File

@@ -2266,3 +2266,33 @@ gen_perf_get_query_data(struct gen_perf_context *perf_ctx,
if (bytes_written) if (bytes_written)
*bytes_written = written; *bytes_written = written;
} }
void
gen_perf_dump_query_count(struct gen_perf_context *perf_ctx)
{
DBG("Queries: (Open queries = %d, OA users = %d)\n",
perf_ctx->n_active_oa_queries, perf_ctx->n_oa_users);
}
void
gen_perf_dump_query(struct gen_perf_context *ctx,
struct gen_perf_query_object *obj,
void *current_batch)
{
switch (obj->queryinfo->kind) {
case GEN_PERF_QUERY_TYPE_OA:
case GEN_PERF_QUERY_TYPE_RAW:
DBG("BO: %-4s OA data: %-10s %-15s\n",
obj->oa.bo ? "yes," : "no,",
gen_perf_is_query_ready(ctx, obj, current_batch) ? "ready," : "not ready,",
obj->oa.results_accumulated ? "accumulated" : "not accumulated");
break;
case GEN_PERF_QUERY_TYPE_PIPELINE:
DBG("BO: %-4s\n",
obj->pipeline_stats.bo ? "yes" : "no");
break;
default:
unreachable("Unknown query type");
break;
}
}

View File

@@ -445,4 +445,9 @@ void gen_perf_get_query_data(struct gen_perf_context *perf_ctx,
unsigned *data, unsigned *data,
unsigned *bytes_written); unsigned *bytes_written);
void gen_perf_dump_query_count(struct gen_perf_context *perf_ctx);
void gen_perf_dump_query(struct gen_perf_context *perf_ctx,
struct gen_perf_query_object *obj,
void *current_batch);
#endif /* GEN_PERF_H */ #endif /* GEN_PERF_H */

View File

@@ -111,41 +111,24 @@ brw_is_perf_query_ready(struct gl_context *ctx,
static void static void
dump_perf_query_callback(GLuint id, void *query_void, void *brw_void) dump_perf_query_callback(GLuint id, void *query_void, void *brw_void)
{ {
struct gl_context *ctx = brw_void; struct brw_context *ctx = brw_void;
struct gen_perf_context *perf_ctx = &ctx->perf_ctx;
struct gl_perf_query_object *o = query_void; struct gl_perf_query_object *o = query_void;
struct brw_perf_query_object * brw_query = brw_perf_query(o); struct brw_perf_query_object * brw_query = brw_perf_query(o);
struct gen_perf_query_object *obj = brw_query->query; struct gen_perf_query_object *obj = brw_query->query;
switch (obj->queryinfo->kind) { DBG("%4d: %-6s %-8s ",
case GEN_PERF_QUERY_TYPE_OA: id,
case GEN_PERF_QUERY_TYPE_RAW: o->Used ? "Dirty," : "New,",
DBG("%4d: %-6s %-8s BO: %-4s OA data: %-10s %-15s\n", o->Active ? "Active," : (o->Ready ? "Ready," : "Pending,"));
id, gen_perf_dump_query(perf_ctx, obj, &ctx->batch);
o->Used ? "Dirty," : "New,",
o->Active ? "Active," : (o->Ready ? "Ready," : "Pending,"),
obj->oa.bo ? "yes," : "no,",
brw_is_perf_query_ready(ctx, o) ? "ready," : "not ready,",
obj->oa.results_accumulated ? "accumulated" : "not accumulated");
break;
case GEN_PERF_QUERY_TYPE_PIPELINE:
DBG("%4d: %-6s %-8s BO: %-4s\n",
id,
o->Used ? "Dirty," : "New,",
o->Active ? "Active," : (o->Ready ? "Ready," : "Pending,"),
obj->pipeline_stats.bo ? "yes" : "no");
break;
default:
unreachable("Unknown query type");
break;
}
} }
static void static void
dump_perf_queries(struct brw_context *brw) dump_perf_queries(struct brw_context *brw)
{ {
struct gl_context *ctx = &brw->ctx; struct gl_context *ctx = &brw->ctx;
DBG("Queries: (Open queries = %d, OA users = %d)\n", gen_perf_dump_query_count(&brw->perf_ctx);
brw->perf_ctx.n_active_oa_queries, brw->perf_ctx.n_oa_users);
_mesa_HashWalk(ctx->PerfQuery.Objects, dump_perf_query_callback, brw); _mesa_HashWalk(ctx->PerfQuery.Objects, dump_perf_query_callback, brw);
} }