Checkpoint

Antonio Scandurra created

Change summary

crates/gpui3/src/geometry.rs                    | 33 ++++++++++++------
crates/gpui3/src/platform/mac/metal_renderer.rs | 20 ++++++-----
crates/gpui3/src/platform/mac/shaders.metal     |  2 
3 files changed, 33 insertions(+), 22 deletions(-)

Detailed changes

crates/gpui3/src/geometry.rs 🔗

@@ -305,18 +305,6 @@ impl Mul<f32> for Pixels {
     }
 }
 
-#[derive(
-    Clone, Copy, Debug, Default, Add, AddAssign, Sub, SubAssign, Div, PartialEq, PartialOrd,
-)]
-#[repr(transparent)]
-pub struct DevicePixels(pub(crate) u32);
-
-impl From<DevicePixels> 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<Pixels> 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<DevicePixels> for u32 {
+    fn from(device_pixels: DevicePixels) -> Self {
+        device_pixels.0
+    }
+}
+
+impl From<u32> for DevicePixels {
+    fn from(val: u32) -> Self {
+        DevicePixels(val)
+    }
+}
+
 #[derive(Clone, Copy, Default, Add, Sub, Mul, Div)]
 pub struct Rems(f32);
 

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<Pixels> =
-            size(viewport_size.width.into(), viewport_size.height.into());
+        let viewport_size: Size<DevicePixels> = 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<Pixels>,
+        viewport_size: Size<DevicePixels>,
         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<Pixels>,
+    viewport_size: Size<DevicePixels>,
     max_order: u32,
 }

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