queue transfer in graph barrier
This commit is contained in:
parent
f84b2a1ea4
commit
8d8595a0e3
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue