51 lines
No EOL
2.1 KiB
Rust
51 lines
No EOL
2.1 KiB
Rust
use ash::vk;
|
|
|
|
pub struct VkPhysicalDevice {
|
|
// Vulkan properties
|
|
handle: vk::PhysicalDevice,
|
|
properties: vk::PhysicalDeviceProperties,
|
|
features: vk::PhysicalDeviceFeatures,
|
|
queue_family_properties: Vec<vk::QueueFamilyProperties>,
|
|
}
|
|
|
|
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
|
|
}
|
|
} |