mirror of
https://github.com/nestriness/nestri.git
synced 2026-09-19 17:25:19 +03:00
fix(nesdoctor): every Mac reported gpu=unknown, because the probe had no macOS arm
Seen in the macOS CI log: nesdoctor 0.2.2 | macos/aarch64 | gpu=unknown | ... `gpus()` had a Linux arm, a Windows arm, and `Vec::new()` for everything else. Macs are clients rather than hosts, so it went unnoticed -- but 0041 wants a client vendor matrix and an unlabelled row is no use in one. An M-series integrated GPU and a discrete Radeon in an Intel Mac decode very differently, and "unknown" cannot tell them apart. `system_profiler SPDisplaysDataType` is the only place the chipset name lives. Parsed loosely: the format has changed between macOS releases, so a name we cannot find costs a field rather than the run. Vendor is matched over Apple, AMD, Radeon, NVIDIA and Intel; `render_node` stays `None` because macOS has none and a Mac cannot host regardless. Still missing on macOS and stated rather than papered over: filesystem types and the display probe. The EDID path is sysfs on Linux and WMI on Windows, and macOS exposes neither -- so Mac respondents report no colour depth or HDR capability. That is a real gap for the video work, since Mac panels are exactly the P3 and high-refresh cases worth knowing about, and it needs `CoreDisplay`/`system_profiler` parsing rather than a one-line fix.
This commit is contained in:
@@ -252,7 +252,50 @@ fn gpus() -> Vec<Gpu> {
|
|||||||
out.sort_by_key(|g| (is_virtual_adapter(&g.name), g.vendor.is_none()));
|
out.sort_by_key(|g| (is_virtual_adapter(&g.name), g.vendor.is_none()));
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
#[cfg(not(any(target_os = "linux", windows)))]
|
#[cfg(target_os = "macos")]
|
||||||
|
{
|
||||||
|
// Every Mac reported `gpu=unknown`, because this arm did not exist --
|
||||||
|
// seen in the macOS CI log. Macs are clients rather than hosts, but
|
||||||
|
// 0041 wants a client vendor matrix and an unlabelled entry is no use
|
||||||
|
// in one: an M-series integrated GPU and a discrete Radeon in an Intel
|
||||||
|
// Mac decode very differently.
|
||||||
|
//
|
||||||
|
// `SPDisplaysDataType` is the only place the chipset name lives.
|
||||||
|
// Parsed loosely on purpose: the format has changed between macOS
|
||||||
|
// releases and a missing name should cost a field.
|
||||||
|
let out = sh("system_profiler", &["SPDisplaysDataType"]).unwrap_or_default();
|
||||||
|
let mut gpus = Vec::new();
|
||||||
|
for line in out.lines() {
|
||||||
|
let l = line.trim();
|
||||||
|
if let Some(name) = l
|
||||||
|
.strip_prefix("Chipset Model:")
|
||||||
|
.or_else(|| l.strip_prefix("Chipset:"))
|
||||||
|
{
|
||||||
|
let name = name.trim();
|
||||||
|
if name.is_empty() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let up = name.to_uppercase();
|
||||||
|
gpus.push(Gpu {
|
||||||
|
name: name.to_string(),
|
||||||
|
vendor: [
|
||||||
|
("APPLE", "Apple"),
|
||||||
|
("AMD", "AMD"),
|
||||||
|
("RADEON", "AMD"),
|
||||||
|
("NVIDIA", "NVIDIA"),
|
||||||
|
("INTEL", "Intel"),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.find(|(needle, _)| up.contains(needle))
|
||||||
|
.map(|(_, v)| v.to_string()),
|
||||||
|
// macOS has no DRM render nodes; a Mac cannot host anyway.
|
||||||
|
render_node: None,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return gpus;
|
||||||
|
}
|
||||||
|
#[cfg(not(any(target_os = "linux", windows, target_os = "macos")))]
|
||||||
return Vec::new();
|
return Vec::new();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user