#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DeviceInfo {
pub name: String,
pub architecture: String,
pub generation: Option<u32>,
pub class: Option<char>,
pub recommended_working_set: u64,
pub max_threads_per_threadgroup: usize,
}
#[cfg_attr(not(target_os = "macos"), allow(dead_code))]
pub(crate) fn parse_architecture(arch: &str) -> (Option<u32>, Option<char>) {
let Some(rest) = arch.strip_prefix("applegpu_g") else {
return (None, None);
};
let digits = rest.chars().take_while(char::is_ascii_digit).count();
let generation = rest[..digits].parse().ok();
let class = rest[digits..]
.chars()
.next()
.filter(char::is_ascii_lowercase);
(generation, class)
}
#[cfg(test)]
mod tests {
use super::parse_architecture;
#[test]
fn parses_apple_gpu_architectures() {
assert_eq!(parse_architecture("applegpu_g16s"), (Some(16), Some('s')));
assert_eq!(parse_architecture("applegpu_g17p"), (Some(17), Some('p')));
assert_eq!(parse_architecture("applegpu_g13"), (Some(13), None));
assert_eq!(parse_architecture("Paravirtual"), (None, None));
}
}