--- a/crates/reims-vgpu/src/backend/vulkan/caps/push_descriptor.rs +++ b/crates/reims-vgpu/src/backend/vulkan/caps/push_descriptor.rs @@ -33,7 +33,7 @@ .is_some_and(|total| total <= self.max_descriptors) } - pub fn required_extensions(self) -> Vec<*const i8> { + pub fn required_extensions(self) -> Vec<*const std::ffi::c_char> { self.is_available() .then_some(ash::khr::push_descriptor::NAME.as_ptr()) .into_iter() --- a/crates/reims-vgpu/src/backend/vulkan/engine/mod.rs +++ b/crates/reims-vgpu/src/backend/vulkan/engine/mod.rs @@ -2097,7 +2097,13 @@ d24_stencil8: ctx.features.d24_unorm_s8_attachment, max_threads_per_threadgroup: ctx.features.max_compute_workgroup_size, max_threadgroup_memory_bytes: ctx.features.max_compute_shared_memory_bytes, - native_fp16: ctx.features.float16, + // llvmpipe advertises shaderFloat16 but LLVM 20 aborts the entire + // process while selecting the guest's `fs_variant_partial` + // shader (a v4f32 -> v4i16 bitcast). A CPU Vulkan device is the + // software fallback, so report the conservative capability and + // let the Apple plugin choose its non-native-FP16 path. + native_fp16: ctx.features.float16 + && ctx.caps.device_type != ash::vk::PhysicalDeviceType::CPU, }) .unwrap_or(crate::model::DeviceInfoLimits { max_sample_count: 1,