use std::sync::Arc; use vulkano::command_buffer::DynamicState; use vulkano::device::Device; use vulkano::format::Format; use vulkano::image::view::ImageView; use vulkano::image::{AttachmentImage, ImageUsage, SampleCount, SwapchainImage}; use vulkano::pipeline::viewport::Viewport; use vulkano::render_pass::{Framebuffer, FramebufferAbstract, RenderPass}; use winit::window::Window; use vulkano::swapchain::Swapchain; /// This method is called once during initialization, then again whenever the window is resized pub fn create_framebuffers(device: Arc, swapchain: &Arc>, images: &[Arc>], msaa_samples: Option, render_pass: Arc, dynamic_state: &mut DynamicState) -> Vec> { let dim_array = images[0].dimensions(); let dim_array_f32 = [dim_array[0] as f32, dim_array[1] as f32]; let viewport = Viewport { origin: [0.0, 0.0], dimensions: dim_array_f32, depth_range: 0.0..1.0, }; dynamic_state.viewports = Some(vec!(viewport)); let depth_image = if let Some(msaa_sample_count) = msaa_samples { AttachmentImage::multisampled_with_usage(device.clone(), dim_array, msaa_sample_count, Format::D16Unorm, ImageUsage { depth_stencil_attachment: true, ..ImageUsage::none() }).unwrap() } else { AttachmentImage::with_usage(device.clone(), dim_array, Format::D16Unorm, ImageUsage { depth_stencil_attachment: true, ..ImageUsage::none() }).unwrap() }; let msaa_buffers = if let Some(msaa_sample_count) = msaa_samples { Some(create_msaa_buffers(device.clone(), dim_array, swapchain, msaa_sample_count)) } else { None }; let mut framebuffers = vec![]; for i in 0..images.len() { let image_buffer = &images[i]; let image_view = ImageView::new(image_buffer.clone()).unwrap(); let depth_view = ImageView::new(depth_image.clone()).unwrap(); if let Some(msaa_buffers_exist) = &msaa_buffers { let msaa_view = ImageView::new((&msaa_buffers_exist[i]).clone()).unwrap(); framebuffers.push(Arc::new(Framebuffer::start(render_pass.clone()) .add(image_view).unwrap() .add(msaa_view).unwrap() .add(depth_view).unwrap() .build().unwrap() ) as Arc); } else { framebuffers.push(Arc::new(Framebuffer::start(render_pass.clone()) .add(image_view).unwrap() .add(depth_view).unwrap() .build().unwrap() ) as Arc); } } framebuffers } fn create_msaa_buffers(device: Arc, dimensions: [u32; 2], swapchain: &Arc>, sample_count: SampleCount) -> Vec> { let mut msaa_attachments = vec![]; for _ in 0..swapchain.num_images() { msaa_attachments.push(AttachmentImage::transient_multisampled(device.clone(), dimensions, sample_count, swapchain.format()).unwrap()); } msaa_attachments }