core: add debug options to override the vblank scheduler

Useful for debugging.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
Yuxuan Shui
2023-12-18 21:14:29 +00:00
parent e7c00108d1
commit ffaa42a019
3 changed files with 17 additions and 7 deletions

View File

@@ -623,11 +623,13 @@ struct debug_options_entry {
size_t offset;
};
// clang-format off
static const char *vblank_scheduler_choices[] = { "present", "sgi_video_sync", NULL };
static const struct debug_options_entry debug_options_entries[] = {
"smart_frame_pacing",
NULL,
offsetof(struct debug_options, smart_frame_pacing),
{"smart_frame_pacing", NULL, offsetof(struct debug_options, smart_frame_pacing)},
{"force_vblank_sched", vblank_scheduler_choices, offsetof(struct debug_options, force_vblank_scheduler)},
};
// clang-format on
void parse_debug_option_single(char *setting, struct debug_options *debug_options) {
char *equal = strchr(setting, '=');
@@ -667,7 +669,9 @@ void parse_debug_option_single(char *setting, struct debug_options *debug_option
/// Parse debug options from environment variable `PICOM_DEBUG`.
void parse_debug_options(struct debug_options *debug_options) {
const char *debug = getenv("PICOM_DEBUG");
const struct debug_options default_debug_options = {};
const struct debug_options default_debug_options = {
.force_vblank_scheduler = LAST_VBLANK_SCHEDULER,
};
*debug_options = default_debug_options;
if (!debug) {

View File

@@ -88,6 +88,8 @@ struct debug_options {
/// Try to reduce frame latency by using vblank interval and render time
/// estimates. Right now it's not working well across drivers.
int smart_frame_pacing;
/// Override the vblank scheduler chosen by the compositor.
int force_vblank_scheduler;
};
/// Structure representing all options.

View File

@@ -1489,9 +1489,13 @@ static bool redirect_start(session_t *ps) {
ps->last_msc = 0;
ps->last_schedule_delay = 0;
render_statistics_reset(&ps->render_stats);
ps->vblank_scheduler =
vblank_scheduler_new(ps->loop, &ps->c, session_get_target_window(ps),
PRESENT_VBLANK_SCHEDULER);
enum vblank_scheduler_type scheduler_type = PRESENT_VBLANK_SCHEDULER;
if (ps->o.debug_options.force_vblank_scheduler != LAST_VBLANK_SCHEDULER) {
scheduler_type =
(enum vblank_scheduler_type)ps->o.debug_options.force_vblank_scheduler;
}
ps->vblank_scheduler = vblank_scheduler_new(
ps->loop, &ps->c, session_get_target_window(ps), scheduler_type);
if (!ps->vblank_scheduler) {
return false;
}