diff --git a/gpui/src/platform/mac/renderer.rs b/gpui/src/platform/mac/renderer.rs index 82e80790cb83d0dfe542cb2aaf4a50ef4d41aff6..d125fe136675df9dd776f3f79ad2b21fe71668b7 100644 --- a/gpui/src/platform/mac/renderer.rs +++ b/gpui/src/platform/mac/renderer.rs @@ -142,7 +142,7 @@ impl Renderer { let mut sprites = Vec::new(); let mut vertices = Vec::::new(); let mut current_atlas_id = None; - for (layer_id, layer) in scene.layers().iter().enumerate() { + for (layer_id, layer) in scene.layers().enumerate() { for path in layer.paths() { let origin = path.bounds.origin() * scene.scale_factor(); let size = (path.bounds.size() * scene.scale_factor()).ceil(); @@ -285,7 +285,7 @@ impl Renderer { let mut path_sprites = path_sprites.into_iter().peekable(); - for (layer_id, layer) in scene.layers().iter().enumerate() { + for (layer_id, layer) in scene.layers().enumerate() { self.clip(scene, layer, drawable_size, command_encoder); self.render_shadows(scene, layer, offset, drawable_size, command_encoder); self.render_quads(scene, layer, offset, drawable_size, command_encoder); diff --git a/gpui/src/scene.rs b/gpui/src/scene.rs index 3818a0870120ba7a0183db69ad3d9dfc1ecb8b60..d974db73e193d80fb223bd5c4ba51c06ffda9012 100644 --- a/gpui/src/scene.rs +++ b/gpui/src/scene.rs @@ -12,7 +12,9 @@ use crate::{ pub struct Scene { scale_factor: f32, layers: Vec, - active_layer_stack: Vec, + foreground_layers: Vec, + active_layer_stack: Vec<(usize, bool)>, + pending_foreground_layers: usize, } #[derive(Default)] @@ -123,7 +125,9 @@ impl Scene { Scene { scale_factor, layers: vec![Layer::new(None)], - active_layer_stack: vec![0], + foreground_layers: Default::default(), + active_layer_stack: vec![(0, false)], + pending_foreground_layers: 0, } } @@ -131,19 +135,32 @@ impl Scene { self.scale_factor } - pub fn layers(&self) -> &[Layer] { - self.layers.as_slice() + pub fn layers(&self) -> impl Iterator { + self.layers.iter().chain(self.foreground_layers.iter()) } pub fn push_layer(&mut self, clip_bounds: Option) { - let ix = self.layers.len(); - self.layers.push(Layer::new(clip_bounds)); - self.active_layer_stack.push(ix); + if self.pending_foreground_layers == 0 { + let ix = self.layers.len(); + self.layers.push(Layer::new(clip_bounds)); + self.active_layer_stack.push((ix, false)); + } else { + let ix = self.foreground_layers.len(); + self.foreground_layers.push(Layer::new(clip_bounds)); + self.active_layer_stack.push((ix, true)); + } + } + + pub fn push_foreground_layer(&mut self, clip_bounds: Option) { + self.pending_foreground_layers += 1; + self.push_layer(clip_bounds); } pub fn pop_layer(&mut self) { - assert!(self.active_layer_stack.len() > 1); - self.active_layer_stack.pop(); + let (_, foreground) = self.active_layer_stack.pop().unwrap(); + if foreground { + self.pending_foreground_layers -= 1; + } } pub fn push_quad(&mut self, quad: Quad) { @@ -167,7 +184,12 @@ impl Scene { } fn active_layer(&mut self) -> &mut Layer { - &mut self.layers[*self.active_layer_stack.last().unwrap()] + let (ix, foreground) = *self.active_layer_stack.last().unwrap(); + if foreground { + &mut self.foreground_layers[ix] + } else { + &mut self.layers[ix] + } } }