use ruda_core::ir::AdapterLuid;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct GpuEngineInstance {
pub adapter: AdapterLuid,
pub engine: GpuEngine,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct GpuEngine {
pub physical_adapter: u32,
pub engine: u32,
}
impl GpuEngineInstance {
pub fn parse(name: &str) -> Option<Self> {
let mut fields = name.split('_');
let mut adapter = None;
let mut physical_adapter = None;
let mut engine = None;
while let Some(field) = fields.next() {
match field {
"luid" => {
let high_part = Self::parse_hex(fields.next()?)?;
let low_part = Self::parse_hex(fields.next()?)?;
adapter = Some(AdapterLuid::from_parts(low_part, high_part as i32));
}
"phys" => physical_adapter = Some(fields.next()?.parse().ok()?),
"eng" => engine = Some(fields.next()?.parse().ok()?),
_ => {}
}
}
Some(Self {
adapter: adapter?,
engine: GpuEngine {
physical_adapter: physical_adapter?,
engine: engine?,
},
})
}
fn parse_hex(field: &str) -> Option<u32> {
let digits = field
.strip_prefix("0x")
.or_else(|| field.strip_prefix("0X"))?;
u32::from_str_radix(digits, 16).ok()
}
}