WIP impl "Querying details of swap chain support"
TODO: "Choosing the right settings for the swap chain" https://vulkan-tutorial.com/en/Drawing_a_triangle/Presentation/Swap_chain
This commit is contained in:
parent
2d8ded2111
commit
cc275989b1
1 changed files with 90 additions and 1 deletions
91
src/main.rs
91
src/main.rs
|
@ -123,6 +123,22 @@ impl QueueFamilyIndices {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct SwapChainSupportDetails {
|
||||||
|
capabilities: ffi::VkSurfaceCapabilitiesKHR,
|
||||||
|
formats: Vec<ffi::VkSurfaceFormatKHR>,
|
||||||
|
present_modes: Vec<ffi::VkPresentModeKHR>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for SwapChainSupportDetails {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
capabilities: unsafe { std::mem::zeroed() },
|
||||||
|
formats: Vec::new(),
|
||||||
|
present_modes: Vec::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct VulkanApp {
|
struct VulkanApp {
|
||||||
window: *mut ffi::GLFWwindow,
|
window: *mut ffi::GLFWwindow,
|
||||||
vk_instance: ffi::VkInstance,
|
vk_instance: ffi::VkInstance,
|
||||||
|
@ -486,7 +502,16 @@ impl VulkanApp {
|
||||||
// && dev_feat.geometryShader != 0
|
// && dev_feat.geometryShader != 0
|
||||||
|
|
||||||
// Use previous checks for specifics, but for now, accept GPUs with required support.
|
// Use previous checks for specifics, but for now, accept GPUs with required support.
|
||||||
self.find_queue_families(dev).is_complete() && self.check_device_extensions_support(dev)
|
let extensions_supported = self.check_device_extensions_support(dev);
|
||||||
|
|
||||||
|
let mut swap_chain_adequate = false;
|
||||||
|
if extensions_supported {
|
||||||
|
let swap_chain_support = self.query_swap_chain_support(dev);
|
||||||
|
swap_chain_adequate = !swap_chain_support.formats.is_empty()
|
||||||
|
&& !swap_chain_support.present_modes.is_empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
self.find_queue_families(dev).is_complete() && extensions_supported && swap_chain_adequate
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_device_extensions_support(&self, dev: ffi::VkPhysicalDevice) -> bool {
|
fn check_device_extensions_support(&self, dev: ffi::VkPhysicalDevice) -> bool {
|
||||||
|
@ -526,6 +551,70 @@ impl VulkanApp {
|
||||||
|
|
||||||
req_extensions.is_empty()
|
req_extensions.is_empty()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn query_swap_chain_support(&self, device: ffi::VkPhysicalDevice) -> SwapChainSupportDetails {
|
||||||
|
if self.surface.is_null() {
|
||||||
|
panic!("surface must be initialized before calling query_swap_chain_support!");
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut swap_chain_support_details = SwapChainSupportDetails::default();
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
ffi::vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
|
||||||
|
device,
|
||||||
|
self.surface,
|
||||||
|
std::ptr::addr_of_mut!(swap_chain_support_details.capabilities),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut format_count: u32 = 0;
|
||||||
|
unsafe {
|
||||||
|
ffi::vkGetPhysicalDeviceSurfaceFormatsKHR(
|
||||||
|
device,
|
||||||
|
self.surface,
|
||||||
|
std::ptr::addr_of_mut!(format_count),
|
||||||
|
std::ptr::null_mut(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if format_count != 0 {
|
||||||
|
swap_chain_support_details
|
||||||
|
.formats
|
||||||
|
.resize(format_count as usize, unsafe { std::mem::zeroed() });
|
||||||
|
unsafe {
|
||||||
|
ffi::vkGetPhysicalDeviceSurfaceFormatsKHR(
|
||||||
|
device,
|
||||||
|
self.surface,
|
||||||
|
std::ptr::addr_of_mut!(format_count),
|
||||||
|
swap_chain_support_details.formats.as_mut_ptr(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut present_mode_count: u32 = 0;
|
||||||
|
unsafe {
|
||||||
|
ffi::vkGetPhysicalDeviceSurfacePresentModesKHR(
|
||||||
|
device,
|
||||||
|
self.surface,
|
||||||
|
std::ptr::addr_of_mut!(present_mode_count),
|
||||||
|
std::ptr::null_mut(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if present_mode_count != 0 {
|
||||||
|
swap_chain_support_details
|
||||||
|
.present_modes
|
||||||
|
.resize(present_mode_count as usize, unsafe { std::mem::zeroed() });
|
||||||
|
unsafe {
|
||||||
|
ffi::vkGetPhysicalDeviceSurfacePresentModesKHR(
|
||||||
|
device,
|
||||||
|
self.surface,
|
||||||
|
std::ptr::addr_of_mut!(present_mode_count),
|
||||||
|
swap_chain_support_details.present_modes.as_mut_ptr(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
swap_chain_support_details
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for VulkanApp {
|
impl Drop for VulkanApp {
|
||||||
|
|
Loading…
Reference in a new issue