]> git.nega.tv - josh/narcissus/commitdiff
narcissus-gpu: Add some image barrier helpers
authorJosh Simmons <josh@nega.tv>
Mon, 18 Nov 2024 19:45:51 +0000 (20:45 +0100)
committerJosh Simmons <josh@nega.tv>
Mon, 18 Nov 2024 19:45:51 +0000 (20:45 +0100)
engine/narcissus-gpu/src/lib.rs
title/shark/src/main.rs

index 82f6c6d13ba8a4444ffb6ccb7722f462a4a4730a..4ea89b127b2297f2d46d451d80f49967aede56ea 100644 (file)
@@ -766,15 +766,47 @@ pub struct ImageBarrier<'a> {
 }
 
 impl<'a> ImageBarrier<'a> {
-    pub fn layout_optimal(
-        prev_access: &'a [Access],
-        next_access: &'a [Access],
+    pub fn optimal(
+        prev_access: &'a Access,
+        next_access: &'a Access,
+        image: Image,
+    ) -> ImageBarrier<'a> {
+        Self {
+            prev_access: std::slice::from_ref(prev_access),
+            next_access: std::slice::from_ref(next_access),
+            prev_layout: ImageLayout::Optimal,
+            next_layout: ImageLayout::Optimal,
+            image,
+            subresource_range: default(),
+            discard_contents: false,
+        }
+    }
+
+    pub fn optimal_discard(
+        prev_access: &'a Access,
+        next_access: &'a Access,
+        image: Image,
+    ) -> ImageBarrier<'a> {
+        Self {
+            prev_access: std::slice::from_ref(prev_access),
+            next_access: std::slice::from_ref(next_access),
+            prev_layout: ImageLayout::Optimal,
+            next_layout: ImageLayout::Optimal,
+            image,
+            subresource_range: default(),
+            discard_contents: true,
+        }
+    }
+
+    pub fn optimal_aspect(
+        prev_access: &'a Access,
+        next_access: &'a Access,
         image: Image,
         aspect: ImageAspectFlags,
     ) -> ImageBarrier<'a> {
         Self {
-            prev_access,
-            next_access,
+            prev_access: std::slice::from_ref(prev_access),
+            next_access: std::slice::from_ref(next_access),
             prev_layout: ImageLayout::Optimal,
             next_layout: ImageLayout::Optimal,
             image,
@@ -785,6 +817,38 @@ impl<'a> ImageBarrier<'a> {
             discard_contents: false,
         }
     }
+
+    pub fn general(
+        prev_access: &'a Access,
+        next_access: &'a Access,
+        image: Image,
+    ) -> ImageBarrier<'a> {
+        Self {
+            prev_access: std::slice::from_ref(prev_access),
+            next_access: std::slice::from_ref(next_access),
+            prev_layout: ImageLayout::General,
+            next_layout: ImageLayout::General,
+            image,
+            subresource_range: default(),
+            discard_contents: false,
+        }
+    }
+
+    pub fn general_discard(
+        prev_access: &'a Access,
+        next_access: &'a Access,
+        image: Image,
+    ) -> ImageBarrier<'a> {
+        Self {
+            prev_access: std::slice::from_ref(prev_access),
+            next_access: std::slice::from_ref(next_access),
+            prev_layout: ImageLayout::General,
+            next_layout: ImageLayout::General,
+            image,
+            subresource_range: default(),
+            discard_contents: true,
+        }
+    }
 }
 
 thread_token_def!(ThreadToken, GpuConcurrent, 8);
index 02f8e61ae91144d4853bf2e8c5a4934121838c5b..e7fc9f912097c18d4a68b72b1a697c6df21bdd80 100644 (file)
@@ -728,15 +728,11 @@ impl Images {
             gpu.cmd_barrier(
                 cmd_encoder,
                 None,
-                &[ImageBarrier {
-                    prev_access: &[Access::General],
-                    next_access: &[Access::TransferWrite],
-                    prev_layout: ImageLayout::Optimal,
-                    next_layout: ImageLayout::Optimal,
-                    subresource_range: ImageSubresourceRange::default(),
+                &[ImageBarrier::optimal_discard(
+                    &Access::General,
+                    &Access::TransferWrite,
                     image,
-                    discard_contents: true,
-                }],
+                )],
             );
 
             let buffer = gpu.request_transient_buffer_with_data(
@@ -764,11 +760,10 @@ impl Images {
             gpu.cmd_barrier(
                 cmd_encoder,
                 None,
-                &[ImageBarrier::layout_optimal(
-                    &[Access::TransferWrite],
-                    &[Access::FragmentShaderSampledImageRead],
+                &[ImageBarrier::optimal(
+                    &Access::TransferWrite,
+                    &Access::FragmentShaderSampledImageRead,
                     image,
-                    ImageAspectFlags::COLOR,
                 )],
             );
 
@@ -824,15 +819,11 @@ impl Images {
             gpu.cmd_barrier(
                 cmd_encoder,
                 None,
-                &[ImageBarrier {
-                    prev_access: &[Access::General],
-                    next_access: &[Access::TransferWrite],
-                    prev_layout: ImageLayout::Optimal,
-                    next_layout: ImageLayout::Optimal,
-                    subresource_range: ImageSubresourceRange::default(),
+                &[ImageBarrier::optimal_discard(
+                    &Access::General,
+                    &Access::TransferWrite,
                     image,
-                    discard_contents: true,
-                }],
+                )],
             );
 
             let buffer = gpu.request_transient_buffer_with_data(
@@ -860,11 +851,10 @@ impl Images {
             gpu.cmd_barrier(
                 cmd_encoder,
                 None,
-                &[ImageBarrier::layout_optimal(
-                    &[Access::TransferWrite],
-                    &[Access::ShaderSampledImageRead],
+                &[ImageBarrier::optimal(
+                    &Access::TransferWrite,
+                    &Access::ShaderSampledImageRead,
                     image,
-                    ImageAspectFlags::COLOR,
                 )],
             );
 
@@ -1053,11 +1043,10 @@ impl<'gpu> DrawState<'gpu> {
                     gpu.cmd_barrier(
                         cmd_encoder,
                         None,
-                        &[ImageBarrier::layout_optimal(
-                            &[Access::None],
-                            &[Access::FragmentShaderSampledImageRead],
+                        &[ImageBarrier::optimal_discard(
+                            &Access::None,
+                            &Access::FragmentShaderSampledImageRead,
                             *glyph_atlas_image,
-                            ImageAspectFlags::COLOR,
                         )],
                     );
                 }
@@ -1122,9 +1111,9 @@ impl<'gpu> DrawState<'gpu> {
                 gpu.cmd_barrier(
                     cmd_encoder,
                     None,
-                    &[ImageBarrier::layout_optimal(
-                        &[Access::None],
-                        &[Access::DepthStencilAttachmentWrite],
+                    &[ImageBarrier::optimal_aspect(
+                        &Access::None,
+                        &Access::DepthStencilAttachmentWrite,
                         self.depth_image,
                         ImageAspectFlags::DEPTH,
                     )],
@@ -1156,15 +1145,11 @@ impl<'gpu> DrawState<'gpu> {
                 gpu.cmd_barrier(
                     cmd_encoder,
                     None,
-                    &[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,
-                    }],
+                    &[ImageBarrier::optimal_discard(
+                        &Access::ShaderSampledImageRead,
+                        &Access::TransferWrite,
+                        self.glyph_atlas_images[self.glyph_atlas_image_index & 1],
+                    )],
                 );
 
                 gpu.cmd_copy_buffer_to_image(
@@ -1185,11 +1170,10 @@ impl<'gpu> DrawState<'gpu> {
                 gpu.cmd_barrier(
                     cmd_encoder,
                     None,
-                    &[ImageBarrier::layout_optimal(
-                        &[Access::TransferWrite],
-                        &[Access::ShaderSampledImageRead],
+                    &[ImageBarrier::optimal(
+                        &Access::TransferWrite,
+                        &Access::ShaderSampledImageRead,
                         self.glyph_atlas_images[self.glyph_atlas_image_index & 1],
-                        ImageAspectFlags::COLOR,
                     )],
                 );
 
@@ -1200,24 +1184,16 @@ impl<'gpu> DrawState<'gpu> {
                 cmd_encoder,
                 None,
                 &[
-                    ImageBarrier {
-                        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,
-                    },
+                    ImageBarrier::optimal_discard(
+                        &Access::ShaderOtherRead,
+                        &Access::ColorAttachmentWrite,
+                        self.color_image,
+                    ),
+                    ImageBarrier::general_discard(
+                        &Access::ShaderOtherRead,
+                        &Access::ComputeWrite,
+                        self.ui_image,
+                    ),
                 ],
             );
 
@@ -1680,22 +1656,18 @@ impl<'gpu> DrawState<'gpu> {
                     &[
                         ImageBarrier {
                             prev_access: &[Access::ColorAttachmentWrite],
-                            prev_layout: ImageLayout::Optimal,
                             next_access: &[Access::ShaderOtherRead],
+                            prev_layout: ImageLayout::Optimal,
                             next_layout: ImageLayout::General,
                             image: self.color_image,
                             subresource_range: ImageSubresourceRange::default(),
                             discard_contents: false,
                         },
-                        ImageBarrier {
-                            prev_access: &[Access::ComputeWrite],
-                            prev_layout: ImageLayout::General,
-                            next_access: &[Access::ComputeOtherRead],
-                            next_layout: ImageLayout::General,
-                            image: self.ui_image,
-                            subresource_range: ImageSubresourceRange::default(),
-                            discard_contents: false,
-                        },
+                        ImageBarrier::general(
+                            &Access::ComputeWrite,
+                            &Access::ComputeOtherRead,
+                            self.ui_image,
+                        ),
                     ],
                 );