Clippy fixes.

This also adds Clippy to the presubmit checks.

Change-Id: I9a3b3d90e942a5d7cd0de9d75658b86cd3a7b584
Reviewed-on: https://fuchsia-review.googlesource.com/c/forma/+/713004
Reviewed-by: Randall Bosetti <rlb@google.com>
diff --git a/benches/benches/painter.rs b/benches/benches/painter.rs
index f687e0e..9c76739 100644
--- a/benches/benches/painter.rs
+++ b/benches/benches/painter.rs
@@ -23,11 +23,8 @@
         transform: AffineTransform::default(),
         image: Arc::new(create_image(SIZE.into(), SIZE.into())),
     };
-    let style = Style {
-        is_clipped: false,
-        fill: Fill::Texture(texture.clone()),
-        blend_mode: BlendMode::Over,
-    };
+    let style =
+        Style { is_clipped: false, fill: Fill::Texture(texture), blend_mode: BlendMode::Over };
     group.bench_function("texture", |b| {
         b.iter(|| painter_fill_at_bench(SIZE.into(), SIZE.into(), &style))
     });
@@ -67,9 +64,7 @@
         blend_mode: BlendMode::Over,
     };
     group.bench_function("gradient_radial", |b| {
-        b.iter(|| {
-            painter_fill_at_bench(SIZE.into(), SIZE.into(), &style);
-        })
+        b.iter(|| painter_fill_at_bench(SIZE.into(), SIZE.into(), &style))
     });
     group.finish();
 }
diff --git a/demo/src/demos/rive.rs b/demo/src/demos/rive.rs
index 1839e14..df1ecb9 100644
--- a/demo/src/demos/rive.rs
+++ b/demo/src/demos/rive.rs
@@ -22,7 +22,7 @@
 
 fn to_linear(color: Color32) -> [f32; 4] {
     fn conv(l: u8) -> f32 {
-        let l = l as f32 * 255.0f32.recip();
+        let l = f32::from(l) * 255.0f32.recip();
 
         if l <= 0.04045 {
             l * 12.92f32.recip()
@@ -35,7 +35,7 @@
         conv(color.red()),
         conv(color.green()),
         conv(color.blue()),
-        color.alpha() as f32 * 255.0f32.recip(),
+        f32::from(color.alpha()) * 255.0f32.recip(),
     ]
 }
 
@@ -77,7 +77,8 @@
 
         let layer = self.composition.get_mut_or_insert_default(order);
 
-        if path.user_tag.get().map(|tag| tag.get() - 1 == self.order as u64).unwrap_or_default() {
+        if path.user_tag.get().map(|tag| tag.get() - 1 == u64::from(self.order)).unwrap_or_default()
+        {
             let cached_transform =
                 if let Some(inverted_transform) = self.inverted_transforms.get(&order).copied() {
                     transform * inverted_transform
@@ -113,7 +114,7 @@
                     1.0,
                 ]));
 
-                path.user_tag.set(NonZeroU64::new(self.order as u64 + 1))
+                path.user_tag.set(NonZeroU64::new(u64::from(self.order) + 1));
             }
         } else {
             let forma_path = to_forma_path(&path.commands);
@@ -134,7 +135,7 @@
                 1.0,
             ]));
 
-            path.user_tag.set(NonZeroU64::new(self.order as u64 + 1))
+            path.user_tag.set(NonZeroU64::new(u64::from(self.order) + 1));
         }
 
         let blend_mode = match paint.blend_mode {
@@ -208,7 +209,8 @@
 
         let layer = self.composition.get_mut_or_insert_default(order);
 
-        if path.user_tag.get().map(|tag| tag.get() - 1 == self.order as u64).unwrap_or_default() {
+        if path.user_tag.get().map(|tag| tag.get() - 1 == u64::from(self.order)).unwrap_or_default()
+        {
             let cached_transform =
                 if let Some(inverted_transform) = self.inverted_transforms.get(&order).copied() {
                     transform * inverted_transform
@@ -244,7 +246,7 @@
                     1.0,
                 ]));
 
-                path.user_tag.set(NonZeroU64::new(self.order as u64 + 1))
+                path.user_tag.set(NonZeroU64::new(u64::from(self.order) + 1));
             }
         } else {
             let forma_path = to_forma_path(&path.commands);
@@ -265,7 +267,7 @@
                 1.0,
             ]));
 
-            path.user_tag.set(NonZeroU64::new(self.order as u64 + 1))
+            path.user_tag.set(NonZeroU64::new(u64::from(self.order) + 1));
         }
 
         layer.set_props(forma::Props { fill_rule: FillRule::NonZero, func: Func::Clip(layers) });
diff --git a/demo/src/demos/spaceship.rs b/demo/src/demos/spaceship.rs
index 7831907..b310354 100644
--- a/demo/src/demos/spaceship.rs
+++ b/demo/src/demos/spaceship.rs
@@ -66,7 +66,7 @@
             acc: Vector2::new(0.0, 0.0),
             angle: 0.0,
             angle_speed: rng.gen_range(-0.8..0.8f32),
-            radius: radius,
+            radius,
             layer: Err(layer),
             alive: true,
         }
@@ -117,8 +117,8 @@
             let v1 = ((m1 - m2) * u1 + 2.0 * m2 * u2) / (m1 + m2);
             let v2 = ((m2 - m1) * u2 + 2.0 * m1 * u1) / (m1 + m2);
             // Update speeds.
-            a.speed = a.speed + r_pos_u * (-u1 + v1);
-            b.speed = b.speed + r_pos_u * (-u2 + v2);
+            a.speed += r_pos_u * (-u1 + v1);
+            b.speed += r_pos_u * (-u2 + v2);
         }
     }
 
@@ -141,10 +141,10 @@
             self.angle = (-2.0 * self.speed.x / self.max_speed).asin().clamp(-0.2, 0.2);
         }
         // Integrate acceleration, speed and compute position.
-        self.acc = self.acc + self.speed * self.friction;
+        self.acc += self.speed * self.friction;
         let max_speed = self.max_speed;
         self.speed = clamp2d(self.speed + self.acc * delta_t, -max_speed, max_speed);
-        self.pos = self.pos + self.speed * delta_t;
+        self.pos += self.speed * delta_t;
         self.angle += self.angle_speed * delta_t;
 
         // Kill actors out of the game boundaries.
@@ -243,10 +243,8 @@
                 };
 
                 composition.get_mut(order).unwrap().set_transform(a.transform());
-            } else {
-                if let Ok(order) = a.layer {
-                    composition.remove(order);
-                }
+            } else if let Ok(order) = a.layer {
+                composition.remove(order);
             }
         }
 
@@ -255,6 +253,12 @@
     }
 }
 
+impl Default for Spaceship {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
 impl App for Spaceship {
     fn width(&self) -> usize {
         self.width
diff --git a/demo/src/demos/svg.rs b/demo/src/demos/svg.rs
index 1ae68a1..d6eda9c 100644
--- a/demo/src/demos/svg.rs
+++ b/demo/src/demos/svg.rs
@@ -178,7 +178,7 @@
         result.open(path);
 
         let transform = &[scale, 0.0, 0.0, 0.0, scale, 0.0, 0.0, 0.0, 1.0];
-        for (path, ..) in result.paths.iter_mut() {
+        for (path, ..) in &mut result.paths {
             *path = path.transform(transform);
         }
 
@@ -194,15 +194,15 @@
     }
 
     fn groups_opacity(&self) -> f32 {
-        self.groups.iter().map(|group| group.opacity).flatten().product()
+        self.groups.iter().filter_map(|group| group.opacity).product()
     }
 
     fn t(&self, point: Point) -> Point {
         match self.group_transform() {
             None => point,
             Some(t) => {
-                let mut x = point.x as f64;
-                let mut y = point.y as f64;
+                let mut x = f64::from(point.x);
+                let mut y = f64::from(point.y);
                 t.apply_to(&mut x, &mut y);
                 Point::new(x as f32, y as f32)
             }
@@ -214,23 +214,20 @@
             let fill = fill.to_string();
 
             fill.strip_prefix("url(#")
-                .and_then(|fill| fill.strip_suffix(")"))
+                .and_then(|fill| fill.strip_suffix(')'))
                 .and_then(|id| self.gradients.get(id))
         }) {
             return Fill::Gradient(gradient.clone());
         }
 
         let color: Option<Color> =
-            parse_color(&attrs).or_else(|| self.group_fill()).or_else(|| Some(Color::black()));
+            parse_color(attrs).or_else(|| self.group_fill()).or_else(|| Some(Color::black()));
 
-        let opacity: f32 = parse_opacity(&attrs).unwrap_or_else(|| self.groups_opacity());
+        let opacity: f32 = parse_opacity(attrs).unwrap_or_else(|| self.groups_opacity());
 
-        let color = color
-            .map(|color| forma::Color {
-                a: opacity,
-                ..crate::to_linear([color.red, color.green, color.blue])
-            })
-            .unwrap_or(forma::Color { r: 0.0, g: 0.0, b: 0.0, a: 1.0 });
+        let color = color.map_or(forma::Color { r: 0.0, g: 0.0, b: 0.0, a: 1.0 }, |color| {
+            forma::Color { a: opacity, ..crate::to_linear([color.red, color.green, color.blue]) }
+        });
 
         Fill::Solid(color)
     }
diff --git a/demo/src/demos/texture.rs b/demo/src/demos/texture.rs
index 3a22d20..bcad47d 100644
--- a/demo/src/demos/texture.rs
+++ b/demo/src/demos/texture.rs
@@ -12,6 +12,7 @@
 
 use crate::{App, Keyboard};
 
+#[derive(Debug)]
 pub struct Texture {
     width: usize,
     height: usize,
@@ -49,6 +50,12 @@
     }
 }
 
+impl Default for Texture {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
 fn load_image(file_path: &path::Path) -> Image {
     let img = image::io::Reader::open(file_path)
         .expect("Unable to open file")
diff --git a/demo/src/main.rs b/demo/src/main.rs
index 1871966..82c97df 100644
--- a/demo/src/main.rs
+++ b/demo/src/main.rs
@@ -127,7 +127,7 @@
 
 pub fn to_linear(rgb: [u8; 3]) -> Color {
     fn conv(l: u8) -> f32 {
-        let l = l as f32 * 255.0f32.recip();
+        let l = f32::from(l) * 255.0f32.recip();
 
         if l <= 0.04045 {
             l * 12.92f32.recip()
@@ -176,10 +176,10 @@
         *control_flow = ControlFlow::Poll;
 
         match event {
-            Event::WindowEvent { event: WindowEvent::CloseRequested, .. }
-            | Event::WindowEvent {
+            Event::WindowEvent {
                 event:
-                    WindowEvent::KeyboardInput {
+                    WindowEvent::CloseRequested
+                    | WindowEvent::KeyboardInput {
                         input: KeyboardInput { virtual_keycode: Some(VirtualKeyCode::Escape), .. },
                         ..
                     },
@@ -190,9 +190,10 @@
             Event::WindowEvent { event: WindowEvent::KeyboardInput { input, .. }, .. } => {
                 keyboard.on_keyboard_input(input);
             }
-            Event::WindowEvent { event: WindowEvent::Resized(size), .. }
-            | Event::WindowEvent {
-                event: WindowEvent::ScaleFactorChanged { new_inner_size: &mut size, .. },
+            Event::WindowEvent {
+                event:
+                    WindowEvent::Resized(size)
+                    | WindowEvent::ScaleFactorChanged { new_inner_size: &mut size, .. },
                 ..
             } => {
                 runner.resize(size.width, size.height);
diff --git a/demo/src/runner.rs b/demo/src/runner.rs
index 7e14d46..6d5932f 100644
--- a/demo/src/runner.rs
+++ b/demo/src/runner.rs
@@ -61,7 +61,7 @@
         let window = WindowBuilder::new()
             .with_title("demo | compose: ???ms, render: ???ms")
             .with_inner_size(PhysicalSize::new(width, height))
-            .build(&event_loop)
+            .build(event_loop)
             .unwrap();
 
         let layout = LinearLayout::new(width as usize, width as usize * 4, height as usize);
@@ -105,7 +105,7 @@
         }
 
         let compose_duration = measure(|| {
-            app.compose(&mut self.composition, elapsed, &keyboard);
+            app.compose(&mut self.composition, elapsed, keyboard);
         });
 
         let render_duration = measure(|| {
@@ -137,12 +137,12 @@
             let new_path = "capture.ppm";
             let mut output = File::options().write(true).create(true).open(new_path).unwrap();
             output
-                .write(
+                .write_all(
                     format!("P6\n{} {}\n255\n", self.layout.width(), self.layout.height())
                         .as_bytes(),
                 )
                 .unwrap();
-            output.write(&bytes).unwrap();
+            output.write_all(&bytes).unwrap();
         }
     }
 }
@@ -173,7 +173,7 @@
         let window = WindowBuilder::new()
             .with_title("demo | compose: ???ms, sort: ???ms, paint: ???ms, render: ???ms")
             .with_inner_size(PhysicalSize::new(width, height))
-            .build(&event_loop)
+            .build(event_loop)
             .unwrap();
 
         let instance = wgpu::Instance::new(wgpu::Backends::PRIMARY);
@@ -252,7 +252,7 @@
         }
 
         let compose_duration = measure(|| {
-            app.compose(&mut self.composition, elapsed, &keyboard);
+            app.compose(&mut self.composition, elapsed, keyboard);
         });
 
         let timings = self.renderer.render(
diff --git a/e2e_tests/tests/test_env.rs b/e2e_tests/tests/test_env.rs
index c25d999..cc48f66 100644
--- a/e2e_tests/tests/test_env.rs
+++ b/e2e_tests/tests/test_env.rs
@@ -31,8 +31,8 @@
     let mut buffer = BufferBuilder::new(&mut data, &mut layout).build();
     let mut renderer = CpuRenderer::new();
     renderer.render(composition, &mut buffer, RGBA, Color { r: 1.0, g: 1.0, b: 1.0, a: 0.0 }, None);
-    let image = RgbaImage::from_raw(width as u32, height as u32, data).unwrap();
-    image
+
+    RgbaImage::from_raw(width as u32, height as u32, data).unwrap()
 }
 
 fn gpu_render(composition: &mut Composition, width: usize, height: usize) -> RgbaImage {
@@ -148,8 +148,8 @@
 
 #[derive(Debug)]
 enum RendererType {
-    CPU,
-    GPU,
+    Cpu,
+    Gpu,
 }
 
 #[derive(Serialize)]
@@ -191,7 +191,7 @@
     }
     pub fn test_render<F>(self, compose: F)
     where
-        F: Fn(&mut Composition) -> (),
+        F: Fn(&mut Composition),
     {
         if let Err(err) = test_render(compose, &self.test_name) {
             self.failures.borrow_mut().push(format!("{:?}", err));
@@ -200,9 +200,9 @@
 
     pub fn test_render_param<F, T: Debug>(&self, compose: F, t: T)
     where
-        F: Fn(&mut Composition) -> (),
+        F: Fn(&mut Composition),
     {
-        let t = format!("{:?}", t).replace("\"", "");
+        let t = format!("{:?}", t).replace('\"', "");
         if let Err(err) = test_render(compose, &format!("{}::{}", self.test_name, t)) {
             self.failures.borrow_mut().push(format!("{:?}", err));
         }
@@ -229,7 +229,7 @@
 
 fn test_render<F>(compose: F, test_name: &str) -> anyhow::Result<()>
 where
-    F: Fn(&mut Composition) -> (),
+    F: Fn(&mut Composition),
 {
     let cpu_actual = {
         let mut composition = Composition::new();
@@ -245,11 +245,11 @@
 
     let tolerance = 8;
     let result = (|| {
-        let expected_cpu = expected_image(test_name, RendererType::CPU)
+        let expected_cpu = expected_image(test_name, RendererType::Cpu)
             .context("CPU reference image is missing.")?;
         compare_images(&expected_cpu, &cpu_actual, tolerance)
             .context("CPU result differs from the reference image.")?;
-        let expected_gpu = expected_image(test_name, RendererType::GPU).unwrap_or(expected_cpu);
+        let expected_gpu = expected_image(test_name, RendererType::Gpu).unwrap_or(expected_cpu);
         compare_images(&expected_gpu, &gpu_actual, tolerance)
             .context("GPU result differs from the reference image.")
     })();
@@ -296,8 +296,8 @@
         .lock();
     let report = lock.unwrap();
 
-    let cpu_expected = expected_image_path(test_name, RendererType::CPU);
-    let gpu_expected = expected_image_path(test_name, RendererType::GPU);
+    let cpu_expected = expected_image_path(test_name, RendererType::Cpu);
+    let gpu_expected = expected_image_path(test_name, RendererType::Gpu);
     report.add_result(
         test_name,
         cpu_expected.exists().then(|| cpu_expected),
@@ -311,9 +311,10 @@
 
 impl TestReport {
     fn new(output_dir: path::PathBuf) -> TestReport {
-        TestReport { output_dir: output_dir, entries: Mutex::new(vec![]) }
+        TestReport { output_dir, entries: Mutex::new(vec![]) }
     }
 
+    #[allow(clippy::too_many_arguments)]
     fn add_result(
         &self,
         test_name: &str,
@@ -371,15 +372,3 @@
         fs::write(&self.output_dir.join("report.html"), report).unwrap();
     }
 }
-
-macro_rules! test_env {
-    () => {{
-        fn f() {}
-        fn type_name_of<T>(_: T) -> &'static str {
-            std::any::type_name::<T>()
-        }
-
-        TestEnv::new(type_name_of(f).strip_prefix("tests::").unwrap().strip_suffix("::f").unwrap())
-    }};
-}
-pub(crate) use test_env;
diff --git a/e2e_tests/tests/tests.rs b/e2e_tests/tests/tests.rs
index 22361a5..dd1da0d 100644
--- a/e2e_tests/tests/tests.rs
+++ b/e2e_tests/tests/tests.rs
@@ -1,10 +1,21 @@
 mod test_env;
 
+macro_rules! from_env {
+    () => {{
+        fn f() {}
+        fn type_name_of<T>(_: T) -> &'static str {
+            ::std::any::type_name::<T>()
+        }
+
+        TestEnv::new(type_name_of(f).strip_prefix("tests::").unwrap().strip_suffix("::f").unwrap())
+    }};
+}
+
 #[cfg(test)]
 mod tests {
     use std::sync::Arc;
 
-    use super::test_env::*;
+    use super::test_env::{TestEnv, HEIGHT, PADDING, WIDTH};
     use forma::{
         AffineTransform, BlendMode, Color, Fill, FillRule, Func, Gradient, GradientBuilder, Image,
         Order, Path, PathBuilder, Point, Props, Style, Texture,
@@ -96,7 +107,7 @@
 
     #[test]
     fn linear_gradient() {
-        let test_env = test_env!();
+        let test_env = from_env!();
         test_env.test_render(|composition| {
             let mut gradient_builder = GradientBuilder::new(
                 Point { x: PADDING, y: 0.0 },
@@ -122,7 +133,7 @@
 
     #[test]
     fn radial_gradient() {
-        let test_env = test_env!();
+        let test_env = from_env!();
         test_env.test_render(|composition| {
             let mut gradient_builder = GradientBuilder::new(
                 Point { x: WIDTH * 0.5, y: HEIGHT * 0.5 },
@@ -149,7 +160,7 @@
 
     #[test]
     fn solid_color() {
-        let test_env = test_env!();
+        let test_env = from_env!();
         let colors = vec![
             (Color { r: 0.0, g: 0.0, b: 1.0, a: 1.0 }, "blue"),
             (Color { r: 0.0, g: 0.0, b: 0.5, a: 1.0 }, "dark_blue"),
@@ -175,7 +186,7 @@
     #[test]
     fn pixel() {
         // This test is useful when the reasterizer is brocken as it emmits 2 pixel segments.
-        test_env!().test_render(|composition| {
+        from_env!().test_render(|composition| {
             composition
                 .get_mut_or_insert_default(Order::new(1).unwrap())
                 .insert(&custom_square(PADDING, PADDING, PADDING + 1.0, PADDING + 1.0))
@@ -186,7 +197,7 @@
     #[test]
     fn covers() {
         // Draws all compination of pixels offseted by 1/32 on both x and y axis.
-        test_env!().test_render(|composition| {
+        from_env!().test_render(|composition| {
             let layer = composition
                 .get_mut_or_insert_default(Order::new(0).unwrap())
                 .set_props(solid_color_props(Color { r: 0.0, g: 0.0, b: 0.0, a: 1.0 }));
@@ -203,7 +214,7 @@
     #[test]
     fn texture() {
         // Draws all compination of pixels offseted by 1/32 on both x and y axis.
-        test_env!().test_render(|composition| {
+        from_env!().test_render(|composition| {
             let image = Arc::new(
                 Image::from_srgba(
                     &[
@@ -259,7 +270,7 @@
 
     #[test]
     fn blend_modes() {
-        let test_env = test_env!();
+        let test_env = from_env!();
         let blend_modes = [
             BlendMode::Over,
             BlendMode::Multiply,
@@ -311,7 +322,7 @@
 
     #[test]
     fn fill_rules() {
-        let test_env = test_env!();
+        let test_env = from_env!();
         let fill_rules = [FillRule::EvenOdd, FillRule::NonZero];
         for fill_rule in fill_rules {
             test_env.test_render_param(
@@ -342,7 +353,7 @@
 
     #[test]
     fn clipping() {
-        let test_env = test_env!();
+        let test_env = from_env!();
         test_env.test_render(|composition| {
             // First layer is not clipped.
             composition
@@ -417,7 +428,7 @@
     #[test]
     fn clipping2() {
         // This test was introduces to verify that the clipping state is reset between tiles.
-        let test_env = test_env!();
+        let test_env = from_env!();
         test_env.test_render(|composition| {
             // First layer is not clipped.
             composition
diff --git a/gpu/conveyor-sort/src/lib.rs b/gpu/conveyor-sort/src/lib.rs
index 93658f1..48f7a73 100644
--- a/gpu/conveyor-sort/src/lib.rs
+++ b/gpu/conveyor-sort/src/lib.rs
@@ -112,6 +112,7 @@
     }
 }
 
+#[allow(clippy::too_many_arguments)]
 pub fn encode<'b>(
     device: &wgpu::Device,
     encoder: &mut wgpu::CommandEncoder,
@@ -145,7 +146,7 @@
         cpass.set_bind_group(0, &block_sort_bind_group, &[]);
 
         if let Some((timestamp, start_index, _)) = timestamp {
-            cpass.write_timestamp(&timestamp, start_index);
+            cpass.write_timestamp(timestamp, start_index);
         }
 
         cpass.dispatch_workgroups(config.workgroup_size(), 1, 1);
@@ -232,15 +233,15 @@
 
             if round == max_rounds - 1 {
                 if let Some((timestamp, _, end_index)) = timestamp {
-                    cpass.write_timestamp(&timestamp, end_index);
+                    cpass.write_timestamp(timestamp, end_index);
                 }
             }
         }
     }
 
     if rounds % 2 == 0 {
-        &storage_buffer0
+        storage_buffer0
     } else {
-        &storage_buffer1
+        storage_buffer1
     }
 }
diff --git a/gpu/painter/src/lib.rs b/gpu/painter/src/lib.rs
index 1931e9a..7767501 100644
--- a/gpu/painter/src/lib.rs
+++ b/gpu/painter/src/lib.rs
@@ -72,6 +72,7 @@
     PaintContext { pipeline, bind_group_layout }
 }
 
+#[allow(clippy::too_many_arguments)]
 pub fn encode(
     device: &wgpu::Device,
     encoder: &mut wgpu::CommandEncoder,
@@ -115,12 +116,12 @@
             wgpu::BindGroupEntry { binding: 3, resource: styles_buffer.as_entire_binding() },
             wgpu::BindGroupEntry {
                 binding: 4,
-                resource: wgpu::BindingResource::TextureView(&atlas_texture),
+                resource: wgpu::BindingResource::TextureView(atlas_texture),
             },
             wgpu::BindGroupEntry { binding: 5, resource: wgpu::BindingResource::Sampler(&sampler) },
             wgpu::BindGroupEntry {
                 binding: 6,
-                resource: wgpu::BindingResource::TextureView(&texture_view),
+                resource: wgpu::BindingResource::TextureView(texture_view),
             },
         ],
     });
@@ -130,12 +131,12 @@
     pass.set_bind_group(0, &bind_group, &[]);
 
     if let Some((timestamp, start_index, _)) = timestamp {
-        pass.write_timestamp(&timestamp, start_index);
+        pass.write_timestamp(timestamp, start_index);
     }
 
     pass.dispatch_workgroups(((height as usize + TILE_HEIGHT - 1) / TILE_HEIGHT) as u32, 1, 1);
 
     if let Some((timestamp, _, end_index)) = timestamp {
-        pass.write_timestamp(&timestamp, end_index);
+        pass.write_timestamp(timestamp, end_index);
     }
 }
diff --git a/gpu/rasterizer/src/lib.rs b/gpu/rasterizer/src/lib.rs
index fb2818e..e74b94a 100644
--- a/gpu/rasterizer/src/lib.rs
+++ b/gpu/rasterizer/src/lib.rs
@@ -120,7 +120,7 @@
         pass.set_pipeline(&context.prepare_lines_pipeline);
         pass.set_bind_group(0, &bind_group, &[]);
         if let Some((timestamp, start_index, _)) = timestamp {
-            pass.write_timestamp(&timestamp, start_index);
+            pass.write_timestamp(timestamp, start_index);
         }
 
         let workgroup_size: u32 = 128;
@@ -131,7 +131,7 @@
             1,
         );
         if let Some((timestamp, _, end_index)) = timestamp {
-            pass.write_timestamp(&timestamp, end_index);
+            pass.write_timestamp(timestamp, end_index);
         }
     }
 
@@ -158,7 +158,7 @@
         pass.set_pipeline(&context.rasterizer_pipeline);
         pass.set_bind_group(0, &bind_group, &[]);
         if let Some((timestamp, start_index, _)) = timestamp {
-            pass.write_timestamp(&timestamp, start_index);
+            pass.write_timestamp(timestamp, start_index);
         }
         let workgroup_size: u32 = 128;
         let max_invocation_count: u32 = 16;
@@ -168,7 +168,7 @@
             1,
         );
         if let Some((timestamp, _, end_index)) = timestamp {
-            pass.write_timestamp(&timestamp, end_index);
+            pass.write_timestamp(timestamp, end_index);
         }
     }
 }
diff --git a/gpu/renderer/src/lib.rs b/gpu/renderer/src/lib.rs
index 7624648..ce89f4a 100644
--- a/gpu/renderer/src/lib.rs
+++ b/gpu/renderer/src/lib.rs
@@ -75,11 +75,11 @@
         swap_chain_format: wgpu::TextureFormat,
         has_timestamp_query: bool,
     ) -> Self {
-        let rasterizer = rasterizer::init(&device);
+        let rasterizer = rasterizer::init(device);
 
-        let sort = conveyor_sort::init(&device);
+        let sort = conveyor_sort::init(device);
 
-        let paint = painter::init(&device);
+        let paint = painter::init(device);
 
         let shader = device.create_shader_module(&wgpu::ShaderModuleDescriptor {
             label: None,
@@ -110,6 +110,7 @@
         Self { rasterizer, sort, paint, render, common: Resources::default(), has_timestamp_query }
     }
 
+    #[allow(clippy::too_many_arguments)]
     pub fn render(
         &mut self,
         device: &wgpu::Device,
@@ -176,7 +177,7 @@
             device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });
 
         let atlas_texture = self.common.atlas.get_or_insert_with(|| {
-            let texture = device.create_texture(&wgpu::TextureDescriptor {
+            device.create_texture(&wgpu::TextureDescriptor {
                 label: Some("atlas"),
                 size: wgpu::Extent3d { width: 4096, height: 4096, depth_or_array_layers: 1 },
                 mip_level_count: 1,
@@ -184,15 +185,13 @@
                 dimension: wgpu::TextureDimension::D2,
                 format: wgpu::TextureFormat::Rgba16Float,
                 usage: wgpu::TextureUsages::COPY_DST | wgpu::TextureUsages::TEXTURE_BINDING,
-            });
-
-            texture
+            })
         });
 
         for (image, [xmin, ymin, _, _]) in new_allocations {
             queue.write_texture(
                 wgpu::ImageCopyTexture {
-                    texture: &atlas_texture,
+                    texture: atlas_texture,
                     mip_level: 0,
                     origin: wgpu::Origin3d { x: *xmin, y: *ymin, z: 0 },
                     aspect: TextureAspect::All,
@@ -226,10 +225,10 @@
             });
 
             rasterizer::encode(
-                &device,
+                device,
                 &mut encoder,
                 &self.rasterizer,
-                &lines,
+                lines,
                 segments_count,
                 &pixel_segment_buffer,
                 timestamp_context.as_ref().map(|(timestamp, _, _)| (timestamp, 0, 1)),
@@ -253,7 +252,7 @@
             });
 
             let segments_buffer = conveyor_sort::encode(
-                &device,
+                device,
                 &mut encoder,
                 &self.sort,
                 segments_count,
@@ -275,7 +274,7 @@
             });
 
             painter::encode(
-                &device,
+                device,
                 &mut encoder,
                 &self.paint,
                 &texture_view,
@@ -334,7 +333,7 @@
         }
 
         if let Some((timestamp, _, data_buffer)) = &timestamp_context {
-            encoder.resolve_query_set(&timestamp, 0..4, &data_buffer, 0);
+            encoder.resolve_query_set(timestamp, 0..4, data_buffer, 0);
         }
 
         queue.submit(Some(encoder.finish()));
diff --git a/presubmit.sh b/presubmit.sh
index a225944..e1497f0 100755
--- a/presubmit.sh
+++ b/presubmit.sh
@@ -31,5 +31,7 @@
 RUSTDOCFLAGS="-D warnings" cargo doc -q -p forma
 echo "Running forma doc tests..."
 cargo test -q --doc -p forma
+echo "Running clippy..."
+cargo clippy -q --all-targets --all-features -- -D warnings
 echo
 echo "Pre-submit passed successfully."