]> git.nega.tv - josh/narcissus/commitdiff
Re-arrange depth barrier
authorJoshua Simmons <josh@nega.tv>
Tue, 7 Feb 2023 22:12:53 +0000 (23:12 +0100)
committerJoshua Simmons <josh@nega.tv>
Tue, 7 Feb 2023 22:12:53 +0000 (23:12 +0100)
Avoid creating and submitting an extra command buffer when we don't
really need to.

narcissus-gpu/src/lib.rs
narcissus/src/main.rs

index 7e129ddfe35a9f382e3017e83fa0cd4146dfabb9..03d24f6dfb6fed9bfd5112e4274c8d620812db91 100644 (file)
@@ -606,10 +606,11 @@ pub struct ImageBarrier<'a> {
 }
 
 impl<'a> ImageBarrier<'a> {
-    pub fn with_access_optimal(
+    pub fn layout_optimal(
         prev_access: &'a [Access],
         next_access: &'a [Access],
         image: Image,
+        aspect: ImageAspectFlags,
     ) -> ImageBarrier<'a> {
         Self {
             prev_access,
@@ -617,7 +618,10 @@ impl<'a> ImageBarrier<'a> {
             prev_layout: ImageLayout::Optimal,
             next_layout: ImageLayout::Optimal,
             image,
-            subresource_range: default(),
+            subresource_range: ImageSubresourceRange {
+                aspect,
+                ..default()
+            },
         }
     }
 }
index bf4026e2a33f348f1c15ac6179cfbdd78c5486ae..b3d47b806f55ca08bcf91e2c43254208ddd4148a 100644 (file)
@@ -7,10 +7,10 @@ use narcissus_gpu::{
     BlendMode, Buffer, BufferDesc, BufferImageCopy, BufferUsageFlags, ClearValue, CompareOp,
     CullingMode, Device, Extent2d, Extent3d, FrontFace, GraphicsPipelineDesc,
     GraphicsPipelineLayout, Image, ImageAspectFlags, ImageBarrier, ImageDesc, ImageDimension,
-    ImageFormat, ImageLayout, ImageSubresourceRange, ImageUsageFlags, IndexType, LoadOp,
-    MemoryLocation, Offset2d, Offset3d, PolygonMode, RenderingAttachment, RenderingDesc,
-    SamplerAddressMode, SamplerDesc, SamplerFilter, Scissor, ShaderDesc, ShaderStageFlags, StoreOp,
-    ThreadToken, Topology, TypedBind, Viewport,
+    ImageFormat, ImageLayout, ImageUsageFlags, IndexType, LoadOp, MemoryLocation, Offset2d,
+    Offset3d, PolygonMode, RenderingAttachment, RenderingDesc, SamplerAddressMode, SamplerDesc,
+    SamplerFilter, Scissor, ShaderDesc, ShaderStageFlags, StoreOp, ThreadToken, Topology,
+    TypedBind, Viewport,
 };
 use narcissus_image as image;
 use narcissus_maths::{
@@ -177,10 +177,11 @@ fn create_image_with_data(
     device.cmd_barrier(
         &mut cmd_buffer,
         None,
-        &[ImageBarrier::with_access_optimal(
+        &[ImageBarrier::layout_optimal(
             &[Access::None],
             &[Access::TransferWrite],
             image,
+            ImageAspectFlags::COLOR,
         )],
     );
 
@@ -206,10 +207,11 @@ fn create_image_with_data(
     device.cmd_barrier(
         &mut cmd_buffer,
         None,
-        &[ImageBarrier::with_access_optimal(
+        &[ImageBarrier::layout_optimal(
             &[Access::TransferWrite],
             &[Access::FragmentShaderSampledImageRead],
             image,
+            ImageAspectFlags::COLOR,
         )],
     );
 
@@ -470,29 +472,7 @@ pub fn main() {
             }
         };
 
-        let frame_start = Instant::now() - start_time;
-        let frame_start = frame_start.as_secs_f32() * 0.125;
-
-        for (i, transform) in shark_transforms.iter_mut().enumerate() {
-            let direction = if i & 1 == 0 { 1.0 } else { -1.0 };
-            let (s, _) = sin_cos_pi_f32(frame_start + (i as f32) * 0.0125);
-            transform.translate.y = s;
-            transform.matrix *= Mat3::from_axis_rotation(Vec3::Y, HalfTurn::new(0.002 * direction))
-        }
-
-        transforms.write_slice(&shark_transforms);
-
-        let (s, c) = sin_cos_pi_f32(frame_start * 0.2);
-        let camera_height = c * 8.0;
-        let camera_radius = 20.0;
-        let eye = Point3::new(s * camera_radius, camera_height, c * camera_radius);
-        let center = Point3::ZERO;
-        let camera_from_model = Mat4::look_at(eye, center, Vec3::Y);
-        let clip_from_camera =
-            Mat4::perspective_rev_inf_zo(Deg::new(45.0).into(), width as f32 / height as f32, 0.01);
-        let clip_from_model = clip_from_camera * camera_from_model;
-
-        uniforms.write(Uniforms { clip_from_model });
+        let mut cmd_buffer = device.create_cmd_buffer(&frame, &thread_token);
 
         if width != depth_width || height != depth_height {
             device.destroy_image(&frame, depth_image);
@@ -509,34 +489,44 @@ pub fn main() {
                 mip_levels: 1,
             });
 
-            let mut cmd_buffer = device.create_cmd_buffer(&frame, &thread_token);
-
             device.cmd_barrier(
                 &mut cmd_buffer,
                 None,
-                &[ImageBarrier {
-                    prev_access: &[Access::None],
-                    next_access: &[Access::DepthStencilAttachmentWrite],
-                    prev_layout: ImageLayout::Optimal,
-                    next_layout: ImageLayout::Optimal,
-                    image: depth_image,
-                    subresource_range: ImageSubresourceRange {
-                        aspect: ImageAspectFlags::DEPTH,
-                        base_mip_level: 0,
-                        mip_level_count: 1,
-                        base_array_layer: 0,
-                        array_layer_count: 1,
-                    },
-                }],
+                &[ImageBarrier::layout_optimal(
+                    &[Access::None],
+                    &[Access::DepthStencilAttachmentWrite],
+                    depth_image,
+                    ImageAspectFlags::DEPTH,
+                )],
             );
 
-            device.submit(&frame, cmd_buffer);
-
             depth_width = width;
             depth_height = height;
         }
 
-        let mut cmd_buffer = device.create_cmd_buffer(&frame, &thread_token);
+        let frame_start = Instant::now() - start_time;
+        let frame_start = frame_start.as_secs_f32() * 0.125;
+
+        for (i, transform) in shark_transforms.iter_mut().enumerate() {
+            let direction = if i & 1 == 0 { 1.0 } else { -1.0 };
+            let (s, _) = sin_cos_pi_f32(frame_start + (i as f32) * 0.0125);
+            transform.translate.y = s;
+            transform.matrix *= Mat3::from_axis_rotation(Vec3::Y, HalfTurn::new(0.002 * direction))
+        }
+
+        transforms.write_slice(&shark_transforms);
+
+        let (s, c) = sin_cos_pi_f32(frame_start * 0.2);
+        let camera_height = c * 8.0;
+        let camera_radius = 20.0;
+        let eye = Point3::new(s * camera_radius, camera_height, c * camera_radius);
+        let center = Point3::ZERO;
+        let camera_from_model = Mat4::look_at(eye, center, Vec3::Y);
+        let clip_from_camera =
+            Mat4::perspective_rev_inf_zo(Deg::new(45.0).into(), width as f32 / height as f32, 0.01);
+        let clip_from_model = clip_from_camera * camera_from_model;
+
+        uniforms.write(Uniforms { clip_from_model });
 
         device.cmd_set_pipeline(&mut cmd_buffer, pipeline);