From 778e8d74f0d3fee6b1fa2206c6dfc2bfd88932b9 Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Thu, 23 Jul 2020 23:27:27 +0200 Subject: [PATCH] engine/render: enable 8xMSAA --- engine/src/render/vulkan/mod.rs | 6 ++- engine/src/render/vulkan/swapchain_binding.rs | 41 ++++++++++++++----- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/engine/src/render/vulkan/mod.rs b/engine/src/render/vulkan/mod.rs index b9dc156..793fda0 100644 --- a/engine/src/render/vulkan/mod.rs +++ b/engine/src/render/vulkan/mod.rs @@ -241,7 +241,11 @@ impl Instance { let mut primary = vc::AutoCommandBufferBuilder::primary_one_time_submit(device.clone(), qf) .unwrap() - .begin_render_pass(framebuffer.clone(), true, vec![[0.0, 0.0, 0.0, 1.0].into(), vulkano::format::ClearValue::Depth(1.0)]) + .begin_render_pass(framebuffer.clone(), true, vec![ + [0.0, 0.0, 0.0, 1.0].into(), + vulkano::format::ClearValue::Depth(1.0), + vulkano::format::ClearValue::None, + ]) .unwrap(); diff --git a/engine/src/render/vulkan/swapchain_binding.rs b/engine/src/render/vulkan/swapchain_binding.rs index 5aaa8a4..eaa1124 100644 --- a/engine/src/render/vulkan/swapchain_binding.rs +++ b/engine/src/render/vulkan/swapchain_binding.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use vulkano::swapchain as vs; use vulkano::image as vm; +use vulkano::image::traits::ImageAccess; use vulkano::format as vf; use vulkano::framebuffer as vfb; use vulkano::sync as vy; @@ -34,6 +35,7 @@ impl SwapchainBinding { let image_usage = vm::ImageUsage { color_attachment: true, + transfer_destination: true, .. vm::ImageUsage::none() }; @@ -88,14 +90,18 @@ impl SwapchainBinding { log::info!("Swap chain: present mode {:?}, {} images", present_mode, images.len()); let depth_format = Self::find_depth_format(); - let depth_image = vm::AttachmentImage::with_usage( + // TODO(q3k): make configurable and check with hardware + let sample_count = 8; + + let depth_image = vm::AttachmentImage::multisampled_with_usage( surface_binding.device.clone(), chain.dimensions(), + sample_count, depth_format, vm::ImageUsage { depth_stencil_attachment: true, ..vm::ImageUsage::none() }, ).unwrap(); - let render_pass = Self::create_render_pass(surface_binding, chain.format(), depth_format); - let framebuffers = Self::create_framebuffers(render_pass.clone(), images.clone(), depth_image); + let render_pass = Self::create_render_pass(surface_binding, chain.format(), depth_format, sample_count); + let framebuffers = Self::create_framebuffers(surface_binding, render_pass.clone(), images.clone(), depth_image, sample_count); Self { chain, @@ -109,43 +115,58 @@ impl SwapchainBinding { surface_binding: &super::surface_binding::SurfaceBinding, color_format: vf::Format, depth_format: vf::Format, + sample_count: u32, ) -> Arc { let device = surface_binding.device.clone(); Arc::new(vulkano::single_pass_renderpass!(device, attachments: { - color: { + multisample_color: { load: Clear, store: Store, format: color_format, - samples: 1, + samples: sample_count, }, - depth: { + multisample_depth: { load: Clear, store: DontCare, format: depth_format, - samples: 1, + samples: sample_count, initial_layout: ImageLayout::Undefined, final_layout: ImageLayout::DepthStencilAttachmentOptimal, + }, + resolve_color: { + load: DontCare, + store: Store, + format: color_format, + samples: 1, + initial_layout: ImageLayout::Undefined, } }, pass: { - color: [color], - depth_stencil: {depth} + color: [multisample_color], + depth_stencil: {multisample_depth}, + resolve: [resolve_color] } ).unwrap()) } fn create_framebuffers( + surface_binding: &super::surface_binding::SurfaceBinding, render_pass: Arc, images: Vec>>, depth_image: Arc>, + sample_count: u32, ) -> Vec> { + let device = surface_binding.device.clone(); images.iter() .map(|image| { + let dim = image.dimensions().width_height(); + let multisample_image = vm::AttachmentImage::transient_multisampled(device.clone(), dim, sample_count, image.format()).unwrap(); let fba: Arc = Arc::new(vfb::Framebuffer::start(render_pass.clone()) - .add(image.clone()).unwrap() + .add(multisample_image.clone()).unwrap() .add(depth_image.clone()).unwrap() + .add(image.clone()).unwrap() .build().unwrap()); fba })