From ad7b08afb17391946b009aca6c5c42eef404f0b8 Mon Sep 17 00:00:00 2001 From: Joshua Simmons Date: Tue, 7 Feb 2023 23:12:53 +0100 Subject: [PATCH] Re-arrange depth barrier Avoid creating and submitting an extra command buffer when we don't really need to. --- narcissus-gpu/src/lib.rs | 8 +++- narcissus/src/main.rs | 86 ++++++++++++++++++---------------------- 2 files changed, 44 insertions(+), 50 deletions(-) diff --git a/narcissus-gpu/src/lib.rs b/narcissus-gpu/src/lib.rs index 7e129dd..03d24f6 100644 --- a/narcissus-gpu/src/lib.rs +++ b/narcissus-gpu/src/lib.rs @@ -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() + }, } } } diff --git a/narcissus/src/main.rs b/narcissus/src/main.rs index bf4026e..b3d47b8 100644 --- a/narcissus/src/main.rs +++ b/narcissus/src/main.rs @@ -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); -- 2.49.0