use vulkane::safe::{
ApiVersion, DeviceCreateInfo, DeviceSafeExt, Instance, InstanceCreateInfo, InstanceSafeExt,
PhysicalDeviceSafeExt, QueueCreateInfo, QueueFlags, QueueSafeExt,
};
fn bootstrap() -> Option<(Instance, vulkane::safe::Device, u32)> {
let instance = Instance::new(InstanceCreateInfo {
application_name: Some("vulkane generator-live-device test"),
api_version: ApiVersion::V1_0,
..Default::default()
})
.ok()?;
let raw_phys =
<Instance as InstanceSafeExt>::enumerate_physical_devices(&instance).ok()?;
if raw_phys.is_empty() {
return None;
}
let physical = instance
.enumerate_physical_devices()
.ok()?
.into_iter()
.find(|pd| pd.find_queue_family(QueueFlags::COMPUTE).is_some())?;
let qf = physical.find_queue_family(QueueFlags::COMPUTE)?;
let device = physical
.create_device(DeviceCreateInfo {
queue_create_infos: &[QueueCreateInfo::single(qf)],
..Default::default()
})
.ok()?;
Some((instance, device, qf))
}
#[test]
fn generated_instance_enumerate_physical_devices_live() {
let Ok(instance) = Instance::new(InstanceCreateInfo::default()) else {
eprintln!("SKIP: Vulkan not available");
return;
};
let raw_physdevs = <Instance as InstanceSafeExt>::enumerate_physical_devices(&instance)
.expect("InstanceSafeExt::enumerate_physical_devices");
let safe_physdevs = instance
.enumerate_physical_devices()
.expect("Instance::enumerate_physical_devices (hand-written)");
assert_eq!(
raw_physdevs.len(),
safe_physdevs.len(),
"generated InstanceSafeExt::enumerate_physical_devices must match hand-written count"
);
}
#[test]
fn generated_device_wait_idle_live() {
let Some((_instance, device, _qf)) = bootstrap() else {
return;
};
<vulkane::safe::Device as DeviceSafeExt>::device_wait_idle(&device)
.expect("device_wait_idle must succeed on an idle device");
}
#[test]
fn generated_queue_wait_idle_live() {
let Some((_instance, device, qf)) = bootstrap() else {
return;
};
let queue = device.get_queue(qf, 0);
<vulkane::safe::Queue as QueueSafeExt>::queue_wait_idle(&queue)
.expect("queue_wait_idle must succeed on an idle queue");
}
#[test]
fn generated_physical_device_get_queue_family_properties_live() {
let Some((_instance, device, _qf)) = bootstrap() else {
return;
};
let _ = device;
let instance = Instance::new(InstanceCreateInfo::default()).unwrap();
for pd in instance.enumerate_physical_devices().unwrap_or_default() {
let generated = <vulkane::safe::PhysicalDevice as PhysicalDeviceSafeExt>::get_physical_device_queue_family_properties(&pd);
let handwritten = pd.queue_family_properties();
assert_eq!(
generated.len(),
handwritten.len(),
"PhysicalDeviceSafeExt::get_physical_device_queue_family_properties must match safe wrapper count"
);
}
}
#[test]
fn generated_physical_device_get_properties_live() {
let instance = match Instance::new(InstanceCreateInfo::default()) {
Ok(i) => i,
Err(_) => return,
};
for pd in instance.enumerate_physical_devices().unwrap_or_default() {
let generated = <vulkane::safe::PhysicalDevice as PhysicalDeviceSafeExt>::get_physical_device_properties(&pd);
let first_byte = generated.deviceName[0];
assert_ne!(
first_byte, 0,
"deviceName should be populated by the driver"
);
}
}