]> git.nega.tv - josh/narcissus/commitdiff
shark: Fix barriers!
authorJoshua Simmons <josh@nega.tv>
Mon, 18 Nov 2024 18:22:58 +0000 (19:22 +0100)
committerJoshua Simmons <josh@nega.tv>
Mon, 18 Nov 2024 18:22:58 +0000 (19:22 +0100)
We're clean on validation now.

engine/narcissus-gpu/src/backend/vulkan/barrier.rs
engine/narcissus-gpu/src/lib.rs
title/shark/src/main.rs

index 16aa810dd81547fdecf7a7c1ba23f97e537fc20f..d900a8e6a26514882648488c1ddfbd094a01d832 100644 (file)
@@ -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 {
index a2b2cab98de083046f1c04d25c08a081b78ca091..82f6c6d13ba8a4444ffb6ccb7722f462a4a4730a 100644 (file)
@@ -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,
         }
     }
 }
index b97833c0b945d4037dc1219099428387f28f5026..02f8e61ae91144d4853bf2e8c5a4934121838c5b 100644 (file)
@@ -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(