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:
parent
b91571e777
commit
d0c6f31a1a
9 changed files with 233 additions and 59 deletions
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue