queue transfer in graph barrier

This commit is contained in:
janis 2026-10-25 17:33:12 +01:00
parent f84b2a1ea4
commit 8d8595a0e3
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
3 changed files with 36 additions and 4 deletions

View file

@ -2,20 +2,24 @@
extern crate self as renderer_device; extern crate self as renderer_device;
use std::{fmt::Debug, path::PathBuf};
use ash::{ext, vk::{self, SurfaceCapabilitiesKHR}};
use dyn_clone::DynClone;
use crate::instance::InstanceInner; use crate::instance::InstanceInner;
use ash::{
ext,
vk::{self, SurfaceCapabilitiesKHR},
};
use dyn_clone::DynClone;
use std::{fmt::Debug, path::PathBuf};
mod debug;
pub mod device; pub mod device;
pub mod instance; pub mod instance;
pub mod pipeline_cache; pub mod pipeline_cache;
pub mod queue; pub mod queue;
pub mod sync; pub mod sync;
mod debug;
pub use device::{Device, DeviceOwned, DeviceRef, Extension}; pub use device::{Device, DeviceOwned, DeviceRef, Extension};
pub use instance::{DebugUtils, DebugUtilsCreateInfo, Instance}; pub use instance::{DebugUtils, DebugUtilsCreateInfo, Instance};
pub use queue::QueueFamilyIndex;
#[cfg(test)] #[cfg(test)]
mod device_ref_derive_tests { mod device_ref_derive_tests {

View file

@ -13,6 +13,8 @@ use renderer_resources::{
images::{Image as ImageResource, ImageDesc}, images::{Image as ImageResource, ImageDesc},
}; };
use renderer_device::QueueFamilyIndex;
use crate::{ use crate::{
recorder::{CommandIndex, CommandList, CommandRecorder, RecordError, scope_range}, recorder::{CommandIndex, CommandList, CommandRecorder, RecordError, scope_range},
resources::{ resources::{
@ -27,6 +29,12 @@ pub enum GraphError {
DependencyCycle, DependencyCycle,
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct QueueTransfer {
pub src: QueueFamilyIndex,
pub dst: QueueFamilyIndex,
}
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
pub struct BarrierResource { pub struct BarrierResource {
pub id: ResourceId, pub id: ResourceId,
@ -37,6 +45,7 @@ pub struct BarrierResource {
pub dst_access: vk::AccessFlags2, pub dst_access: vk::AccessFlags2,
pub old_layout: Option<vk::ImageLayout>, pub old_layout: Option<vk::ImageLayout>,
pub new_layout: Option<vk::ImageLayout>, pub new_layout: Option<vk::ImageLayout>,
pub queue_transfer: Option<QueueTransfer>,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -339,9 +348,18 @@ impl<'a> GraphCompiler<'a> {
batch_indices[command.index()] = batch_index; batch_indices[command.index()] = batch_index;
} }
} }
batches.iter().enumerate().flat_map(|(batch_index, batch)| {
batch
.iter()
.enumerate()
.map(move |(in_batch_index, &cmd)| (batch_index, in_batch_index, cmd))
});
let mut result = Vec::new(); let mut result = Vec::new();
for (ordered_index, &command_index) in order.iter().enumerate() { for (ordered_index, &command_index) in order.iter().enumerate() {
let mut barrier_resources = Vec::new(); let mut barrier_resources = Vec::new();
for current in &self.accesses[command_index.index()] { for current in &self.accesses[command_index.index()] {
let previous = order[..ordered_index] let previous = order[..ordered_index]
.iter() .iter()
@ -374,6 +392,7 @@ impl<'a> GraphCompiler<'a> {
dst_access: current.scope.access, dst_access: current.scope.access,
old_layout, old_layout,
new_layout, new_layout,
queue_transfer: None,
}); });
continue; continue;
@ -403,6 +422,7 @@ impl<'a> GraphCompiler<'a> {
dst_access: current.scope.access, dst_access: current.scope.access,
old_layout, old_layout,
new_layout, new_layout,
queue_transfer: None,
}); });
} }
} }

View file

@ -164,11 +164,19 @@ impl<'a> CommandRecorder<'a> {
.filter_map(|resource| match resource.range { .filter_map(|resource| match resource.range {
Subresource::Buffer(BufferRange { offset, size }) => { Subresource::Buffer(BufferRange { offset, size }) => {
self.buffers.get(&resource.id).map(|&buffer| { self.buffers.get(&resource.id).map(|&buffer| {
let (src, dst) = if let Some(queue_transfer) = resource.queue_transfer {
(queue_transfer.src.index(), queue_transfer.dst.index())
} else {
(vk::QUEUE_FAMILY_IGNORED, vk::QUEUE_FAMILY_IGNORED)
};
vk::BufferMemoryBarrier2::default() vk::BufferMemoryBarrier2::default()
.src_stage_mask(resource.src_stage) .src_stage_mask(resource.src_stage)
.src_access_mask(resource.src_access) .src_access_mask(resource.src_access)
.dst_stage_mask(resource.dst_stage) .dst_stage_mask(resource.dst_stage)
.dst_access_mask(resource.dst_access) .dst_access_mask(resource.dst_access)
.src_queue_family_index(src)
.dst_queue_family_index(dst)
.buffer(buffer) .buffer(buffer)
.offset(offset) .offset(offset)
.size(size) .size(size)