WIP "Physical devices and queue families"

TODO: "Queue families"
https://vulkan-tutorial.com/en/Drawing_a_triangle/Setup/Physical_devices_and_queue_families
This commit is contained in:
Stephen Seo 2024-03-05 13:52:25 +09:00
parent 38e05c90f2
commit e67fae00d6

View file

@ -123,6 +123,24 @@ fn create_debug_messenger_create_info() -> ffi::VkDebugUtilsMessengerCreateInfoE
} }
} }
fn is_device_suitable(dev: ffi::VkPhysicalDevice) -> bool {
let mut dev_props: ffi::VkPhysicalDeviceProperties = unsafe { std::mem::zeroed() };
unsafe {
ffi::vkGetPhysicalDeviceProperties(dev, std::ptr::addr_of_mut!(dev_props));
}
let mut dev_feat: ffi::VkPhysicalDeviceFeatures = unsafe { std::mem::zeroed() };
unsafe {
ffi::vkGetPhysicalDeviceFeatures(dev, std::ptr::addr_of_mut!(dev_feat));
}
// dev_props.deviceType == ffi::VkPhysicalDeviceType_VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU
// && dev_feat.geometryShader != 0
// Use previous checks for specifics, but for now, accept any GPU.
true
}
struct VulkanApp { struct VulkanApp {
window: *mut ffi::GLFWwindow, window: *mut ffi::GLFWwindow,
vk_instance: ffi::VkInstance, vk_instance: ffi::VkInstance,
@ -223,7 +241,8 @@ impl VulkanApp {
create_info.enabledLayerCount = VALIDATION_LAYERS.len() as u32; create_info.enabledLayerCount = VALIDATION_LAYERS.len() as u32;
create_info.ppEnabledLayerNames = VALIDATION_LAYERS.as_ptr() as *const *const i8; create_info.ppEnabledLayerNames = VALIDATION_LAYERS.as_ptr() as *const *const i8;
create_info.pNext = std::ptr::addr_of!(debug_messenger_create_info) as *const std::ffi::c_void; create_info.pNext =
std::ptr::addr_of!(debug_messenger_create_info) as *const std::ffi::c_void;
} }
let vk_result = unsafe { let vk_result = unsafe {
@ -239,6 +258,7 @@ impl VulkanApp {
} }
self.setup_debug_messenger(); self.setup_debug_messenger();
self.pick_physical_device();
} }
fn setup_debug_messenger(&mut self) { fn setup_debug_messenger(&mut self) {
@ -263,6 +283,45 @@ impl VulkanApp {
} }
} }
fn pick_physical_device(&mut self) {
let mut phys_device: ffi::VkPhysicalDevice = std::ptr::null_mut();
let mut dev_count: u32 = 0;
unsafe {
ffi::vkEnumeratePhysicalDevices(
self.vk_instance,
std::ptr::addr_of_mut!(dev_count),
std::ptr::null_mut(),
);
}
if dev_count == 0 {
panic!("Failed to find GPUs with Vulkan support!");
}
let mut phys_dev_handles_vec: Vec<ffi::VkPhysicalDevice> =
Vec::with_capacity(dev_count as usize);
phys_dev_handles_vec.resize(dev_count as usize, std::ptr::null_mut());
unsafe {
ffi::vkEnumeratePhysicalDevices(
self.vk_instance,
std::ptr::addr_of_mut!(dev_count),
phys_dev_handles_vec.as_mut_ptr(),
);
}
for phys_dev in phys_dev_handles_vec {
if is_device_suitable(phys_dev) {
phys_device = phys_dev;
break;
}
}
if phys_device.is_null() {
panic!("Failed to find a suitable GPU!");
}
}
fn main_loop(&mut self) { fn main_loop(&mut self) {
if self.window.is_null() { if self.window.is_null() {
panic!("ERROR: Cannot execute main loop if window is null!"); panic!("ERROR: Cannot execute main loop if window is null!");