X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=metrics.h;h=26de580d517066856133971fb5ac7641fb7559be;hb=43fa296375ee35d811b7fed4537312ce9d08feac;hp=2d93d908d39026cf1fd4b0b8fda9bd199d24f0ef;hpb=fac9c8c2d3bfc5e97f2fdcf90f8cbe3ac9b2c49e;p=fips diff --git a/metrics.h b/metrics.h index 2d93d90..26de580 100644 --- a/metrics.h +++ b/metrics.h @@ -22,33 +22,131 @@ #ifndef METRICS_H #define METRICS_H -/* Add a new counter to the metrics tracking state. +typedef enum +{ + METRICS_OP_ACCUM, + METRICS_OP_BUFFER_DATA, + METRICS_OP_BUFFER_SUB_DATA, + METRICS_OP_BITMAP, + METRICS_OP_BLIT_FRAMEBUFFER, + METRICS_OP_CLEAR, + METRICS_OP_CLEAR_BUFFER_DATA, + METRICS_OP_CLEAR_TEX_IMAGE, + METRICS_OP_COPY_PIXELS, + METRICS_OP_COPY_TEX_IMAGE, + METRICS_OP_DRAW_PIXELS, + METRICS_OP_GET_TEX_IMAGE, + METRICS_OP_READ_PIXELS, + METRICS_OP_TEX_IMAGE, + + /* METRICS_OP_SHADER must be last. + * + * All larger values for metrics_op_t are interpreted as: + * + * METRICS_OP_SHADER + shader_program_number + * + * to indicate a specific shader program. + */ + METRICS_OP_SHADER +} metrics_op_t; + +/* Timer query */ +typedef struct timer_query +{ + unsigned id; + + metrics_op_t op; + struct timer_query *next; +} timer_query_t; + +/* Performance-monitor query */ +typedef struct monitor +{ + unsigned id; + + metrics_op_t op; + struct monitor *next; +} monitor_t; + +typedef struct op_metrics +{ + /* This happens to also be the index into the + * ctx->op_metrics array currently + */ + metrics_op_t op; + double time_ns; + + double **counters; +} op_metrics_t; + +typedef struct metrics +{ + metrics_op_t op; + + /* GL_TIME_ELAPSED query for which glEndQuery has not yet + * been called. */ + unsigned timer_begun_id; + + /* GL_TIME_ELAPSED queries for which glEndQuery has been + * called, (but results have not yet been queried). */ + timer_query_t *timer_head; + timer_query_t *timer_tail; + + /* Performance monitor for which glEndPerfMonitorAMD has not + * yet been called. */ + unsigned monitor_begun_id; + + /* Performance monitors for which glEndPerfMonitorAMD has + * been called, (but results have not yet been queried). */ + monitor_t *monitor_head; + monitor_t *monitor_tail; + + int monitors_in_flight; + + unsigned num_op_metrics; + op_metrics_t *op_metrics; +} metrics_t; + +/* Initialize a metrics_t object for tracking metrics. */ +void +metrics_init (metrics_t *metrics); + +/* Cleanup a metrics_t object that's no longer needed. */ +void +metrics_fini (metrics_t *metrics); + +/* Start accumulating GPU time. * - * The value accumulated in this counter be accounted against the + * The time accumulated will be accounted against the * current program (as set with metrics_set_current_program). - * - * Returns: A counter ID suitable for use with metrics_counter_start - * and metrics_counter_stop. */ -unsigned -metrics_counter_new (void); - -/* Start accumulating GPU time spent into the given counter. */ void -metrics_counter_start (unsigned counter); +metrics_counter_start (void); /* Stop accumulating GPU time (stops the most-recently started counter) */ void metrics_counter_stop (void); -/* Set the ID of the currently executing shader program. +/* Set a metrics_op_t value to indicate what kind of operation is + * being performed. + * + * The metrics-tracking code will account for timings by accumulating + * measured counter values into a separate counter for each + * metrics_op_t value, (so that the report can describe which + * operations are the most expensive). * - * The metrics-tracking code will account for per-shader-program - * timings by accumulating counter values measured while each porogram - * is active (see metrics_add_counter). + * In addition, for the value METRICS_OP_SHADER, each specific shader + * program can be distinguished. To accomplish this, pass a value of + * METRICS_OP_SHADER + shader_program_number to this function. */ void -metrics_set_current_program (unsigned program); +metrics_set_current_op (metrics_op_t op); + +/* Return the current metrics_op_t value, (the value most-recently-set + * with a call to metrics_set_current_op). + */ +metrics_op_t +metrics_get_current_op (void); /* Should be called at the end of every function wrapper for a * function that ends a frame, (glXSwapBuffers and similar). @@ -59,4 +157,18 @@ metrics_set_current_program (unsigned program); void metrics_end_frame (void); +/* Process outstanding metrics requests, accumulating results. + * + * This function is called automatically by metrics_end_frame. + * + * During a frame, it may be important to call this function to avoid + * too many oustanding timer/performance-monitor queries. At the same + * time, it's important not to call this function too frequently, + * since collection of metrics information will result in flushes of + * the OpenGL pipeline which can interfere with the behavior being + * measured. + */ +void +metrics_collect_available (void); + #endif