Files
u-boot/include/expo_test.h
Simon Glass aa83cf00ce expo: Expand timing to include render and poll
Provide more timing information for expo operation, including the time
taken to:

- render the scene
- sync the framebuffer to the display
- poll for keyboard / mouse input

These are averages calculated over the past second.

Update the documentation to mention these features.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-10-07 10:54:13 +00:00

182 lines
4.4 KiB
C

/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Copyright Canonical Ltd
* Written by Simon Glass <sjg@chromium.org>
*/
#ifndef __EXPO_TEST_H
#define __EXPO_TEST_H
struct expo;
/* Number of seconds to average FPS over in test mode */
#define EXPO_FPS_AVG_SECONDS 5
/**
* struct expo_test_mode - Test mode information for expo
*
* @enabled: true if test mode is enabled
* @start_time_ms: Time when expo_enter_mode() was called (milliseconds)
* @render_count: Number of calls to expo_render() since expo_enter_mode()
* @fps_timestamps_ms: Timestamps for FPS calculation (milliseconds)
* @fps_frame_counts: Frame counts at each timestamp
* @fps_index: Current index in the FPS tracking arrays
* @fps_last: Last calculated FPS value
* @last_update: Time of last FPS update (milliseconds)
* @base_time_us: Base time in microseconds for delta calculations
* @render_delta_us: Time between update and render in microseconds
* @sync_delta_us: Time taken by video_manual_sync() in microseconds
* @poll_delta_us: Time taken by expo_poll() in microseconds
* @render_total_us: Cumulative render time in current second (us)
* @sync_total_us: Cumulative sync time in current second (us)
* @poll_total_us: Cumulative poll time in current second (us)
* @frame_count_last_sec: Number of frames in current measurement second
* @render_avg_us: Average render time over last second (microseconds)
* @sync_avg_us: Average sync time over last second (microseconds)
* @poll_avg_us: Average poll time over last second (microseconds)
*/
struct expo_test_mode {
bool enabled;
ulong start_time_ms;
int render_count;
ulong fps_timestamps_ms[EXPO_FPS_AVG_SECONDS];
int fps_frame_counts[EXPO_FPS_AVG_SECONDS];
int fps_index;
int fps_last;
ulong last_update;
ulong base_time_us;
ulong render_delta_us;
ulong sync_delta_us;
ulong poll_delta_us;
ulong render_total_us;
ulong sync_total_us;
ulong poll_total_us;
int frame_count_last_sec;
ulong render_avg_us;
ulong sync_avg_us;
ulong poll_avg_us;
};
#if CONFIG_IS_ENABLED(EXPO_TEST)
/**
* expo_test_init() - Initialize test mode for an expo
*
* @exp: Expo to initialize test mode for
* Return: 0 if OK, -ve on error
*/
int expo_test_init(struct expo *exp);
/**
* expo_test_uninit() - Uninitialize test mode for an expo
*
* @exp: Expo to uninitialize test mode for
*/
void expo_test_uninit(struct expo *exp);
/**
* expo_test_checkenv() - Check environment and reset test mode
*
* @exp: Expo to update test mode for
*
* Checks the expotest environment variable and updates the enabled flag
* accordingly. Also resets the render count to 0.
*/
void expo_test_checkenv(struct expo *exp);
/**
* expo_test_mark() - Mark the current time for delta calculations
*
* @exp: Expo to update test mode for
*
* Records the current time in microseconds as the base time for subsequent
* delta calculations
*/
void expo_test_mark(struct expo *exp);
/**
* expo_test_update() - Update test mode counters
*
* @exp: Expo to update test mode for
*/
void expo_test_update(struct expo *exp);
/**
* expo_test_poll() - Calculate poll delta time
*
* @exp: Expo to update test mode for
*
* Calculates the time taken by expo_poll() based on the base time
*/
void expo_test_poll(struct expo *exp);
/**
* expo_test_sync() - Calculate sync delta time
*
* @exp: Expo to update test mode for
*
* Calculates the time taken by video_manual_sync() based on the base time
*/
void expo_test_sync(struct expo *exp);
/**
* expo_test_render() - Render test mode information
*
* @exp: Expo to render test info for
* Return: 0 if OK, -ve on error
*/
int expo_test_render(struct expo *exp);
/**
* expo_calc_fps() - Calculate FPS based on recent frame history
*
* @test: Test mode data containing frame history
* Return: Calculated FPS value, or 0 if insufficient data
*/
int expo_calc_fps(struct expo_test_mode *test);
#else
static inline int expo_test_init(struct expo *exp)
{
return 0;
}
static inline void expo_test_uninit(struct expo *exp)
{
}
static inline void expo_test_checkenv(struct expo *exp)
{
}
static inline void expo_test_mark(struct expo *exp)
{
}
static inline void expo_test_update(struct expo *exp)
{
}
static inline void expo_test_poll(struct expo *exp)
{
}
static inline void expo_test_sync(struct expo *exp)
{
}
static inline int expo_test_render(struct expo *exp)
{
return 0;
}
static inline int expo_calc_fps(struct expo_test_mode *test)
{
return 0;
}
#endif /* EXPO_TEST */
#endif /* __EXPO_TEST_H */