use std::sync::Arc;
use vulkano::device::Device;
use vulkano::format::Format;
use vulkano::image::view::ImageView;
use vulkano::image::ImageAccess;
use vulkano::image::{AttachmentImage, ImageUsage, SwapchainImage};
use vulkano::memory::allocator::StandardMemoryAllocator;
use vulkano::render_pass::{Framebuffer, FramebufferCreateInfo, RenderPass};
use vulkano::swapchain::{PresentMode, Surface, Swapchain, SwapchainCreateInfo};
use winit::window::Window;
pub fn create_swapchain_and_images(
device: &Arc<Device>,
surface: &Arc<Surface>,
window: &Window,
) -> (Arc<Swapchain>, Vec<Arc<SwapchainImage>>) {
let caps = device
.physical_device()
.surface_capabilities(surface, Default::default())
.unwrap();
let format = device
.physical_device()
.surface_formats(surface, Default::default())
.unwrap()[0]
.0;
let (sw, img) = Swapchain::new(
device.clone(),
surface.clone(),
SwapchainCreateInfo {
min_image_count: caps.min_image_count, image_format: Some(format),
image_extent: window.inner_size().into(),
image_usage: ImageUsage::COLOR_ATTACHMENT, composite_alpha: caps.supported_composite_alpha.into_iter().next().unwrap(),
present_mode: PresentMode::Immediate, ..Default::default()
},
)
.unwrap();
(sw, img)
}
pub fn create_render_pass(
device: Arc<Device>,
swapchain: &Arc<Swapchain>,
) -> std::sync::Arc<RenderPass> {
vulkano::ordered_passes_renderpass!(
device.clone(),
attachments: {
color: {
load: Clear,
store: Store,
format: swapchain.image_format(),
samples: 1,
},
depth: {
load: Clear,
store: DontCare,
format: vulkano::format::Format::D16_UNORM,
samples: 1,
}
},
passes: [ {
color: [color],
depth_stencil: {depth},
input: []
} ],
)
.unwrap()
}
pub fn create_framebuffers(
images: &[Arc<SwapchainImage>],
render_pass: &Arc<RenderPass>,
memory_allocator: &StandardMemoryAllocator,
) -> Vec<Arc<Framebuffer>> {
let dims = images[0].dimensions().width_height();
let depth_image =
AttachmentImage::transient(memory_allocator, dims, Format::D16_UNORM).unwrap();
let depth_view = ImageView::new_default(depth_image).unwrap();
images
.iter()
.map(|image| {
let view = ImageView::new_default(image.clone()).unwrap();
Framebuffer::new(
render_pass.clone(),
FramebufferCreateInfo {
attachments: vec![view, depth_view.clone()],
..Default::default()
},
)
.unwrap()
})
.collect()
}