diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 2f457a2..0d2f752 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -57,11 +57,6 @@ serde_json = "1" tokio = { version = "1", features = ["rt", "sync"] } arboard = "3.6.1" -# Runtime shared-library probe for the Vulkan loader (active compute -# device detection, brief item #1). We do not call any vulkan symbols -# — we only need to answer "is libvulkan resolvable from the loader's -# default search path right now?". -libloading = "0.8" # SqlitePool is named directly from src-tauri/src/lib.rs (the AppState # stores it). Must be unconditional, not Linux-only — naming a type from diff --git a/src-tauri/src/commands/models.rs b/src-tauri/src/commands/models.rs index bd0b741..3d9b879 100644 --- a/src-tauri/src/commands/models.rs +++ b/src-tauri/src/commands/models.rs @@ -6,7 +6,7 @@ use tauri::Emitter; use crate::commands::security::ensure_main_window; use crate::AppState; use magnotia_core::constants::WHISPER_SAMPLE_RATE; -use magnotia_core::hardware::{self, CpuFeatures}; +use magnotia_core::hardware::{self, vulkan_loader_available, CpuFeatures}; use magnotia_core::model_registry::{self, Engine, LanguageSupport, ModelEntry}; use magnotia_core::types::{AudioSamples, ModelId, TranscriptionOptions}; #[cfg(feature = "whisper")] @@ -319,35 +319,6 @@ pub struct LanguageSupportInfo { pub language_count: u16, } -/// Best-effort probe for the Vulkan loader shared library. -/// -/// whisper.cpp's Vulkan backend refuses to initialise if `vulkan-1.dll` -/// (Windows) / `libvulkan.so.1` (Linux) / the MoltenVK bundle (macOS) -/// is missing at runtime. We probe via `libloading::Library::new`; -/// failure means whisper.cpp will silently drop back to CPU, and the -/// user deserves to know before they start wondering why a 14-second -/// clip takes two minutes. -fn vulkan_loader_available() -> bool { - #[cfg(target_os = "linux")] - let candidates: &[&str] = &["libvulkan.so.1", "libvulkan.so"]; - #[cfg(target_os = "windows")] - let candidates: &[&str] = &["vulkan-1.dll"]; - #[cfg(target_os = "macos")] - let candidates: &[&str] = &["libvulkan.1.dylib", "libMoltenVK.dylib"]; - #[cfg(not(any(target_os = "linux", target_os = "windows", target_os = "macos")))] - let candidates: &[&str] = &[]; - - for name in candidates { - // SAFETY: libloading::Library::new loads a shared library and returns - // a handle that is dropped at the end of this iteration. No symbols - // from it are called, so we just need the open-for-probe semantics. - match unsafe { libloading::Library::new(*name) } { - Ok(_lib) => return true, - Err(_) => continue, - } - } - false -} /// Compile-time target signalling used by `compose_accelerators`. /// Split out so the pure-function behaviour is testable without `cfg!`