From f013badc220d275ac4faf04d6b0d5328c86a698c Mon Sep 17 00:00:00 2001 From: Andrew O'Neil Date: Sat, 18 Mar 2023 11:51:43 +1100 Subject: [PATCH] Use vulkan synchronization2 --- kea_gpu/src/commands/recorder.rs | 25 ++++++++--------- kea_gpu/src/device/initialization.rs | 7 ++--- kea_gpu/src/storage/commands.rs | 14 +++++----- kea_renderer/src/path_tracer.rs | 40 ++++++++++++++-------------- 4 files changed, 42 insertions(+), 44 deletions(-) diff --git a/kea_gpu/src/commands/recorder.rs b/kea_gpu/src/commands/recorder.rs index 0caa37d..c45db8f 100644 --- a/kea_gpu/src/commands/recorder.rs +++ b/kea_gpu/src/commands/recorder.rs @@ -53,23 +53,20 @@ impl<'a> CommandBufferRecorder<'a> { pub fn pipeline_barrier( &self, - src_stage_mask: vk::PipelineStageFlags, - dst_stage_mask: vk::PipelineStageFlags, dependency_flags: vk::DependencyFlags, - memory_barriers: &[vk::MemoryBarrier], - buffer_memory_barriers: &[vk::BufferMemoryBarrier], - image_memory_barriers: &[vk::ImageMemoryBarrier], + memory_barriers: &[vk::MemoryBarrier2], + buffer_memory_barriers: &[vk::BufferMemoryBarrier2], + image_memory_barriers: &[vk::ImageMemoryBarrier2], ) { + let dependency_info = vk::DependencyInfo::builder() + .dependency_flags(dependency_flags) + .memory_barriers(memory_barriers) + .buffer_memory_barriers(buffer_memory_barriers) + .image_memory_barriers(image_memory_barriers); unsafe { - self.device().raw().cmd_pipeline_barrier( - self.buffer.raw(), - src_stage_mask, - dst_stage_mask, - dependency_flags, - memory_barriers, - buffer_memory_barriers, - image_memory_barriers, - ); + self.device() + .raw() + .cmd_pipeline_barrier2(self.buffer.raw(), &dependency_info); } } diff --git a/kea_gpu/src/device/initialization.rs b/kea_gpu/src/device/initialization.rs index 21664cb..f650a36 100644 --- a/kea_gpu/src/device/initialization.rs +++ b/kea_gpu/src/device/initialization.rs @@ -48,12 +48,13 @@ pub fn create_device( let extension_names: Vec<*const c_char> = extensions.iter().map(|ext| ext.name()).collect(); info!("Requested device extensions: {:?}", extensions); - let features = vk::PhysicalDeviceFeatures::builder() - .shader_int64(true); + let features = vk::PhysicalDeviceFeatures::builder().shader_int64(true); let mut features_12 = vk::PhysicalDeviceVulkan12Features::builder() .buffer_device_address(true) .vulkan_memory_model(true); - let mut features_13 = vk::PhysicalDeviceVulkan13Features::builder().dynamic_rendering(true); + let mut features_13 = vk::PhysicalDeviceVulkan13Features::builder() + .dynamic_rendering(true) + .synchronization2(true); let mut features_rt = vk::PhysicalDeviceRayTracingPipelineFeaturesKHR::builder().ray_tracing_pipeline(true); let mut features_as = diff --git a/kea_gpu/src/storage/commands.rs b/kea_gpu/src/storage/commands.rs index 28f30c6..332b8e5 100644 --- a/kea_gpu/src/storage/commands.rs +++ b/kea_gpu/src/storage/commands.rs @@ -28,13 +28,15 @@ impl<'a> CommandBufferRecorder<'a> { image: &Image, old_layout: vk::ImageLayout, new_layout: vk::ImageLayout, - src_access_mask: vk::AccessFlags, - dst_access_mask: vk::AccessFlags, - src_stage_mask: vk::PipelineStageFlags, - dst_stage_mask: vk::PipelineStageFlags, + src_access_mask: vk::AccessFlags2, + dst_access_mask: vk::AccessFlags2, + src_stage_mask: vk::PipelineStageFlags2, + dst_stage_mask: vk::PipelineStageFlags2, ) { - let barrier = vk::ImageMemoryBarrier::builder() + let barrier = vk::ImageMemoryBarrier2::builder() + .src_stage_mask(src_stage_mask) .src_access_mask(src_access_mask) + .dst_stage_mask(dst_stage_mask) .dst_access_mask(dst_access_mask) .old_layout(old_layout) .new_layout(new_layout) @@ -48,8 +50,6 @@ impl<'a> CommandBufferRecorder<'a> { ); self.pipeline_barrier( - src_stage_mask, - dst_stage_mask, vk::DependencyFlags::empty(), &[], &[], diff --git a/kea_renderer/src/path_tracer.rs b/kea_renderer/src/path_tracer.rs index 8c52572..386f50b 100644 --- a/kea_renderer/src/path_tracer.rs +++ b/kea_renderer/src/path_tracer.rs @@ -108,10 +108,10 @@ impl PathTracer { &image_view.image(), vk::ImageLayout::UNDEFINED, vk::ImageLayout::GENERAL, - vk::AccessFlags::empty(), - vk::AccessFlags::empty(), - vk::PipelineStageFlags::TOP_OF_PIPE, - vk::PipelineStageFlags::TOP_OF_PIPE, + vk::AccessFlags2::empty(), + vk::AccessFlags2::empty(), + vk::PipelineStageFlags2::TOP_OF_PIPE, + vk::PipelineStageFlags2::TOP_OF_PIPE, ) }, ); @@ -163,20 +163,20 @@ impl PathTracer { &swapchain_image.image(), vk::ImageLayout::UNDEFINED, vk::ImageLayout::TRANSFER_DST_OPTIMAL, - vk::AccessFlags::empty(), - vk::AccessFlags::TRANSFER_WRITE, - vk::PipelineStageFlags::TOP_OF_PIPE, - vk::PipelineStageFlags::TRANSFER, + vk::AccessFlags2::empty(), + vk::AccessFlags2::TRANSFER_WRITE, + vk::PipelineStageFlags2::TOP_OF_PIPE, + vk::PipelineStageFlags2::TRANSFER, ); cmd.transition_image_layout( &self.storage_image.image(), vk::ImageLayout::GENERAL, vk::ImageLayout::TRANSFER_SRC_OPTIMAL, - vk::AccessFlags::empty(), - vk::AccessFlags::TRANSFER_READ, - vk::PipelineStageFlags::TOP_OF_PIPE, - vk::PipelineStageFlags::TRANSFER, + vk::AccessFlags2::empty(), + vk::AccessFlags2::TRANSFER_READ, + vk::PipelineStageFlags2::TOP_OF_PIPE, + vk::PipelineStageFlags2::TRANSFER, ); let copy_region = vk::ImageCopy::builder() @@ -209,20 +209,20 @@ impl PathTracer { swapchain_image.image(), vk::ImageLayout::TRANSFER_DST_OPTIMAL, vk::ImageLayout::PRESENT_SRC_KHR, - vk::AccessFlags::TRANSFER_WRITE, - vk::AccessFlags::COLOR_ATTACHMENT_READ, - vk::PipelineStageFlags::TRANSFER, - vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT, + vk::AccessFlags2::TRANSFER_WRITE, + vk::AccessFlags2::COLOR_ATTACHMENT_READ, + vk::PipelineStageFlags2::TRANSFER, + vk::PipelineStageFlags2::COLOR_ATTACHMENT_OUTPUT, ); cmd.transition_image_layout( &self.storage_image.image(), vk::ImageLayout::TRANSFER_SRC_OPTIMAL, vk::ImageLayout::GENERAL, - vk::AccessFlags::TRANSFER_WRITE, - vk::AccessFlags::empty(), - vk::PipelineStageFlags::TRANSFER, - vk::PipelineStageFlags::TOP_OF_PIPE, + vk::AccessFlags2::TRANSFER_WRITE, + vk::AccessFlags2::empty(), + vk::PipelineStageFlags2::TRANSFER, + vk::PipelineStageFlags2::TOP_OF_PIPE, ); });