use std::sync::Once;
static ARM: Once = Once::new();
pub fn arm_policy_from_env() {
ARM.call_once(|| {
let requested = std::env::var("KEYHOG_REQUIRE_GPU").is_ok_and(|v| v == "1");
if requested && !keyhog_scanner::gpu::gpu_required_by_policy() {
keyhog_scanner::gpu::set_gpu_runtime_policy(
keyhog_scanner::gpu::GpuRuntimePolicy::Required,
);
}
});
}
pub fn require_gpu_or_panic(context: &str) {
arm_policy_from_env();
if !keyhog_scanner::gpu::gpu_required_by_policy() {
return;
}
if let Err(reason) = keyhog_scanner::gpu::require_gpu_preflight() {
panic!("{context}: {reason}");
}
}
pub fn assert_gpu_not_silent_empty(gpu_empty: bool, reference_finding_count: usize, context: &str) {
if gpu_empty && reference_finding_count > 0 {
panic!(
"{context}: GPU returned zero findings vs {reference_finding_count} reference findings - \
adapter init failure or silent CPU fallback must fail loudly, not skip"
);
}
}