|
|
|
@ -533,15 +533,15 @@ fn setup_swapchain(
|
|
|
|
|
surface_loader: &surface::Instance,
|
|
|
|
|
swapchain_loader: &ash::khr::swapchain::Device,
|
|
|
|
|
instance: &Instance,
|
|
|
|
|
) -> vk::SwapchainKHR {
|
|
|
|
|
width: u32,
|
|
|
|
|
height: u32,
|
|
|
|
|
) -> (vk::SwapchainKHR, vk::Extent2D) {
|
|
|
|
|
let caps = unsafe {
|
|
|
|
|
surface_loader
|
|
|
|
|
.get_physical_device_surface_capabilities(*pdev, *surface)
|
|
|
|
|
.expect("Failed to get surface capabilities")
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
println!("Extents: {:?}", caps.current_extent);
|
|
|
|
|
|
|
|
|
|
let formats = unsafe {
|
|
|
|
|
surface_loader
|
|
|
|
|
.get_physical_device_surface_formats(*pdev, *surface)
|
|
|
|
@ -557,12 +557,20 @@ fn setup_swapchain(
|
|
|
|
|
.next()
|
|
|
|
|
.expect("No suitable format found");
|
|
|
|
|
|
|
|
|
|
// When the window is resized fast, then the caps goes out of sync of the target extents
|
|
|
|
|
// Thus we are using the passed-in (target) extents instead of the cap extents.
|
|
|
|
|
// assert_eq!(caps.current_extent.width, width);
|
|
|
|
|
// assert_eq!(caps.current_extent.height, height);
|
|
|
|
|
|
|
|
|
|
let swap_create = vk::SwapchainCreateInfoKHR::default()
|
|
|
|
|
.surface(*surface)
|
|
|
|
|
.min_image_count(caps.min_image_count)
|
|
|
|
|
.image_format(format.format)
|
|
|
|
|
.image_color_space(format.color_space)
|
|
|
|
|
.image_extent(caps.current_extent)
|
|
|
|
|
.image_extent(vk::Extent2D {
|
|
|
|
|
width: std::cmp::max(caps.current_extent.width, width),
|
|
|
|
|
height: std::cmp::max(caps.current_extent.height, height),
|
|
|
|
|
})
|
|
|
|
|
.image_array_layers(1)
|
|
|
|
|
.image_usage(vk::ImageUsageFlags::COLOR_ATTACHMENT)
|
|
|
|
|
.image_sharing_mode(vk::SharingMode::EXCLUSIVE)
|
|
|
|
@ -577,7 +585,7 @@ fn setup_swapchain(
|
|
|
|
|
.expect("Failed to create swapchain")
|
|
|
|
|
};
|
|
|
|
|
println!("Created swapchain");
|
|
|
|
|
swapchain
|
|
|
|
|
(swapchain, caps.current_extent)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn setup_desc_pool(dev: &Device) -> vk::DescriptorPool {
|
|
|
|
@ -1093,13 +1101,15 @@ fn main() {
|
|
|
|
|
let surface_loader = surface::Instance::new(&entry, &instance);
|
|
|
|
|
let swapchain_loader = swapchain::Device::new(&instance, &dev);
|
|
|
|
|
|
|
|
|
|
let mut swapchain = setup_swapchain(
|
|
|
|
|
let (mut swapchain, mut extents) = setup_swapchain(
|
|
|
|
|
&pdev,
|
|
|
|
|
&dev,
|
|
|
|
|
&surface,
|
|
|
|
|
&surface_loader,
|
|
|
|
|
&swapchain_loader,
|
|
|
|
|
&instance,
|
|
|
|
|
width,
|
|
|
|
|
height,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
let desc_pool = setup_desc_pool(&dev);
|
|
|
|
@ -1145,13 +1155,19 @@ fn main() {
|
|
|
|
|
} => {
|
|
|
|
|
width = w as u32;
|
|
|
|
|
height = h as u32;
|
|
|
|
|
swapchain = setup_swapchain(
|
|
|
|
|
unsafe {
|
|
|
|
|
dev.device_wait_idle().expect("Failed to wait for device idle");
|
|
|
|
|
swapchain_loader.destroy_swapchain(swapchain, None);
|
|
|
|
|
}
|
|
|
|
|
(swapchain, extents) = setup_swapchain(
|
|
|
|
|
&pdev,
|
|
|
|
|
&dev,
|
|
|
|
|
&surface,
|
|
|
|
|
&surface_loader,
|
|
|
|
|
&swapchain_loader,
|
|
|
|
|
&instance,
|
|
|
|
|
width,
|
|
|
|
|
height,
|
|
|
|
|
);
|
|
|
|
|
swap_images = make_swap_images(&dev, &swapchain, &swapchain_loader);
|
|
|
|
|
swap_views = make_swap_views(&dev, &swap_images, vk::Format::B8G8R8A8_UNORM);
|
|
|
|
|