aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2021-12-23 16:30:24 +0100
committerSimon Ser <contact@emersion.fr>2021-12-23 17:00:28 +0100
commit812951f5bc47f502429406e49f4e24f377b7799b (patch)
tree87308ace0d3a15ee0f2a8fa66632e604fa14d741
parent823476e76ed166762095330a8f51eabc825febff (diff)
scene: schedule an output frame on wl_surface.frame
Some clients (e.g. mpv, Firefox) request a new wl_surface.frame callback without damaging their surface. When this happens, schedule a new output frame. Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3350
-rw-r--r--types/scene/wlr_scene.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/types/scene/wlr_scene.c b/types/scene/wlr_scene.c
index 7b550963..a0c06b6b 100644
--- a/types/scene/wlr_scene.c
+++ b/types/scene/wlr_scene.c
@@ -236,10 +236,6 @@ static void scene_surface_handle_surface_commit(struct wl_listener *listener,
wl_container_of(listener, scene_surface, surface_commit);
struct wlr_surface *surface = scene_surface->surface;
- if (!pixman_region32_not_empty(&surface->buffer_damage)) {
- return;
- }
-
struct wlr_scene *scene = scene_node_get_root(&scene_surface->node);
int lx, ly;
@@ -256,6 +252,17 @@ static void scene_surface_handle_surface_commit(struct wl_listener *listener,
return;
}
+ // Even if the surface hasn't submitted damage, schedule a new frame if
+ // the client has requested a wl_surface.frame callback.
+ if (!wl_list_empty(&surface->current.frame_callback_list) &&
+ scene_surface->primary_output != NULL) {
+ wlr_output_schedule_frame(scene_surface->primary_output);
+ }
+
+ if (!pixman_region32_not_empty(&surface->buffer_damage)) {
+ return;
+ }
+
struct wlr_scene_output *scene_output;
wl_list_for_each(scene_output, &scene->outputs, link) {
struct wlr_output *output = scene_output->output;