aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-02-22 18:38:19 +0100
committerSimon Zeni <simon@bl4ckb0ne.ca>2023-02-22 13:37:44 -0500
commitc2ccc0c9d4726a2d1f23f1696c7b6aa0f6cb1a63 (patch)
treebd5c40f008c3f74dbe2c22ab047dc7b0721da51c
parentd6cb4fa8de1e540c58b58d29d1520df296e46d1f (diff)
Move output commit out of output_render()
That way output_render() only does what it says on the tin.
-rw-r--r--include/sway/output.h3
-rw-r--r--sway/desktop/output.c39
-rw-r--r--sway/desktop/render.c29
3 files changed, 38 insertions, 33 deletions
diff --git a/include/sway/output.h b/include/sway/output.h
index da625315..2aa1b278 100644
--- a/include/sway/output.h
+++ b/include/sway/output.h
@@ -112,8 +112,7 @@ bool output_has_opaque_overlay_layer_surface(struct sway_output *output);
struct sway_workspace *output_get_active_workspace(struct sway_output *output);
-void output_render(struct sway_output *output, struct timespec *when,
- pixman_region32_t *damage);
+void output_render(struct sway_output *output, pixman_region32_t *damage);
void output_surface_for_each_surface(struct sway_output *output,
struct wlr_surface *surface, double ox, double oy,
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 302f9fda..4b6e9122 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -517,13 +517,34 @@ static bool scan_out_fullscreen_view(struct sway_output *output,
return wlr_output_commit(wlr_output);
}
+static void get_frame_damage(struct sway_output *output,
+ pixman_region32_t *frame_damage) {
+ struct wlr_output *wlr_output = output->wlr_output;
+
+ int width, height;
+ wlr_output_transformed_resolution(wlr_output, &width, &height);
+
+ pixman_region32_init(frame_damage);
+
+ enum wl_output_transform transform =
+ wlr_output_transform_invert(wlr_output->transform);
+ wlr_region_transform(frame_damage, &output->damage_ring.current,
+ transform, width, height);
+
+ if (debug.damage != DAMAGE_DEFAULT) {
+ pixman_region32_union_rect(frame_damage, frame_damage,
+ 0, 0, wlr_output->width, wlr_output->height);
+ }
+}
+
static int output_repaint_timer_handler(void *data) {
struct sway_output *output = data;
- if (output->wlr_output == NULL) {
+ struct wlr_output *wlr_output = output->wlr_output;
+ if (wlr_output == NULL) {
return 0;
}
- output->wlr_output->frame_pending = false;
+ wlr_output->frame_pending = false;
struct sway_workspace *workspace = output->current.active_workspace;
if (workspace == NULL) {
@@ -575,10 +596,22 @@ static int output_repaint_timer_handler(void *data) {
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
- output_render(output, &now, &damage);
+ output_render(output, &damage);
pixman_region32_fini(&damage);
+ pixman_region32_t frame_damage;
+ get_frame_damage(output, &frame_damage);
+ wlr_output_set_damage(wlr_output, &frame_damage);
+ pixman_region32_fini(&frame_damage);
+
+ if (!wlr_output_commit(wlr_output)) {
+ return 0;
+ }
+
+ wlr_damage_ring_rotate(&output->damage_ring);
+ output->last_frame = now;
+
return 0;
}
diff --git a/sway/desktop/render.c b/sway/desktop/render.c
index dedaa967..a4d633e0 100644
--- a/sway/desktop/render.c
+++ b/sway/desktop/render.c
@@ -1029,8 +1029,7 @@ static void render_seatops(struct sway_output *output,
}
}
-void output_render(struct sway_output *output, struct timespec *when,
- pixman_region32_t *damage) {
+void output_render(struct sway_output *output, pixman_region32_t *damage) {
struct wlr_output *wlr_output = output->wlr_output;
struct wlr_renderer *renderer = output->server->renderer;
@@ -1184,30 +1183,4 @@ renderer_end:
wlr_renderer_scissor(renderer, NULL);
wlr_output_render_software_cursors(wlr_output, damage);
wlr_renderer_end(renderer);
-
- int width, height;
- wlr_output_transformed_resolution(wlr_output, &width, &height);
-
- pixman_region32_t frame_damage;
- pixman_region32_init(&frame_damage);
-
- enum wl_output_transform transform =
- wlr_output_transform_invert(wlr_output->transform);
- wlr_region_transform(&frame_damage, &output->damage_ring.current,
- transform, width, height);
-
- if (debug.damage != DAMAGE_DEFAULT) {
- pixman_region32_union_rect(&frame_damage, &frame_damage,
- 0, 0, wlr_output->width, wlr_output->height);
- }
-
- wlr_output_set_damage(wlr_output, &frame_damage);
- pixman_region32_fini(&frame_damage);
-
- if (!wlr_output_commit(wlr_output)) {
- return;
- }
-
- wlr_damage_ring_rotate(&output->damage_ring);
- output->last_frame = *when;
}