git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit4bfd45c260c8172c561568a1d8bcdadec82718c1
parent503f7595b6
authorLucas Galante <[email protected]>
date2026-07-01 20:10
Replace discrete LOD doubling with smooth density fade

 src/server/output.rs | 33 +++++++++++++++++----------------
 1 file changed, 17 insertions(+), 16 deletions(-)

diff --git a/src/server/output.rs b/src/server/output.rs
index a13c615..5daf1b7 100644
--- a/src/server/output.rs
+++ b/src/server/output.rs
@@ -588,22 +588,23 @@ impl Output {
             wm.desk_zoom
         };
 
-        // Calculate Level of Detail (LOD) grid spacing.
-        // As the user zooms out, we scale up spacing to prevent grid density from becoming too high.
-        let mut cell_size = wm.layout.desktop_grid_scale.max(5.0);
-        let mut gap_size = (wm.layout.desktop_gap_width as f64).max(0.0);
-        let mut period = cell_size + gap_size;
-
-        const MIN_PERIOD_PIXELS: f64 = 40.0;
-        let mut iterations = 0;
-        while period * zoom < MIN_PERIOD_PIXELS && iterations < 20 {
-            cell_size *= 2.0;
-            gap_size *= 2.0;
-            period = cell_size + gap_size;
-            iterations += 1;
-        }
+        let cell_size = wm.layout.desktop_grid_scale.max(5.0);
+        let gap_size = (wm.layout.desktop_gap_width as f64).max(0.0);
+        let period = cell_size + gap_size;
+
+        // Smoothly fade out grid cells when they get too small (period * zoom < 30px)
+        // to prevent extreme visual noise, layout popping, and massive CPU allocation stutters when zooming.
+        let period_pixels = period * zoom;
+        let density_fade = if period_pixels < 15.0 {
+            0.0
+        } else if period_pixels < 30.0 {
+            (period_pixels - 15.0) / 15.0
+        } else {
+            1.0
+        };
 
-        let cell_color: [f32; 4] = wm.layout.desktop_cell_color;
+        let mut cell_color: [f32; 4] = wm.layout.desktop_cell_color;
+        cell_color[3] *= density_fade as f32;
         let cell_corner_radius = wm.layout.desktop_cell_corner_radius;
         let cell_fade_inset = wm.layout.desktop_cell_fade_inset;
         let gap_color = &wm.layout.desktop_gap_color;
@@ -692,7 +693,7 @@ impl Output {
             let col_range = max_col.saturating_sub(min_col);
             let row_range = max_row.saturating_sub(min_row);
 
-            if col_range > 0 && row_range > 0 && col_range <= 1000 && row_range <= 1000 && col_range * row_range <= 20000 {
+            if density_fade > 0.0 && col_range > 0 && row_range > 0 && col_range <= 1000 && row_range <= 1000 && col_range * row_range <= 20000 {
                 let scaled_corner_radius = (cell_corner_radius as f64 * zoom).round() as i32;
                 let inset_scaled = (cell_fade_inset as f64 * zoom * 1000.0).round() as i32;