diff --git a/wgpu-hal/src/metal/device.rs b/wgpu-hal/src/metal/device.rs index 02ef3bffa35..234b9cee9f0 100644 --- a/wgpu-hal/src/metal/device.rs +++ b/wgpu-hal/src/metal/device.rs @@ -521,6 +521,14 @@ impl crate::Device for super::Device { && self.shared.private_caps.supports_memoryless_storage { MTLStorageMode::Memoryless + } else if cfg!(target_pointer_width = "32") { + // On arm64_32 (watchOS ILP32), the AGXMetalS4 driver (A13/S6 GPU) + // crashes in copyFromTexture:toBuffer: on Private textures — null + // deref at offset 0x50 in the driver's internal texture state. Use + // Shared storage which works correctly on Apple's unified memory + // architecture and matches what native Swift Metal code uses on + // these devices. + MTLStorageMode::Shared } else { MTLStorageMode::Private }; @@ -1272,8 +1280,11 @@ impl crate::Device for super::Device { } // https://developer.apple.com/documentation/metal/mtlpipelinebufferdescriptor/mutability - let supports_mutability = - available!(macos = 10.13, ios = 11.0, tvos = 11.0, visionos = 1.0); + // Disabled on arm64_32 (watchOS ILP32): the AGXMetalS4 driver exhibits + // instability when mutability hints are combined with Shared storage + // mode textures. Conservative disable until broader device coverage. + let supports_mutability = !cfg!(target_pointer_width = "32") + && available!(macos = 10.13, ios = 11.0, tvos = 11.0, visionos = 1.0); let (primitive_class, raw_primitive_type) = conv::map_primitive_topology(desc.primitive.topology); diff --git a/wgpu-hal/src/metal/surface.rs b/wgpu-hal/src/metal/surface.rs index e08ac591e6e..1b08c53d4e5 100644 --- a/wgpu-hal/src/metal/surface.rs +++ b/wgpu-hal/src/metal/surface.rs @@ -76,7 +76,8 @@ impl crate::Surface for super::Surface { wgt::PresentMode::Immediate => false, m => unreachable!("Unsupported present mode: {m:?}"), }; - let drawable_size = CGSize::new(config.extent.width as f64, config.extent.height as f64); + // CGFloat is f64 on 64-bit, f32 on 32-bit (arm64_32/ILP32) + let drawable_size = CGSize::new(config.extent.width as _, config.extent.height as _); match config.composite_alpha_mode { wgt::CompositeAlphaMode::Opaque => render_layer.setOpaque(true),