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);