use super::types::DetectionConfidence;
use windows::Win32::Graphics::Dxgi::{
CreateDXGIFactory1, IDXGIAdapter1, IDXGIFactory1, DXGI_ADAPTER_FLAG, DXGI_ADAPTER_FLAG_SOFTWARE,
};
pub fn detect_gpu_with_confidence() -> (bool, DetectionConfidence) {
let factory_result: windows::core::Result<IDXGIFactory1> = unsafe { CreateDXGIFactory1() };
let Ok(factory) = factory_result else {
return (false, DetectionConfidence::Unknown);
};
let mut index: u32 = 0;
loop {
let adapter_result: windows::core::Result<IDXGIAdapter1> =
unsafe { factory.EnumAdapters1(index) };
let Ok(adapter) = adapter_result else {
return (false, DetectionConfidence::High);
};
if let Ok(desc) = unsafe { adapter.GetDesc1() } {
let is_software =
(DXGI_ADAPTER_FLAG(desc.Flags as i32).0 & DXGI_ADAPTER_FLAG_SOFTWARE.0) != 0;
if !is_software {
return (true, DetectionConfidence::High);
}
}
index += 1;
if index > 16 {
return (false, DetectionConfidence::High);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_probe_returns_one_of_two_documented_states() {
let (_present, confidence) = detect_gpu_with_confidence();
assert!(matches!(
confidence,
DetectionConfidence::High | DetectionConfidence::Unknown,
));
}
}