mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2025-12-20 12:50:11 +01:00
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>
This commit is contained in:
parent
d70e712c2f
commit
a24a326bb1
1 changed files with 20 additions and 1 deletions
|
|
@ -88,6 +88,7 @@ struct pipewire_output {
|
||||||
struct wl_event_source *finish_frame_timer;
|
struct wl_event_source *finish_frame_timer;
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
bool submitted_frame;
|
bool submitted_frame;
|
||||||
|
enum dpms_enum dpms;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pipewire_frame_data {
|
struct pipewire_frame_data {
|
||||||
|
|
@ -317,7 +318,11 @@ pipewire_output_finish_frame_handler(void *data)
|
||||||
api->finish_frame(output->output, &now, 0);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -355,6 +360,18 @@ pipewire_output_start_repaint_loop(struct weston_output *base_output)
|
||||||
return 0;
|
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
|
static int
|
||||||
pipewire_output_connect(struct pipewire_output *output)
|
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;
|
output->saved_start_repaint_loop = base_output->start_repaint_loop;
|
||||||
base_output->start_repaint_loop = pipewire_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);
|
loop = wl_display_get_event_loop(c->wl_display);
|
||||||
output->finish_frame_timer =
|
output->finish_frame_timer =
|
||||||
wl_event_loop_add_timer(loop,
|
wl_event_loop_add_timer(loop,
|
||||||
pipewire_output_finish_frame_handler,
|
pipewire_output_finish_frame_handler,
|
||||||
output);
|
output);
|
||||||
|
output->dpms = WESTON_DPMS_ON;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue