u/trace_marker: Add render timing support

This commit is contained in:
Jakob Bornecrantz 2021-04-09 17:36:49 +01:00 committed by Jakob Bornecrantz
parent 52d1c4d834
commit c750447add
3 changed files with 76 additions and 3 deletions
src/xrt

View file

@ -12,8 +12,9 @@
#include "util/u_time.h"
#include "util/u_misc.h"
#include "util/u_debug.h"
#include "util/u_logging.h"
#include "util/u_timing.h"
#include "util/u_logging.h"
#include "util/u_trace_marker.h"
#include <stdio.h>
#include <assert.h>
@ -315,9 +316,13 @@ rt_mark_delivered(struct u_render_timing *urt, int64_t frame_id)
uint64_t now_ns = os_monotonic_get_ns();
// Update all data.
f->when.delivered_ns = now_ns;
f->state = U_RT_READY;
f->frame_id = -1;
/*
* Process data.
*/
int64_t diff_ns = f->predicted_delivery_time_ns - now_ns;
bool late = false;
@ -343,6 +348,13 @@ rt_mark_delivered(struct u_render_timing *urt, int64_t frame_id)
do_iir_filter(&rt->app.cpu_time_ns, IIR_ALPHA_LT, IIR_ALPHA_GT, diff_cpu_ns);
do_iir_filter(&rt->app.draw_time_ns, IIR_ALPHA_LT, IIR_ALPHA_GT, diff_draw_ns);
// Trace the data.
COMP_TRACE_DATA(U_TRACE_DATA_TYPE_TIMING_RENDER, *f);
// Reset the frame.
f->state = U_RT_READY;
f->frame_id = -1;
}
static void
@ -394,3 +406,55 @@ u_rt_create(struct u_render_timing **out_urt)
return XRT_SUCCESS;
}
/*
*
* Tracing data.
*
*/
#define PID_NR 43
#define TID_ESTIMATED_CPU 20
#define TID_ESTIMATED_DRAW 21
#define TID_ACTUAL_CPU 22
#define TID_ACTUAL_DRAW 23
static void
trace_begin_id(FILE *file, uint32_t tid, const char *name, int64_t frame_id, const char *cat, uint64_t when_ns)
{
char temp[256];
snprintf(temp, sizeof(temp), "%s %" PRIi64, name, frame_id);
u_trace_maker_write_json_begin(file, PID_NR, tid, temp, cat, when_ns);
}
static void
trace_end(FILE *file, uint32_t tid, uint64_t when_ns)
{
u_trace_maker_write_json_end(file, PID_NR, tid, when_ns);
}
void
u_rt_write_json_metadata(FILE *file)
{
u_trace_maker_write_json_metadata(file, PID_NR, TID_ESTIMATED_CPU, "1 CPU estimated");
u_trace_maker_write_json_metadata(file, PID_NR, TID_ESTIMATED_DRAW, "2 Draw estimated");
u_trace_maker_write_json_metadata(file, PID_NR, TID_ACTUAL_CPU, "1 CPU actual");
u_trace_maker_write_json_metadata(file, PID_NR, TID_ACTUAL_DRAW, "2 Draw actual");
}
void
u_rt_write_json(FILE *file, void *data)
{
struct u_rt_frame *f = (struct u_rt_frame *)data;
trace_begin_id(file, TID_ACTUAL_CPU, "sleep", f->frame_id, "sleep", f->when.predicted_ns);
trace_end(file, TID_ACTUAL_CPU, f->when.wait_woke_ns);
trace_begin_id(file, TID_ACTUAL_CPU, "cpu", f->frame_id, "cpu", f->when.wait_woke_ns);
trace_end(file, TID_ACTUAL_CPU, f->when.begin_ns);
trace_begin_id(file, TID_ACTUAL_DRAW, "draw", f->frame_id, "draw", f->when.begin_ns);
trace_end(file, TID_ACTUAL_DRAW, f->when.delivered_ns);
}

View file

@ -24,6 +24,7 @@ extern "C" {
enum u_trace_data_type
{
U_TRACE_DATA_TYPE_TIMING_FRAME,
U_TRACE_DATA_TYPE_TIMING_RENDER,
};
void
@ -89,6 +90,12 @@ u_ft_write_json(FILE *file, void *data);
void
u_ft_write_json_metadata(FILE *file);
void
u_rt_write_json(FILE *file, void *data);
void
u_rt_write_json_metadata(FILE *file);
/*
*

View file

@ -141,6 +141,7 @@ handle_data(const char *rest_of_line, size_t len)
switch (type) {
case U_TRACE_DATA_TYPE_TIMING_FRAME: u_ft_write_json(t.file, (void *)data); break;
case U_TRACE_DATA_TYPE_TIMING_RENDER: u_rt_write_json(t.file, (void *)data); break;
default: fprintf(stderr, "%.*s\n", (int)len, rest_of_line); break;
}
}
@ -269,6 +270,7 @@ trace_pipe(int argc, const char **argv)
json_w_header();
u_ft_write_json_metadata(t.file);
u_rt_write_json_metadata(t.file);
P(" :: Looping\n");