X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=context.h;h=70e24981024367b6ec54392ba3abdb4629f8bca3;hb=07bf218026f6921c0b62714df9ec441b24884537;hp=941f4f04b95eccf7762d565d707f9a2d4d1b3def;hpb=076c1c37c1fc8bf3e56a615adfb4c38542cbd4c5;p=fips diff --git a/context.h b/context.h index 941f4f0..70e2498 100644 --- a/context.h +++ b/context.h @@ -27,65 +27,6 @@ #include "fips-dispatch.h" -/* 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 context -{ - metrics_info_t metrics_info; - - 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; -} context_t; - /* Indicate that a new context has come into use. * * Here, 'system_context_id' is a pointer to a system context (such as @@ -103,8 +44,54 @@ context_enter (fips_api_t api, void *system_context_id); void context_leave (void); -/* Get the current context. */ -context_t * -context_get_current (void); +/* Start accumulating GPU time. + * + * The time accumulated will be accounted against the + * current operation (as set with context_set_current_op). + */ +void +context_counter_start (void); + +/* Stop accumulating GPU time (stops the most-recently started counter) */ +void +context_counter_stop (void); + +/* 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). + * + * 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 +context_set_current_op (metrics_op_t op); + +/* Return the current metrics_op_t value, (the value most-recently-set + * with a call to context_set_current_op). + */ +metrics_op_t +context_get_current_op (void); + +/* This pair of functions can be used to indicate a frame end. + * + * Both functions should be by every function wrapper for a function + * that ends a frame, (glXSwapBuffers and similar). The pre_swap + * before the call to the underlying swap function, and post_swap + * after. + * + * These functions trigger whatever bookkeeping is necessary to + * generate a timing report, (such as collecting any outstanding timer + * query values), and will also emit those reports when necessary. + */ +void +context_end_frame_pre_swap (void); + +void +context_end_frame_post_swap (void); #endif