commit a77b61b

shrub  ·  2026-03-18 19:35:16 +0000 UTC
parent bf9503a
reuse cached shm buffer for zoom
1 files changed,  +35, -3
+35, -3
 1@@ -670,6 +670,12 @@ swc_set_zoom(float level)
 2 
 3 	if (compositor.zoom != level) {
 4 		compositor.zoom = level;
 5+		if (level == 1.0f) {
 6+			if (compositor.zoom_buffer) {
 7+				wld_buffer_unreference(compositor.zoom_buffer);
 8+				compositor.zoom_buffer = NULL;
 9+			}
10+		}
11 		/* damage entire screen to force full repaint */
12 		schedule_updates(-1);
13 	}
14@@ -694,6 +700,33 @@ wld_to_pixman_format(enum wld_format format)
15 	}
16 }
17 
18+static struct wld_buffer *
19+zoom_buffer_for_screen(struct screen *screen)
20+{
21+	uint32_t width = screen->base.geometry.width;
22+	uint32_t height = screen->base.geometry.height;
23+
24+	if (compositor.zoom_buffer &&
25+	    (compositor.zoom_buffer->width != width ||
26+	     compositor.zoom_buffer->height != height ||
27+	     compositor.zoom_buffer->format != WLD_FORMAT_ARGB8888)) {
28+		wld_buffer_unreference(compositor.zoom_buffer);
29+		compositor.zoom_buffer = NULL;
30+	}
31+
32+	if (!compositor.zoom_buffer) {
33+		compositor.zoom_buffer =
34+		    wld_create_buffer(swc.shm->context, width, height,
35+		                      WLD_FORMAT_ARGB8888, WLD_FLAG_MAP);
36+		if (!compositor.zoom_buffer) {
37+			return NULL;
38+		}
39+	}
40+
41+	wld_buffer_reference(compositor.zoom_buffer);
42+	return compositor.zoom_buffer;
43+}
44+
45 /* render zoomed view to shm      wallpaper unscaled, windows scaled */
46 static struct wld_buffer *
47 render_zoomed_to_shm(struct screen *screen, float zoom)
48@@ -706,9 +739,7 @@ render_zoomed_to_shm(struct screen *screen, float zoom)
49 	int32_t cy = screen_y + height / 2;
50 	struct compositor_view *view;
51 	struct wld_buffer *background;
52-
53-	struct wld_buffer *buffer = wld_create_buffer(
54-	    swc.shm->context, width, height, WLD_FORMAT_ARGB8888, WLD_FLAG_MAP);
55+	struct wld_buffer *buffer = zoom_buffer_for_screen(screen);
56 	if (!buffer) {
57 		return NULL;
58 	}
59@@ -1742,6 +1773,7 @@ compositor_finalize(void)
60 
61 	if (compositor.zoom_buffer) {
62 		wld_buffer_unreference(compositor.zoom_buffer);
63+		compositor.zoom_buffer = NULL;
64 	}
65 	pixman_region32_fini(&compositor.damage);
66 	pixman_region32_fini(&compositor.opaque);