query gpu async (#1246)

* async advanced gpu query

* forrmat
This commit is contained in:
CJ Pais 2026-04-10 21:37:39 -04:00 committed by GitHub
parent 0392b7b6ae
commit 966ff99756
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 25 additions and 2 deletions

View file

@ -542,6 +542,17 @@ pub fn run(cli_args: CliArgs) {
initialize_core_logic(&app_handle); initialize_core_logic(&app_handle);
// Pre-warm GPU/accelerator enumeration on a background thread.
// The first call into transcribe_rs::whisper_cpp::gpu::list_gpu_devices
// loads the Metal/Vulkan backend and probes devices, which can take
// several seconds. Without this, that cost is paid synchronously the
// first time the user opens the Advanced settings page (which calls
// the get_available_accelerators command), causing a UI freeze.
// Result is cached in a OnceLock inside the transcription manager.
std::thread::spawn(|| {
let _ = crate::managers::transcription::get_available_accelerators();
});
// Hide tray icon if --no-tray was passed // Hide tray icon if --no-tray was passed
if cli_args.no_tray { if cli_args.no_tray {
tray::set_tray_visibility(&app_handle, false); tray::set_tray_visibility(&app_handle, false);

View file

@ -1143,8 +1143,15 @@ pub fn change_whisper_gpu_device(app: AppHandle, device: i32) -> Result<(), Stri
} }
/// Return which accelerators and GPU devices are available for this build. /// Return which accelerators and GPU devices are available for this build.
///
/// First-call cost is dominated by enumerating GPU devices through the
/// whisper.cpp Metal/Vulkan backend, which loads dynamic libraries and
/// probes hardware. Run it on the blocking pool so the webview thread
/// stays responsive — see also the startup pre-warm in `lib.rs`.
#[tauri::command] #[tauri::command]
#[specta::specta] #[specta::specta]
pub fn get_available_accelerators() -> crate::managers::transcription::AvailableAccelerators { pub async fn get_available_accelerators() -> crate::managers::transcription::AvailableAccelerators {
crate::managers::transcription::get_available_accelerators() tauri::async_runtime::spawn_blocking(crate::managers::transcription::get_available_accelerators)
.await
.expect("get_available_accelerators panicked")
} }

View file

@ -389,6 +389,11 @@ async changeWhisperGpuDevice(device: number) : Promise<Result<null, string>> {
}, },
/** /**
* Return which accelerators and GPU devices are available for this build. * Return which accelerators and GPU devices are available for this build.
*
* First-call cost is dominated by enumerating GPU devices through the
* whisper.cpp Metal/Vulkan backend, which loads dynamic libraries and
* probes hardware. Run it on the blocking pool so the webview thread
* stays responsive see also the startup pre-warm in `lib.rs`.
*/ */
async getAvailableAccelerators() : Promise<AvailableAccelerators> { async getAvailableAccelerators() : Promise<AvailableAccelerators> {
return await TAURI_INVOKE("get_available_accelerators"); return await TAURI_INVOKE("get_available_accelerators");