core: don't request vblank events when we are not rendering

Previously everytime we receive a vblank event, we always request a new
one. This made the logic somewhat simpler. But this generated many
useless vblank events, and wasted power. We only need vblank events for
two things:

1. after we rendered a frame, we need to know when it has been displayed
   on the screen.
2. estimating the refresh rate.

This commit makes sure we only request vblank events when it's actually
needed.

Fixes #1079

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
Yuxuan Shui
2023-07-05 05:53:21 +01:00
parent 580889488f
commit 2bc180c2a7
5 changed files with 94 additions and 35 deletions

View File

@@ -227,6 +227,9 @@ typedef struct session {
bool first_frame;
/// Whether screen has been turned off
bool screen_is_off;
/// We asked X server to send us a event for the end of a vblank, and we haven't
/// received one yet.
bool vblank_event_requested;
/// Event context for X Present extension.
uint32_t present_event_id;
xcb_special_event_t *present_event;