diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index e71d9754b1e..eda56974409 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -3985,6 +3985,8 @@ panfrost_draw_vbo(struct pipe_context *pipe, if (!panfrost_render_condition_check(ctx)) return; + ctx->draw_calls++; + /* Emulate indirect draws unless we're using the experimental path */ if ((!(dev->debug & PAN_DBG_INDIRECT) || !PAN_GPU_INDIRECTS) && indirect && indirect->buffer) { assert(num_draws == 1); diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index 2dc067ab0a7..97b5905796f 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -645,6 +645,10 @@ panfrost_begin_query(struct pipe_context *pipe, struct pipe_query *q) query->start = ctx->tf_prims_generated; break; + case PAN_QUERY_DRAW_CALLS: + query->start = ctx->draw_calls; + break; + default: /* TODO: timestamp queries, etc? */ break; @@ -672,6 +676,9 @@ panfrost_end_query(struct pipe_context *pipe, struct pipe_query *q) case PIPE_QUERY_PRIMITIVES_EMITTED: query->end = ctx->tf_prims_generated; break; + case PAN_QUERY_DRAW_CALLS: + query->end = ctx->draw_calls; + break; } return true; @@ -719,6 +726,10 @@ panfrost_get_query_result(struct pipe_context *pipe, vresult->u64 = query->end - query->start; break; + case PAN_QUERY_DRAW_CALLS: + vresult->u64 = query->end - query->start; + break; + default: /* TODO: more queries */ break; diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h index 474d78506aa..0ec7b465c15 100644 --- a/src/gallium/drivers/panfrost/pan_context.h +++ b/src/gallium/drivers/panfrost/pan_context.h @@ -165,6 +165,7 @@ struct panfrost_context { bool active_queries; uint64_t prims_generated; uint64_t tf_prims_generated; + uint64_t draw_calls; struct panfrost_query *occlusion_query; bool indirect_draw; diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c index a3855f9302e..4de835804fa 100644 --- a/src/gallium/drivers/panfrost/pan_screen.c +++ b/src/gallium/drivers/panfrost/pan_screen.c @@ -869,6 +869,24 @@ panfrost_get_disk_shader_cache(struct pipe_screen *pscreen) return pan_screen(pscreen)->disk_cache; } +int +panfrost_get_driver_query_info(struct pipe_screen *pscreen, unsigned index, + struct pipe_driver_query_info *info) +{ + int num_queries = ARRAY_SIZE(panfrost_driver_query_list); + + if (!info) + return num_queries; + + if (index >= num_queries) + return 0; + + *info = panfrost_driver_query_list[index]; + + return 1; +} + + struct pipe_screen * panfrost_create_screen(int fd, struct renderonly *ro) { @@ -901,6 +919,7 @@ panfrost_create_screen(int fd, struct renderonly *ro) screen->base.get_name = panfrost_get_name; screen->base.get_vendor = panfrost_get_vendor; screen->base.get_device_vendor = panfrost_get_device_vendor; + screen->base.get_driver_query_info = panfrost_get_driver_query_info; screen->base.get_param = panfrost_get_param; screen->base.get_shader_param = panfrost_get_shader_param; screen->base.get_compute_param = panfrost_get_compute_param; diff --git a/src/gallium/drivers/panfrost/pan_screen.h b/src/gallium/drivers/panfrost/pan_screen.h index e131a9cbeef..79211a3aa74 100644 --- a/src/gallium/drivers/panfrost/pan_screen.h +++ b/src/gallium/drivers/panfrost/pan_screen.h @@ -42,6 +42,12 @@ #include "pan_device.h" #include "pan_mempool.h" +#define PAN_QUERY_DRAW_CALLS (PIPE_QUERY_DRIVER_SPECIFIC + 0) + +static const struct pipe_driver_query_info panfrost_driver_query_list[] = { + {"draw-calls", PAN_QUERY_DRAW_CALLS, { 0 }}, +}; + struct panfrost_batch; struct panfrost_context; struct panfrost_resource; @@ -126,6 +132,10 @@ pan_device(struct pipe_screen *p) struct pipe_fence_handle * panfrost_fence_create(struct panfrost_context *ctx); +int +panfrost_get_driver_query_info(struct pipe_screen *pscreen, unsigned index, + struct pipe_driver_query_info *info); + void panfrost_cmdstream_screen_init_v4(struct panfrost_screen *screen); void panfrost_cmdstream_screen_init_v5(struct panfrost_screen *screen); void panfrost_cmdstream_screen_init_v6(struct panfrost_screen *screen);