diff --git a/crates/gpui3/src/geometry.rs b/crates/gpui3/src/geometry.rs index 65e5b24ca5357429d24936cc7574f584debab319..a1e931357a69a5dc6f199d89f48468fe5dcf6891 100644 --- a/crates/gpui3/src/geometry.rs +++ b/crates/gpui3/src/geometry.rs @@ -305,18 +305,6 @@ impl Mul for Pixels { } } -#[derive( - Clone, Copy, Debug, Default, Add, AddAssign, Sub, SubAssign, Div, PartialEq, PartialOrd, -)] -#[repr(transparent)] -pub struct DevicePixels(pub(crate) u32); - -impl From for u32 { - fn from(device_pixels: DevicePixels) -> Self { - device_pixels.0 - } -} - impl Pixels { pub fn round(&self) -> Self { Self(self.0.round()) @@ -388,6 +376,27 @@ impl From for f64 { } } +#[derive( + Clone, Copy, Debug, Default, Add, AddAssign, Sub, SubAssign, Div, PartialEq, PartialOrd, +)] +#[repr(transparent)] +pub struct DevicePixels(pub(crate) u32); + +unsafe impl bytemuck::Pod for DevicePixels {} +unsafe impl bytemuck::Zeroable for DevicePixels {} + +impl From for u32 { + fn from(device_pixels: DevicePixels) -> Self { + device_pixels.0 + } +} + +impl From for DevicePixels { + fn from(val: u32) -> Self { + DevicePixels(val) + } +} + #[derive(Clone, Copy, Default, Add, Sub, Mul, Div)] pub struct Rems(f32); diff --git a/crates/gpui3/src/platform/mac/metal_renderer.rs b/crates/gpui3/src/platform/mac/metal_renderer.rs index 72ab5978e5d1e1e24df3ea6c6f7f64fdfb4487e7..801a810ebce33e0c8c982ad3b517ef292f8aa4c7 100644 --- a/crates/gpui3/src/platform/mac/metal_renderer.rs +++ b/crates/gpui3/src/platform/mac/metal_renderer.rs @@ -1,4 +1,4 @@ -use crate::{point, size, Pixels, Quad, Scene, Size}; +use crate::{point, size, DevicePixels, Quad, Scene, Size}; use bytemuck::{Pod, Zeroable}; use cocoa::{ base::{NO, YES}, @@ -112,8 +112,10 @@ impl MetalRenderer { pub fn draw(&mut self, scene: &Scene) { let layer = self.layer.clone(); let viewport_size = layer.drawable_size(); - let viewport_size: Size = - size(viewport_size.width.into(), viewport_size.height.into()); + let viewport_size: Size = size( + (viewport_size.width.ceil() as u32).into(), + (viewport_size.height.ceil() as u32).into(), + ); let drawable = if let Some(drawable) = layer.next_drawable() { drawable } else { @@ -132,8 +134,8 @@ impl MetalRenderer { depth_texture_desc.set_pixel_format(metal::MTLPixelFormat::Depth32Float); depth_texture_desc.set_storage_mode(metal::MTLStorageMode::Private); depth_texture_desc.set_usage(metal::MTLTextureUsage::RenderTarget); - depth_texture_desc.set_width(f32::from(viewport_size.width).ceil() as u64); - depth_texture_desc.set_height(f32::from(viewport_size.height).ceil() as u64); + depth_texture_desc.set_width(u32::from(viewport_size.width) as u64); + depth_texture_desc.set_height(u32::from(viewport_size.height) as u64); let depth_texture = self.device.new_texture(&depth_texture_desc); let depth_attachment = render_pass_descriptor.depth_attachment().unwrap(); @@ -157,8 +159,8 @@ impl MetalRenderer { command_encoder.set_viewport(metal::MTLViewport { originX: 0.0, originY: 0.0, - width: viewport_size.width.into(), - height: viewport_size.height.into(), + width: u32::from(viewport_size.width) as f64, + height: u32::from(viewport_size.height) as f64, znear: 0.0, zfar: 1.0, }); @@ -187,7 +189,7 @@ impl MetalRenderer { &mut self, quads: &[Quad], offset: &mut usize, - viewport_size: Size, + viewport_size: Size, max_order: u32, command_encoder: &metal::RenderCommandEncoderRef, ) { @@ -297,6 +299,6 @@ enum QuadInputIndex { #[derive(Debug, Clone, Copy, Zeroable, Pod)] #[repr(C)] pub(crate) struct QuadUniforms { - viewport_size: Size, + 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 0bd5abd8f6a595b9ccff3f611df7c2c1b7ccd97e..f0d9c3ab0211aad6897b14eb07cfe4b8d2329a0f 100644 --- a/crates/gpui3/src/platform/mac/shaders.metal +++ b/crates/gpui3/src/platform/mac/shaders.metal @@ -23,7 +23,7 @@ vertex QuadVertexOutput quad_vertex( float2 unit_vertex = unit_vertices[unit_vertex_id]; 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(uniforms->viewport_size.width, uniforms->viewport_size.height); + 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 background_color = hsla_to_rgba(quad.background); float4 border_color = hsla_to_rgba(quad.border_color);