Bump `fearless_simd` (#1177)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 749719b..d97cff5 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -8,7 +8,7 @@
   # If the compilation fails, then the version specified here needs to be bumped up to reality.
   # Be sure to also update the rust-version property in the workspace Cargo.toml file,
   # plus all the README.md files of the affected packages.
-  RUST_MIN_VER: "1.85"
+  RUST_MIN_VER: "1.86"
   # List of packages that will be checked with the minimum supported Rust version.
   # This should be limited to packages that are intended for publishing.
   RUST_MIN_VER_PKGS: "-p vello -p vello_encoding -p vello_shaders -p vello_api -p vello_common -p vello_cpu -p vello_hybrid"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 414e0c0..17e019d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,7 +13,7 @@
 
 ## [Unreleased]
 
-This release has an [MSRV][] of 1.85.
+This release has an [MSRV][] of 1.86.
 
 ## Added
 
diff --git a/Cargo.lock b/Cargo.lock
index 772f427..1f015e1 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -941,7 +941,8 @@
 [[package]]
 name = "fearless_simd"
 version = "0.2.0"
-source = "git+https://github.com/linebender/fearless_simd?rev=f25206a#f25206a4fe58a8f6daae157d63b1abdafb3a1be2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb8f822f06d1b452a9207f11ce3292f7ee6c23d5d2e7ddfd07990a9107804850"
 dependencies = [
  "bytemuck",
  "libm",
diff --git a/Cargo.toml b/Cargo.toml
index 7d9c56e..5e706e0 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -42,7 +42,7 @@
 edition = "2024"
 # Keep in sync with RUST_MIN_VER in .github/workflows/ci.yml, with the relevant README.md files
 # and with the MSRV in the `Unreleased` section of CHANGELOG.md.
-rust-version = "1.85"
+rust-version = "1.86"
 license = "Apache-2.0 OR MIT"
 repository = "https://github.com/linebender/vello"
 
@@ -115,7 +115,7 @@
 thread_local = "1.1.8"
 crossbeam-channel = "0.5.15"
 ordered-channel = { version = "1.2.0", features = ["crossbeam-channel"] }
-fearless_simd = { git = "https://github.com/linebender/fearless_simd", rev = "f25206a", default-features = false }
+fearless_simd = { version = "0.2.0", default-features = false }
 
 # The below crates are experimental!
 vello_api = { path = "sparse_strips/vello_api", default-features = false }
diff --git a/README.md b/README.md
index c866886..8245e71 100644
--- a/README.md
+++ b/README.md
@@ -222,7 +222,7 @@
 
 ## Minimum supported Rust Version (MSRV)
 
-This version of Vello has been verified to compile with **Rust 1.85** and later.
+This version of Vello has been verified to compile with **Rust 1.86** and later.
 
 Future versions of Vello might increase the Rust version requirement.
 It will not be treated as a breaking change and as such can even happen with small patch releases.
diff --git a/sparse_strips/vello_api/README.md b/sparse_strips/vello_api/README.md
index f884ac1..c13d408 100644
--- a/sparse_strips/vello_api/README.md
+++ b/sparse_strips/vello_api/README.md
@@ -32,7 +32,7 @@
 
 ## Minimum supported Rust Version (MSRV)
 
-This version of Vello API has been verified to compile with **Rust 1.85** and later.
+This version of Vello API has been verified to compile with **Rust 1.86** and later.
 
 Future versions of Vello API might increase the Rust version requirement.
 It will not be treated as a breaking change and as such can even happen with small patch releases.
diff --git a/sparse_strips/vello_common/README.md b/sparse_strips/vello_common/README.md
index 3e25dff..1da3913 100644
--- a/sparse_strips/vello_common/README.md
+++ b/sparse_strips/vello_common/README.md
@@ -65,7 +65,7 @@
 
 ## Minimum supported Rust Version (MSRV)
 
-This version of Vello Common has been verified to compile with **Rust 1.85** and later.
+This version of Vello Common has been verified to compile with **Rust 1.86** and later.
 
 Future versions of Vello Common might increase the Rust version requirement.
 It will not be treated as a breaking change and as such can even happen with small patch releases.
diff --git a/sparse_strips/vello_common/src/flatten.rs b/sparse_strips/vello_common/src/flatten.rs
index 713da45..b05536f 100644
--- a/sparse_strips/vello_common/src/flatten.rs
+++ b/sparse_strips/vello_common/src/flatten.rs
@@ -84,7 +84,7 @@
     fill_dispatch(level, path, affine, line_buf, ctx);
 }
 
-simd_dispatch!(fill_dispatch(
+simd_dispatch!(fn fill_dispatch(
     level,
     path: impl IntoIterator<Item = PathEl>, 
     affine: Affine,
diff --git a/sparse_strips/vello_common/src/strip.rs b/sparse_strips/vello_common/src/strip.rs
index 674da18..e5db6e5 100644
--- a/sparse_strips/vello_common/src/strip.rs
+++ b/sparse_strips/vello_common/src/strip.rs
@@ -52,7 +52,7 @@
     );
 }
 
-simd_dispatch!(render_dispatch(
+simd_dispatch!(fn render_dispatch(
     level,
     tiles: &Tiles,
     strip_buf: &mut Vec<Strip>,
diff --git a/sparse_strips/vello_common/src/tile.rs b/sparse_strips/vello_common/src/tile.rs
index a0906b1..97a7548 100644
--- a/sparse_strips/vello_common/src/tile.rs
+++ b/sparse_strips/vello_common/src/tile.rs
@@ -343,7 +343,7 @@
             p1: Point { x: 9.0, y: -1.0 },
         };
 
-        let mut tiles = Tiles::new(Level::new());
+        let mut tiles = Tiles::new(Level::try_detect().unwrap_or(Level::fallback()));
         tiles.make_tiles(&[line], 100, 100);
 
         assert!(tiles.is_empty());
@@ -356,7 +356,7 @@
             p1: Point { x: 103.0, y: 20.0 },
         };
 
-        let mut tiles = Tiles::new(Level::new());
+        let mut tiles = Tiles::new(Level::try_detect().unwrap_or(Level::fallback()));
         tiles.make_tiles(&[line], 100, 100);
 
         assert!(tiles.is_empty());
@@ -369,7 +369,7 @@
             p1: Point { x: 35.0, y: 105.0 },
         };
 
-        let mut tiles = Tiles::new(Level::new());
+        let mut tiles = Tiles::new(Level::try_detect().unwrap_or(Level::fallback()));
         tiles.make_tiles(&[line], 100, 100);
 
         assert!(tiles.is_empty());
@@ -382,7 +382,7 @@
             p1: Point { x: 2.0, y: 1.0 },
         };
 
-        let mut tiles = Tiles::new(Level::new());
+        let mut tiles = Tiles::new(Level::try_detect().unwrap_or(Level::fallback()));
         tiles.make_tiles(&[line], 100, 100);
 
         assert_eq!(tiles.tile_buf, [Tile::new(0, 0, 0, true)]);
@@ -395,7 +395,7 @@
             p1: Point { x: 8.5, y: 1.0 },
         };
 
-        let mut tiles = Tiles::new(Level::new());
+        let mut tiles = Tiles::new(Level::try_detect().unwrap_or(Level::fallback()));
         tiles.make_tiles(&[line], 100, 100);
         tiles.sort_tiles();
 
@@ -416,7 +416,7 @@
             p1: Point { x: 1.0, y: 8.5 },
         };
 
-        let mut tiles = Tiles::new(Level::new());
+        let mut tiles = Tiles::new(Level::try_detect().unwrap_or(Level::fallback()));
         tiles.make_tiles(&[line], 100, 100);
         tiles.sort_tiles();
 
@@ -437,7 +437,7 @@
             p1: Point { x: 11.0, y: 8.5 },
         };
 
-        let mut tiles = Tiles::new(Level::new());
+        let mut tiles = Tiles::new(Level::try_detect().unwrap_or(Level::fallback()));
         tiles.make_tiles(&[line], 100, 100);
         tiles.sort_tiles();
 
@@ -460,7 +460,7 @@
             p1: Point { x: 1.0, y: 1.0 },
         };
 
-        let mut tiles = Tiles::new(Level::new());
+        let mut tiles = Tiles::new(Level::try_detect().unwrap_or(Level::fallback()));
         tiles.make_tiles(&[line], 100, 100);
         tiles.sort_tiles();
 
@@ -483,7 +483,7 @@
             p1: Point { x: 14.0, y: 6.0 },
         };
 
-        let mut tiles = Tiles::new(Level::new());
+        let mut tiles = Tiles::new(Level::try_detect().unwrap_or(Level::fallback()));
         tiles.make_tiles(&[line], 100, 100);
         tiles.sort_tiles();
 
@@ -506,7 +506,7 @@
             p1: Point { x: 2.0, y: 11.0 },
         };
 
-        let mut tiles = Tiles::new(Level::new());
+        let mut tiles = Tiles::new(Level::try_detect().unwrap_or(Level::fallback()));
         tiles.make_tiles(&[line], 100, 100);
         tiles.sort_tiles();
 
@@ -534,7 +534,7 @@
             p1: Point { x: 0.0, y: 1.0 },
         };
 
-        let mut tiles = Tiles::new(Level::new());
+        let mut tiles = Tiles::new(Level::try_detect().unwrap_or(Level::fallback()));
         tiles.make_tiles(&[line_1, line_2], 100, 100);
 
         assert_eq!(
@@ -551,7 +551,7 @@
             p1: Point { x: 224.0, y: 388.0 },
         };
 
-        let mut tiles = Tiles::new(Level::new());
+        let mut tiles = Tiles::new(Level::try_detect().unwrap_or(Level::fallback()));
         tiles.make_tiles(&[line], 600, 600);
     }
 
@@ -560,14 +560,14 @@
         let path = BezPath::from_svg("M261,0 L78848,0 L78848,4 L261,4 Z").unwrap();
         let mut line_buf = vec![];
         fill(
-            Level::new(),
+            Level::try_detect().unwrap_or(Level::fallback()),
             &path,
             Affine::IDENTITY,
             &mut line_buf,
             &mut FlattenCtx::default(),
         );
 
-        let mut tiles = Tiles::new(Level::new());
+        let mut tiles = Tiles::new(Level::try_detect().unwrap_or(Level::fallback()));
         tiles.make_tiles(&line_buf, 10, 10);
         assert!(tiles.is_empty());
     }
diff --git a/sparse_strips/vello_cpu/README.md b/sparse_strips/vello_cpu/README.md
index d523ce0..912ac91 100644
--- a/sparse_strips/vello_cpu/README.md
+++ b/sparse_strips/vello_cpu/README.md
@@ -125,7 +125,7 @@
 
 ## Minimum supported Rust Version (MSRV)
 
-This version of Vello CPU has been verified to compile with **Rust 1.85** and later.
+This version of Vello CPU has been verified to compile with **Rust 1.86** and later.
 
 Future versions of Vello CPU might increase the Rust version requirement.
 It will not be treated as a breaking change and as such can even happen with small patch releases.
diff --git a/sparse_strips/vello_cpu/src/dispatch/multi_threaded.rs b/sparse_strips/vello_cpu/src/dispatch/multi_threaded.rs
index 7040eac..297db9e 100644
--- a/sparse_strips/vello_cpu/src/dispatch/multi_threaded.rs
+++ b/sparse_strips/vello_cpu/src/dispatch/multi_threaded.rs
@@ -491,7 +491,7 @@
 }
 
 simd_dispatch!(
-    pub rasterize_with_f32_dispatch(
+    pub fn rasterize_with_f32_dispatch(
         level,
         self_: &MultiThreadedDispatcher,
         buffer: &mut [u8],
@@ -502,7 +502,7 @@
 );
 
 simd_dispatch!(
-    pub rasterize_with_u8_dispatch(
+    pub fn rasterize_with_u8_dispatch(
         level,
         self_: &MultiThreadedDispatcher,
         buffer: &mut [u8],
diff --git a/sparse_strips/vello_cpu/src/dispatch/single_threaded.rs b/sparse_strips/vello_cpu/src/dispatch/single_threaded.rs
index 5fbae49..ebd5673 100644
--- a/sparse_strips/vello_cpu/src/dispatch/single_threaded.rs
+++ b/sparse_strips/vello_cpu/src/dispatch/single_threaded.rs
@@ -197,7 +197,7 @@
 }
 
 simd_dispatch!(
-    pub rasterize_with_f32_dispatch(
+    pub fn rasterize_with_f32_dispatch(
         level,
         self_: &SingleThreadedDispatcher,
         buffer: &mut [u8],
@@ -208,7 +208,7 @@
 );
 
 simd_dispatch!(
-    pub rasterize_with_u8_dispatch(
+    pub fn rasterize_with_u8_dispatch(
         level,
         self_: &SingleThreadedDispatcher,
         buffer: &mut [u8],
diff --git a/sparse_strips/vello_cpu/src/render.rs b/sparse_strips/vello_cpu/src/render.rs
index 038dbda..eb14f47 100644
--- a/sparse_strips/vello_cpu/src/render.rs
+++ b/sparse_strips/vello_cpu/src/render.rs
@@ -81,7 +81,7 @@
 impl Default for RenderSettings {
     fn default() -> Self {
         Self {
-            level: Level::new(),
+            level: Level::try_detect().unwrap_or(Level::fallback()),
             #[cfg(feature = "multithreading")]
             num_threads: std::thread::available_parallelism()
                 .unwrap()
@@ -949,7 +949,7 @@
 
         let mut pixmap = Pixmap::new(200, 200);
         let settings = RenderSettings {
-            level: Level::new(),
+            level: Level::try_detect().unwrap_or(Level::fallback()),
             num_threads: 1,
             render_mode: RenderMode::OptimizeQuality,
         };
diff --git a/sparse_strips/vello_hybrid/README.md b/sparse_strips/vello_hybrid/README.md
index 2c652d1..047998d 100644
--- a/sparse_strips/vello_hybrid/README.md
+++ b/sparse_strips/vello_hybrid/README.md
@@ -23,7 +23,7 @@
 
 ## Minimum supported Rust Version (MSRV)
 
-This version of Vello Hybrid has been verified to compile with **Rust 1.85** and later.
+This version of Vello Hybrid has been verified to compile with **Rust 1.86** and later.
 
 Future versions of Vello Hybrid might increase the Rust version requirement.
 It will not be treated as a breaking change and as such can even happen with small patch releases.
diff --git a/sparse_strips/vello_hybrid/src/scene.rs b/sparse_strips/vello_hybrid/src/scene.rs
index 0985053..cd6f068 100644
--- a/sparse_strips/vello_hybrid/src/scene.rs
+++ b/sparse_strips/vello_hybrid/src/scene.rs
@@ -70,7 +70,11 @@
             encoded_paints: vec![],
             paint_visible: true,
             stroke: render_state.stroke,
-            strip_generator: StripGenerator::new(width, height, Level::new()),
+            strip_generator: StripGenerator::new(
+                width,
+                height,
+                Level::try_detect().unwrap_or(Level::fallback()),
+            ),
             transform: render_state.transform,
             fill_rule: render_state.fill_rule,
             blend_mode: render_state.blend_mode,
diff --git a/sparse_strips/vello_sparse_shaders/README.md b/sparse_strips/vello_sparse_shaders/README.md
index a961371..85def5e 100644
--- a/sparse_strips/vello_sparse_shaders/README.md
+++ b/sparse_strips/vello_sparse_shaders/README.md
@@ -22,7 +22,7 @@
 
 ## Minimum supported Rust Version (MSRV)
 
-This version of Vello Hybrid Shaders has been verified to compile with **Rust 1.85** and later.
+This version of Vello Hybrid Shaders has been verified to compile with **Rust 1.86** and later.
 
 Future versions of Vello Hybrid might increase the Rust version requirement.
 It will not be treated as a breaking change and as such can even happen with small patch releases.
diff --git a/sparse_strips/vello_sparse_tests/tests/issues.rs b/sparse_strips/vello_sparse_tests/tests/issues.rs
index fdec8b0..792633b 100644
--- a/sparse_strips/vello_sparse_tests/tests/issues.rs
+++ b/sparse_strips/vello_sparse_tests/tests/issues.rs
@@ -380,7 +380,7 @@
 #[test]
 fn multi_threading_oob_access() {
     let settings = RenderSettings {
-        level: Level::new(),
+        level: Level::try_detect().unwrap_or(Level::fallback()),
         num_threads: 4,
         render_mode: RenderMode::OptimizeQuality,
     };
diff --git a/sparse_strips/vello_sparse_tests/tests/util.rs b/sparse_strips/vello_sparse_tests/tests/util.rs
index 2afbc5f..a08da82 100644
--- a/sparse_strips/vello_sparse_tests/tests/util.rs
+++ b/sparse_strips/vello_sparse_tests/tests/util.rs
@@ -61,10 +61,16 @@
 ) -> T {
     let level = match level {
         #[cfg(target_arch = "aarch64")]
-        "neon" => Level::Neon(Level::new().as_neon().expect("neon should be available")),
+        "neon" => Level::Neon(
+            Level::try_detect()
+                .unwrap_or(Level::fallback())
+                .as_neon()
+                .expect("neon should be available"),
+        ),
         #[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
         "wasm_simd128" => Level::WasmSimd128(
-            Level::new()
+            Level::try_detect()
+                .unwrap_or(Level::fallback())
                 .as_wasm_simd128()
                 .expect("wasm simd128 should be available"),
         ),
diff --git a/vello/README.md b/vello/README.md
index 8abc5b6..cb0c75e 100644
--- a/vello/README.md
+++ b/vello/README.md
@@ -210,7 +210,7 @@
 
 ## Minimum supported Rust Version (MSRV)
 
-This version of Vello has been verified to compile with **Rust 1.85** and later.
+This version of Vello has been verified to compile with **Rust 1.86** and later.
 
 Future versions of Vello might increase the Rust version requirement.
 It will not be treated as a breaking change and as such can even happen with small patch releases.
diff --git a/vello_encoding/README.md b/vello_encoding/README.md
index 6483e06..3326cc0 100644
--- a/vello_encoding/README.md
+++ b/vello_encoding/README.md
@@ -20,7 +20,7 @@
 
 ## Minimum supported Rust Version (MSRV)
 
-This version of Vello Encoding has been verified to compile with **Rust 1.85** and later.
+This version of Vello Encoding has been verified to compile with **Rust 1.86** and later.
 
 Future versions of Vello Encoding might increase the Rust version requirement.
 It will not be treated as a breaking change and as such can even happen with small patch releases.
diff --git a/vello_shaders/README.md b/vello_shaders/README.md
index 0a45f16..81cf540 100644
--- a/vello_shaders/README.md
+++ b/vello_shaders/README.md
@@ -24,7 +24,7 @@
 
 ## Minimum supported Rust Version (MSRV)
 
-This version of Vello Shaders has been verified to compile with **Rust 1.85** and later.
+This version of Vello Shaders has been verified to compile with **Rust 1.86** and later.
 
 Future versions of Vello Shaders might increase the Rust version requirement.
 It will not be treated as a breaking change and as such can even happen with small patch releases.