From 52b2d5a06ab5380af05cbfc941d8369a47497b7d Mon Sep 17 00:00:00 2001 From: hodasemi Date: Sat, 21 Jan 2023 22:47:40 +0100 Subject: [PATCH] Improve sub pass --- vulkan-rs/src/render_target/sub_pass.rs | 40 ++++++++++++------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/vulkan-rs/src/render_target/sub_pass.rs b/vulkan-rs/src/render_target/sub_pass.rs index e1cae49..d5e2228 100644 --- a/vulkan-rs/src/render_target/sub_pass.rs +++ b/vulkan-rs/src/render_target/sub_pass.rs @@ -61,7 +61,7 @@ impl CustomTarget { store_operation, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, - VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, if self.attach_sampler || self.use_as_input { VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL } else { @@ -87,7 +87,7 @@ impl CustomTarget { store_operation, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, - VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, ); @@ -114,6 +114,8 @@ impl CustomTarget { let image = image_builder.build(device, queue)?; + image.convert_layout(layout)?; + match aspect { VK_IMAGE_ASPECT_DEPTH_BIT => { Image::convert_layout(&image, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL)? @@ -136,7 +138,7 @@ impl CustomTarget { pub enum ResolveTarget { CustomTarget(CustomTarget), - PreparedTargets(Vec>), + PreparedTargets((Vec>, bool)), } impl From for ResolveTarget { @@ -145,19 +147,19 @@ impl From for ResolveTarget { } } -impl From>> for ResolveTarget { - fn from(prepared_targets: Vec>) -> Self { - Self::PreparedTargets(prepared_targets) +impl From<(Vec>, bool)> for ResolveTarget { + fn from((prepared_targets, clear_on_load): (Vec>, bool)) -> Self { + Self::PreparedTargets((prepared_targets, clear_on_load)) } } -impl<'a> From<&'a Vec>> for ResolveTarget { - fn from(prepared_targets: &'a Vec>) -> Self { - Self::PreparedTargets(prepared_targets.clone()) +impl<'a> From<(&'a Vec>, bool)> for ResolveTarget { + fn from((prepared_targets, clear_on_load): (&'a Vec>, bool)) -> Self { + Self::PreparedTargets((prepared_targets.clone(), clear_on_load)) } } -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug, PartialEq, Eq, Clone)] pub struct InputAttachmentInfo { pub sub_pass_index: usize, pub input_indices: Vec, @@ -236,23 +238,21 @@ impl<'a> SubPassBuilder<'a> { } pub fn build(self, device: &Arc) -> Result { - let attachments = self.create_images(device)?; - Ok(SubPass { extent: VkExtent2D { width: self.width, height: self.height, }, - input_info: self.input_info, - attachments, - + input_info: self.input_info.clone(), output_usage: self.output_usage, + + attachments: self.create_images(device)?, }) } #[inline] - fn create_images(&self, device: &Arc) -> Result> { + fn create_images(self, device: &Arc) -> Result> { // check for correct sample count let checked_sample_count = device.max_supported_sample_count(self.sample_count); @@ -263,7 +263,7 @@ impl<'a> SubPassBuilder<'a> { let mut attachment_infos = Vec::new(); - for target_info in self.target_infos.iter() { + for target_info in self.target_infos { attachment_infos.push(target_info.to_attachment_info( device, self.queue.as_ref().ok_or(anyhow::anyhow!( @@ -302,7 +302,7 @@ impl<'a> SubPassBuilder<'a> { } // add resolve target if possible - for resolve_target in self.resolve_targets.iter() { + for resolve_target in self.resolve_targets { match resolve_target { ResolveTarget::CustomTarget(custom_target) => { let mut attachment_info = custom_target.to_attachment_info( @@ -319,7 +319,7 @@ impl<'a> SubPassBuilder<'a> { attachment_infos.push(attachment_info); } - ResolveTarget::PreparedTargets(prepared_targets) => { + ResolveTarget::PreparedTargets((prepared_targets, clear_on_load)) => { attachment_infos.push(AttachmentInfo { images: prepared_targets.iter().map(|image| image.clone()).collect(), clear_value: VkClearValue::color(VkClearColorValue::float32([ @@ -330,7 +330,7 @@ impl<'a> SubPassBuilder<'a> { 0, prepared_targets[0].vk_format(), VK_SAMPLE_COUNT_1_BIT, - VK_ATTACHMENT_LOAD_OP_CLEAR, + Self::clear_op(clear_on_load), VK_ATTACHMENT_STORE_OP_STORE, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,