better output for nvidia

This commit is contained in:
Junkui Zhang 2025-07-17 21:31:00 +08:00
parent 0c40bb9b5f
commit 0e45ef7e43

View file

@ -1371,7 +1371,10 @@ mod shader_resources {
}
mod nvidia {
use std::os::raw::{c_char, c_int, c_uint};
use std::{
ffi::CStr,
os::raw::{c_char, c_int, c_uint},
};
use anyhow::{Context, Result};
use windows::{
@ -1386,10 +1389,6 @@ mod nvidia {
#[allow(non_camel_case_types)]
type NvAPI_ShortString = [c_char; NVAPI_SHORT_STRING_MAX];
// https://github.com/NVIDIA/nvapi/blob/7cb76fce2f52de818b3da497af646af1ec16ce27/nvapi.h#L87
#[allow(non_camel_case_types)]
type NvAPI_Initialize_t = unsafe extern "C" fn() -> c_int;
// https://github.com/NVIDIA/nvapi/blob/7cb76fce2f52de818b3da497af646af1ec16ce27/nvapi_lite_common.h#L447
#[allow(non_camel_case_types)]
type NvAPI_SYS_GetDriverAndBranchVersion_t = unsafe extern "C" fn(
@ -1405,18 +1404,6 @@ mod nvidia {
.ok_or_else(|| anyhow::anyhow!("Failed to get nvapi_QueryInterface address"))?;
let nvapi_query: extern "C" fn(u32) -> *mut () = std::mem::transmute(nvapi_query_addr);
// https://github.com/NVIDIA/nvapi/blob/7cb76fce2f52de818b3da497af646af1ec16ce27/nvapi_interface.h#L33
let nvapi_init_ptr = nvapi_query(0x0150e828);
if nvapi_init_ptr.is_null() {
anyhow::bail!("Failed to get NVIDIA API function pointer");
}
let nvapi_init: NvAPI_Initialize_t = std::mem::transmute(nvapi_init_ptr);
let result = nvapi_init();
if result != 0 {
anyhow::bail!("Failed to initialize NVIDIA API, error code: {}", result);
}
// https://github.com/NVIDIA/nvapi/blob/7cb76fce2f52de818b3da497af646af1ec16ce27/nvapi_interface.h#L41
let nvapi_get_driver_version_ptr = nvapi_query(0x2926aaad);
if nvapi_get_driver_version_ptr.is_null() {
@ -1440,7 +1427,13 @@ mod nvidia {
}
let major = driver_version / 100;
let minor = driver_version % 100;
Ok(format!("{}.{}", major, minor))
let branch_string = CStr::from_ptr(build_branch_string.as_ptr());
Ok(format!(
"{}.{} {}",
major,
minor,
branch_string.to_string_lossy()
))
}
}
}