vulkano_ecs/src/vulkan/vk_physical_device.rs
2024-11-07 14:05:09 +01:00

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
}
}