Refactor Vulkan device and instance handling

Refactor Vulkan initialization to merge logical and physical device management into a unified `VkDevice` struct. Improved logging for Vulkan instance creation and surface management. Added methods to `VkPhysicalDevice` and `VkSurface` for more detailed querying of physical device capabilities.
This commit is contained in:
Florian RICHER 2024-11-11 12:09:52 +01:00
parent b91571e777
commit d0c6f31a1a
Signed by: florian.richer
GPG key ID: C73D37CBED7BFC77
9 changed files with 233 additions and 59 deletions

View file

@ -1,6 +1,7 @@
use std::fmt::{Display, Formatter};
use ash::vk;
use crate::vulkan::utils::formatter::{format_driver_version, format_vulkan_version};
use crate::vulkan::vk_surface::VkSurface;
pub struct VkPhysicalDevice {
// Vulkan properties
@ -24,6 +25,39 @@ impl VkPhysicalDevice {
queue_family_properties: device_queue_families
}
}
pub fn find_queue_family_by(
&self,
queue_flags: Option<vk::QueueFlags>,
surface: Option<&VkSurface>
) -> Option<(u32, &vk::QueueFamilyProperties)> {
self.queue_family_properties
.iter()
.enumerate()
.find_map(|(index, queue_family_property)| {
let surface_check_passed = match surface {
Some(surface) => {
surface.physical_device_queue_supported(self, index as u32)
.unwrap_or(false)
}
None => true,
};
let queue_flags_check_passed = match queue_flags {
Some(queue_flags) => {
queue_family_property.queue_flags
.contains(queue_flags)
},
None => true
};
if surface_check_passed && queue_flags_check_passed {
Some((index as u32, queue_family_property))
} else {
None
}
})
}
pub fn priority(&self) -> usize {
match self.properties.device_type {