diff options
author | Michael Olbrich <m.olbrich@pengutronix.de> | 2020-08-19 08:43:15 +0200 |
---|---|---|
committer | Michael Olbrich <m.olbrich@pengutronix.de> | 2020-08-19 08:50:45 +0200 |
commit | a24a326bb19ec53d7405fc2ed474de99a111e289 (patch) | |
tree | 2e3df9d822168ba44c3e57efea84941e1cdcc91c /pipewire | |
parent | d70e712c2f63c5af7483ea5053e57bfa83d7d7e7 (diff) | |
download | weston-a24a326bb19ec53d7405fc2ed474de99a111e289.tar.gz |
pipewire: implement DPMS
Pipewire doesn't need to wait for any hardware. The finish_frame() callback is
just artifically delayed to generate the desired framerate.
So when the DPMS level changes, we can just call finish_frame() immediately if
necessary and cancel the timer.
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
Diffstat (limited to 'pipewire')
-rw-r--r-- | pipewire/pipewire-plugin.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/pipewire/pipewire-plugin.c b/pipewire/pipewire-plugin.c index 9c75a783..6f892574 100644 --- a/pipewire/pipewire-plugin.c +++ b/pipewire/pipewire-plugin.c @@ -88,6 +88,7 @@ struct pipewire_output { struct wl_event_source *finish_frame_timer; struct wl_list link; bool submitted_frame; + enum dpms_enum dpms; }; struct pipewire_frame_data { @@ -317,7 +318,11 @@ pipewire_output_finish_frame_handler(void *data) api->finish_frame(output->output, &now, 0); } - pipewire_output_timer_update(output); + if (output->dpms == WESTON_DPMS_ON) + pipewire_output_timer_update(output); + else + wl_event_source_timer_update(output->finish_frame_timer, 0); + return 0; } @@ -355,6 +360,18 @@ pipewire_output_start_repaint_loop(struct weston_output *base_output) return 0; } +static void +pipewire_set_dpms(struct weston_output *base_output, enum dpms_enum level) +{ + struct pipewire_output *output = lookup_pipewire_output(base_output); + + if (output->dpms == level) + return; + + output->dpms = level; + pipewire_output_finish_frame_handler(output); +} + static int pipewire_output_connect(struct pipewire_output *output) { @@ -420,12 +437,14 @@ pipewire_output_enable(struct weston_output *base_output) output->saved_start_repaint_loop = base_output->start_repaint_loop; base_output->start_repaint_loop = pipewire_output_start_repaint_loop; + base_output->set_dpms = pipewire_set_dpms; loop = wl_display_get_event_loop(c->wl_display); output->finish_frame_timer = wl_event_loop_add_timer(loop, pipewire_output_finish_frame_handler, output); + output->dpms = WESTON_DPMS_ON; return 0; } |