From 555244b22100ac10b69631447f2aa3703b885966 Mon Sep 17 00:00:00 2001 From: janis Date: Sun, 12 Apr 2026 15:44:59 +0200 Subject: [PATCH] more barriers --- crates/renderer/src/render_graph/commands.rs | 24 +++++++++++--- crates/renderer/src/render_graph/recorder.rs | 19 +++++++++-- crates/renderer/src/render_graph/resources.rs | 32 ++++++++++++++++--- 3 files changed, 64 insertions(+), 11 deletions(-) diff --git a/crates/renderer/src/render_graph/commands.rs b/crates/renderer/src/render_graph/commands.rs index 959fe5a..45489d9 100644 --- a/crates/renderer/src/render_graph/commands.rs +++ b/crates/renderer/src/render_graph/commands.rs @@ -479,6 +479,16 @@ impl Command for Draw { fn apply(self, _recorder: &mut CommandRecorder) {} } +pub struct PipelineBarrier; + +impl Command for PipelineBarrier { + fn side_effects(&self, _map: SideEffectMap) {} + + fn apply(self, _recorder: &mut CommandRecorder) { + todo!() + } +} + pub trait Command: Sized { fn side_effects(&self, map: SideEffectMap); fn apply(self, recorder: &mut CommandRecorder); @@ -498,14 +508,20 @@ impl IsDrawData for DrawData {} impl IsDrawData for DrawIndexedData {} impl IsDrawData for DrawIndirectData { fn side_effects(&self, mut map: SideEffectMap) { - self.indirect_buffer - .side_effect(map.reborrow(), vk::AccessFlags2::INDIRECT_COMMAND_READ); + self.indirect_buffer.side_effect( + map.reborrow(), + vk::AccessFlags2::INDIRECT_COMMAND_READ, + None, + ); } } impl IsDrawData for DrawIndexedIndirectData { fn side_effects(&self, mut map: SideEffectMap) { - self.indirect_buffer - .side_effect(map.reborrow(), vk::AccessFlags2::INDIRECT_COMMAND_READ); + self.indirect_buffer.side_effect( + map.reborrow(), + vk::AccessFlags2::INDIRECT_COMMAND_READ, + None, + ); } } diff --git a/crates/renderer/src/render_graph/recorder.rs b/crates/renderer/src/render_graph/recorder.rs index bb79ef3..aaa85a5 100644 --- a/crates/renderer/src/render_graph/recorder.rs +++ b/crates/renderer/src/render_graph/recorder.rs @@ -1,5 +1,5 @@ use std::{ - collections::{BTreeMap, BTreeSet, HashMap}, + collections::{BTreeMap, BTreeSet}, mem::{MaybeUninit, size_of}, ptr::NonNull, }; @@ -11,7 +11,7 @@ use crate::{ images::ImageDesc, render_graph::{ commands::{Command, InsideRenderPass, OutsideRenderPass}, - resources::{ResourceAccess, ResourceId, TextureRegion, Write, access_flag_is_read}, + resources::{ResourceAccess, ResourceId, TextureRegion, Write}, }, }; @@ -180,7 +180,7 @@ impl CommandList { } } - fn fold_side_effects(&mut self) { + fn fold_side_effects(&self) -> Vec<(u32, super::commands::PipelineBarrier)> { // Buffer accesses can be granularly tracked by their offset and size; // Image accesses are tracked by their subresource range, which means all regions of the same mip/array layer are considered the same subresource for the purposes of ImageMemoryBarriers @@ -284,11 +284,22 @@ impl CommandList { for barrier in barriers { // stuff } + + todo!() } fn record_commands(&self, recorder: &mut CommandRecorder) { let mut cursor = 0; + let mut barriers = self.fold_side_effects(); + let mut command_index = 0; + while cursor < self.command_bytes.len() { + barriers + .drain(barriers.partition_point(|(idx, _)| *idx <= command_index)..) + .for_each(|(_, barrier)| { + barrier.apply(recorder); + }); + unsafe { let meta_ptr = self .command_bytes @@ -299,6 +310,8 @@ impl CommandList { let command_ptr = meta_ptr.add(1).cast::<()>().cast_mut(); (meta.apply_command)(recorder, NonNull::new_unchecked(command_ptr), &mut cursor); } + + command_index += 1; } } } diff --git a/crates/renderer/src/render_graph/resources.rs b/crates/renderer/src/render_graph/resources.rs index c9892a8..cce057f 100644 --- a/crates/renderer/src/render_graph/resources.rs +++ b/crates/renderer/src/render_graph/resources.rs @@ -2,10 +2,7 @@ use std::ops::Deref; use ash::vk; -use crate::{ - images::{Extent, MipRange, Offset}, - render_graph::recorder::SideEffectMap, -}; +use crate::{images::MipRange, render_graph::recorder::SideEffectMap}; pub trait Resource: Sized { fn id(&self) -> ResourceId; @@ -196,6 +193,26 @@ mod impls { } } } + impl Resource for TextureView { + fn id(&self) -> ResourceId { + self.texture.id() + } + + fn side_effect( + &self, + mut map: SideEffectMap, + access: vk::AccessFlags2, + layout: Option, + ) { + map.insert( + self.id(), + ResourceAccess { + range: (self.range, layout.unwrap_or_default()).into(), + access, + }, + ); + } + } impl Resource for Read { fn id(&self) -> ResourceId { @@ -513,6 +530,13 @@ pub struct TextureRegions { pub ranges: Vec, } +pub struct TextureView { + pub texture: Texture, + pub format: vk::Format, + pub mapping: vk::ComponentMapping, + pub range: TextureRange, +} + pub struct Read(pub T); pub struct Write(pub T); pub struct ReadWrite(pub T);