diff --git a/crates/gpui3/src/platform/mac/metal_renderer.rs b/crates/gpui3/src/platform/mac/metal_renderer.rs index 801a810ebc..cb76feae14 100644 --- a/crates/gpui3/src/platform/mac/metal_renderer.rs +++ b/crates/gpui3/src/platform/mac/metal_renderer.rs @@ -5,7 +5,7 @@ use cocoa::{ foundation::NSUInteger, quartzcore::AutoresizingMask, }; -use metal::{CommandQueue, DepthStencilDescriptor, MTLPixelFormat, MTLResourceOptions, NSRange}; +use metal::{CommandQueue, MTLPixelFormat, MTLResourceOptions, NSRange}; use objc::{self, msg_send, sel, sel_impl}; use std::{ffi::c_void, mem, ptr}; @@ -17,7 +17,6 @@ pub struct MetalRenderer { layer: metal::MetalLayer, command_queue: CommandQueue, quad_pipeline_state: metal::RenderPipelineState, - depth_state: metal::DepthStencilState, unit_vertices: metal::Buffer, instances: metal::Buffer, } @@ -88,18 +87,12 @@ impl MetalRenderer { PIXEL_FORMAT, ); - let depth_stencil_descriptor = DepthStencilDescriptor::new(); - depth_stencil_descriptor.set_depth_compare_function(metal::MTLCompareFunction::LessEqual); - depth_stencil_descriptor.set_depth_write_enabled(true); - let depth_state = device.new_depth_stencil_state(&depth_stencil_descriptor); - let command_queue = device.new_command_queue(); Self { device, layer, command_queue, quad_pipeline_state, - depth_state, unit_vertices, instances, } @@ -154,7 +147,6 @@ impl MetalRenderer { let alpha = if self.layer.is_opaque() { 1. } else { 0. }; color_attachment.set_clear_color(metal::MTLClearColor::new(0., 0., 0., alpha)); let command_encoder = command_buffer.new_render_command_encoder(render_pass_descriptor); - command_encoder.set_depth_stencil_state(&self.depth_state); command_encoder.set_viewport(metal::MTLViewport { originX: 0.0, @@ -166,13 +158,15 @@ impl MetalRenderer { }); let mut buffer_offset = 0; - self.draw_quads( - &scene.opaque_primitives().quads, - &mut buffer_offset, - viewport_size, - scene.max_order(), - command_encoder, - ); + for layer in scene.layers() { + self.draw_quads( + &layer.quads, + &mut buffer_offset, + viewport_size, + command_encoder, + ); + } + command_encoder.end_encoding(); self.instances.did_modify_range(NSRange { @@ -190,7 +184,6 @@ impl MetalRenderer { quads: &[Quad], offset: &mut usize, viewport_size: Size, - max_order: u32, command_encoder: &metal::RenderCommandEncoderRef, ) { if quads.is_empty() { @@ -214,10 +207,7 @@ impl MetalRenderer { Some(&self.instances), *offset as u64, ); - let quad_uniforms = QuadUniforms { - viewport_size, - max_order, - }; + let quad_uniforms = QuadUniforms { viewport_size }; let quad_uniform_bytes = bytemuck::bytes_of(&quad_uniforms); command_encoder.set_vertex_bytes( @@ -300,5 +290,4 @@ enum QuadInputIndex { #[repr(C)] pub(crate) struct QuadUniforms { viewport_size: Size, - max_order: u32, } diff --git a/crates/gpui3/src/platform/mac/shaders.metal b/crates/gpui3/src/platform/mac/shaders.metal index 9f9644a20e..1f562071b0 100644 --- a/crates/gpui3/src/platform/mac/shaders.metal +++ b/crates/gpui3/src/platform/mac/shaders.metal @@ -4,7 +4,7 @@ using namespace metal; float4 hsla_to_rgba(Hsla hsla); -float4 to_device_position(float2 pixel_position, uint order, uint max_order, float2 viewport_size); +float4 to_device_position(float2 pixel_position, float2 viewport_size); struct QuadVertexOutput { float4 position [[position]]; @@ -24,7 +24,7 @@ vertex QuadVertexOutput quad_vertex( Quad quad = quads[quad_id]; float2 position_2d = unit_vertex * float2(quad.bounds.size.width, quad.bounds.size.height) + float2(quad.bounds.origin.x, quad.bounds.origin.y); float2 viewport_size = float2((float)uniforms->viewport_size.width, (float)uniforms->viewport_size.height); - float4 device_position = to_device_position(position_2d, quad.order, uniforms->max_order, viewport_size); + float4 device_position = to_device_position(position_2d, viewport_size); float4 background_color = hsla_to_rgba(quad.background); float4 border_color = hsla_to_rgba(quad.border_color); return QuadVertexOutput { @@ -142,7 +142,6 @@ float4 hsla_to_rgba(Hsla hsla) { return rgba; } -float4 to_device_position(float2 pixel_position, uint order, uint max_order, float2 viewport_size) { - float z = 1. - ((float)order / ((float)max_order + 1.)); - return float4(pixel_position / viewport_size * float2(2., -2.) + float2(-1., 1.), z, 1.); +float4 to_device_position(float2 pixel_position, float2 viewport_size) { + return float4(pixel_position / viewport_size * float2(2., -2.) + float2(-1., 1.), 0., 1.); } diff --git a/crates/gpui3/src/scene.rs b/crates/gpui3/src/scene.rs index 99809bbaf3..cf739fc299 100644 --- a/crates/gpui3/src/scene.rs +++ b/crates/gpui3/src/scene.rs @@ -1,28 +1,25 @@ -use std::cmp; - use super::{Bounds, Hsla, Pixels, Point}; -use crate::{Corners, Edges, FontId, GlyphId}; +use crate::{Corners, Edges}; use bytemuck::{Pod, Zeroable}; -use plane_split::BspSplitter; +use collections::BTreeMap; // Exported to metal pub type PointF = Point; pub struct Scene { - opaque_primitives: PrimitiveBatch, - transparent_primitives: slotmap::SlotMap, - splitter: BspSplitter, - max_order: u32, + layers: BTreeMap, scale_factor: f32, } +#[derive(Default)] +pub struct SceneLayer { + pub quads: Vec, +} + impl Scene { pub fn new(scale_factor: f32) -> Scene { Scene { - opaque_primitives: PrimitiveBatch::default(), - transparent_primitives: slotmap::SlotMap::new(), - splitter: BspSplitter::new(), - max_order: 0, + layers: Default::default(), scale_factor, } } @@ -30,18 +27,14 @@ impl Scene { pub fn insert(&mut self, primitive: impl Into) { let mut primitive = primitive.into(); primitive.scale(self.scale_factor); - self.max_order = cmp::max(self.max_order, primitive.order()); + let layer = self.layers.entry(primitive.order()).or_default(); match primitive { - Primitive::Quad(quad) => self.opaque_primitives.quads.push(quad), + Primitive::Quad(quad) => layer.quads.push(quad), } } - pub fn opaque_primitives(&self) -> &PrimitiveBatch { - &self.opaque_primitives - } - - pub fn max_order(&self) -> u32 { - self.max_order + pub fn layers(&self) -> impl Iterator { + self.layers.values() } } @@ -74,11 +67,6 @@ impl Primitive { } } -#[derive(Default)] -pub struct PrimitiveBatch { - pub quads: Vec, -} - #[derive(Debug, Clone, Copy, Zeroable, Pod)] #[repr(C)] pub struct Quad { @@ -106,9 +94,7 @@ impl Quad { ] .into_iter() } -} -impl Quad { pub fn scale(&mut self, factor: f32) { self.bounds.origin *= factor; self.bounds.size *= factor; diff --git a/crates/gpui3/src/window.rs b/crates/gpui3/src/window.rs index b0e84048cd..77ea466e8a 100644 --- a/crates/gpui3/src/window.rs +++ b/crates/gpui3/src/window.rs @@ -8,7 +8,6 @@ use derive_more::{Deref, DerefMut}; use refineable::Refineable; use std::{ any::{Any, TypeId}, - future::Future, marker::PhantomData, sync::Arc, };