From 76c284a0739e0c927911e1f8bdf14e911f8f4eae Mon Sep 17 00:00:00 2001 From: Joshua Simmons Date: Mon, 18 Nov 2024 19:22:58 +0100 Subject: [PATCH] shark: Fix barriers! We're clean on validation now. --- .../src/backend/vulkan/barrier.rs | 32 +++++---- engine/narcissus-gpu/src/lib.rs | 2 + title/shark/src/main.rs | 67 +++++++++++-------- 3 files changed, 59 insertions(+), 42 deletions(-) diff --git a/engine/narcissus-gpu/src/backend/vulkan/barrier.rs b/engine/narcissus-gpu/src/backend/vulkan/barrier.rs index 16aa810..d900a8e 100644 --- a/engine/narcissus-gpu/src/backend/vulkan/barrier.rs +++ b/engine/narcissus-gpu/src/backend/vulkan/barrier.rs @@ -270,23 +270,27 @@ pub fn vulkan_image_memory_barrier( src_access_mask |= info.access; } - let layout = match barrier.prev_layout { - ImageLayout::Optimal => info.layout, - ImageLayout::General => { - if access == Access::PresentRead { - vk::ImageLayout::PresentSrcKhr - } else { - vk::ImageLayout::General + old_layout = if barrier.discard_contents { + vk::ImageLayout::Undefined + } else { + let layout = match barrier.prev_layout { + ImageLayout::Optimal => info.layout, + ImageLayout::General => { + if access == Access::PresentRead { + vk::ImageLayout::PresentSrcKhr + } else { + vk::ImageLayout::General + } } - } - }; + }; - debug_assert!( - old_layout == vk::ImageLayout::Undefined || old_layout == layout, - "mixed image layout" - ); + debug_assert!( + old_layout == vk::ImageLayout::Undefined || old_layout == layout, + "mixed image layout" + ); - old_layout = layout; + layout + }; } for &access in barrier.next_access { diff --git a/engine/narcissus-gpu/src/lib.rs b/engine/narcissus-gpu/src/lib.rs index a2b2cab..82f6c6d 100644 --- a/engine/narcissus-gpu/src/lib.rs +++ b/engine/narcissus-gpu/src/lib.rs @@ -762,6 +762,7 @@ pub struct ImageBarrier<'a> { pub next_layout: ImageLayout, pub image: Image, pub subresource_range: ImageSubresourceRange, + pub discard_contents: bool, } impl<'a> ImageBarrier<'a> { @@ -781,6 +782,7 @@ impl<'a> ImageBarrier<'a> { aspect, ..default() }, + discard_contents: false, } } } diff --git a/title/shark/src/main.rs b/title/shark/src/main.rs index b97833c..02f8e61 100644 --- a/title/shark/src/main.rs +++ b/title/shark/src/main.rs @@ -728,12 +728,15 @@ impl Images { gpu.cmd_barrier( cmd_encoder, None, - &[ImageBarrier::layout_optimal( - &[Access::None], - &[Access::TransferWrite], + &[ImageBarrier { + prev_access: &[Access::General], + next_access: &[Access::TransferWrite], + prev_layout: ImageLayout::Optimal, + next_layout: ImageLayout::Optimal, + subresource_range: ImageSubresourceRange::default(), image, - ImageAspectFlags::COLOR, - )], + discard_contents: true, + }], ); let buffer = gpu.request_transient_buffer_with_data( @@ -822,12 +825,13 @@ impl Images { cmd_encoder, None, &[ImageBarrier { - prev_access: &[Access::None], + prev_access: &[Access::General], next_access: &[Access::TransferWrite], prev_layout: ImageLayout::Optimal, next_layout: ImageLayout::Optimal, subresource_range: ImageSubresourceRange::default(), image, + discard_contents: true, }], ); @@ -856,14 +860,12 @@ impl Images { gpu.cmd_barrier( cmd_encoder, None, - &[ImageBarrier { - prev_access: &[Access::TransferWrite], - next_access: &[Access::ShaderSampledImageRead], - prev_layout: ImageLayout::Optimal, - next_layout: ImageLayout::Optimal, - subresource_range: ImageSubresourceRange::default(), + &[ImageBarrier::layout_optimal( + &[Access::TransferWrite], + &[Access::ShaderSampledImageRead], image, - }], + ImageAspectFlags::COLOR, + )], ); image @@ -1154,12 +1156,15 @@ impl<'gpu> DrawState<'gpu> { gpu.cmd_barrier( cmd_encoder, None, - &[ImageBarrier::layout_optimal( - &[Access::ShaderSampledImageRead], - &[Access::TransferWrite], - self.glyph_atlas_images[self.glyph_atlas_image_index & 1], - ImageAspectFlags::COLOR, - )], + &[ImageBarrier { + prev_access: &[Access::ShaderSampledImageRead], + prev_layout: ImageLayout::Optimal, + next_access: &[Access::TransferWrite], + next_layout: ImageLayout::Optimal, + image: self.glyph_atlas_images[self.glyph_atlas_image_index & 1], + subresource_range: default(), + discard_contents: true, + }], ); gpu.cmd_copy_buffer_to_image( @@ -1195,19 +1200,23 @@ impl<'gpu> DrawState<'gpu> { cmd_encoder, None, &[ - ImageBarrier::layout_optimal( - &[Access::None], - &[Access::ColorAttachmentWrite], - self.color_image, - ImageAspectFlags::COLOR, - ), ImageBarrier { - prev_access: &[Access::None], + prev_access: &[Access::ShaderOtherRead], + next_access: &[Access::ColorAttachmentWrite], + prev_layout: ImageLayout::Optimal, + next_layout: ImageLayout::Optimal, + image: self.color_image, + subresource_range: default(), + discard_contents: true, + }, + ImageBarrier { + prev_access: &[Access::ShaderOtherRead], next_access: &[Access::ComputeWrite], prev_layout: ImageLayout::Optimal, next_layout: ImageLayout::General, image: self.ui_image, subresource_range: default(), + discard_contents: true, }, ], ); @@ -1313,6 +1322,8 @@ impl<'gpu> DrawState<'gpu> { gpu.cmd_end_debug_marker(cmd_encoder); + gpu.cmd_compute_touch_swapchain(cmd_encoder, swapchain_image); + let compute_bind_group = gpu.request_transient_bind_group( frame, thread_token, @@ -1674,6 +1685,7 @@ impl<'gpu> DrawState<'gpu> { next_layout: ImageLayout::General, image: self.color_image, subresource_range: ImageSubresourceRange::default(), + discard_contents: false, }, ImageBarrier { prev_access: &[Access::ComputeWrite], @@ -1682,12 +1694,11 @@ impl<'gpu> DrawState<'gpu> { next_layout: ImageLayout::General, image: self.ui_image, subresource_range: ImageSubresourceRange::default(), + discard_contents: false, }, ], ); - gpu.cmd_compute_touch_swapchain(cmd_encoder, swapchain_image); - gpu.cmd_set_pipeline(cmd_encoder, self.pipelines.composite_pipeline); gpu.cmd_set_bind_group(cmd_encoder, 0, &compute_bind_group); gpu.cmd_push_constants( -- 2.49.0