use ash::vk; pub struct VkPhysicalDevice { // Vulkan properties handle: vk::PhysicalDevice, properties: vk::PhysicalDeviceProperties, features: vk::PhysicalDeviceFeatures, queue_family_properties: Vec, } impl VkPhysicalDevice { pub fn new(instance: &ash::Instance, physical_device: vk::PhysicalDevice) -> Self { let device_properties = unsafe { instance.get_physical_device_properties(physical_device) }; let device_features = unsafe { instance.get_physical_device_features(physical_device) }; let device_queue_families = unsafe { instance.get_physical_device_queue_family_properties(physical_device) }; Self { handle: physical_device, properties: device_properties, features: device_features, queue_family_properties: device_queue_families } } pub fn priority(&self) -> usize { let mut priority = 0; let has_graphics_support = self.queue_family_properties.iter().any(|qf| qf.queue_flags.contains(vk::QueueFlags::GRAPHICS)); let has_compute_support = self.queue_family_properties.iter().any(|qf| qf.queue_flags.contains(vk::QueueFlags::COMPUTE)); let has_transfer_support = self.queue_family_properties.iter().any(|qf| qf.queue_flags.contains(vk::QueueFlags::TRANSFER)); let has_sparse_binding_support = self.queue_family_properties.iter().any(|qf| qf.queue_flags.contains(vk::QueueFlags::SPARSE_BINDING)); let physical_device_type = self.properties.device_type; priority |= has_graphics_support as usize; priority |= (has_sparse_binding_support as usize) << 1; priority |= (has_transfer_support as usize) << 2; priority |= (has_compute_support as usize) << 3; let weight : usize = match physical_device_type { vk::PhysicalDeviceType::CPU => 1, vk::PhysicalDeviceType::VIRTUAL_GPU => 2, vk::PhysicalDeviceType::INTEGRATED_GPU => 3, vk::PhysicalDeviceType::DISCRETE_GPU => 4, _ => 0 }; priority |= weight << 4; priority } }