vulkan: abstract over the release sync type
This commit is contained in:
parent
3ecee1b17f
commit
2ac3519f2d
8 changed files with 166 additions and 137 deletions
|
|
@ -2,9 +2,9 @@ use {
|
|||
crate::{
|
||||
cpu_worker::CpuWorker,
|
||||
format::Format,
|
||||
gfx_api::SyncFile,
|
||||
gfx_api::FdSync,
|
||||
gfx_apis::vulkan::{
|
||||
VulkanError, VulkanFence,
|
||||
VulkanError, VulkanSync,
|
||||
allocator::VulkanAllocation,
|
||||
command::VulkanCommandBuffer,
|
||||
image::{QueueFamily, QueueState, VulkanImage, VulkanImageMemory},
|
||||
|
|
@ -14,7 +14,7 @@ use {
|
|||
},
|
||||
rect::Rect,
|
||||
utils::errorfmt::ErrorFmt,
|
||||
vulkan_core::fence::VulkanDeviceFenceExt,
|
||||
vulkan_core::sync::VulkanDeviceSyncExt,
|
||||
},
|
||||
ash::vk::{
|
||||
AccessFlags2, Buffer, BufferImageCopy2, BufferMemoryBarrier2, CommandBufferBeginInfo,
|
||||
|
|
@ -136,7 +136,7 @@ impl VulkanShmImage {
|
|||
ptr::copy_nonoverlapping(buf, mem, total_size as usize);
|
||||
}
|
||||
})?;
|
||||
let (cmd, fence, sync_file, point) = self.submit_buffer_image_copy(
|
||||
let (cmd, vulkan_sync, sync, point) = self.submit_buffer_image_copy(
|
||||
img,
|
||||
staging.buffer,
|
||||
staging.size,
|
||||
|
|
@ -147,7 +147,7 @@ impl VulkanShmImage {
|
|||
)?;
|
||||
let future = img.renderer.eng.spawn(
|
||||
"await upload",
|
||||
await_upload(point, img.clone(), cmd, sync_file, fence, staging),
|
||||
await_upload(point, img.clone(), cmd, sync, vulkan_sync, staging),
|
||||
);
|
||||
img.renderer.pending_submits.set(point, future);
|
||||
Ok(())
|
||||
|
|
@ -162,15 +162,7 @@ impl VulkanShmImage {
|
|||
use_transfer_queue: bool,
|
||||
tt: TransferType,
|
||||
foreign_buffer: bool,
|
||||
) -> Result<
|
||||
(
|
||||
Rc<VulkanCommandBuffer>,
|
||||
Rc<VulkanFence>,
|
||||
Option<SyncFile>,
|
||||
u64,
|
||||
),
|
||||
VulkanError,
|
||||
> {
|
||||
) -> Result<(Rc<VulkanCommandBuffer>, VulkanSync, Option<FdSync>, u64), VulkanError> {
|
||||
let mut transfer_queue_family_idx = img.renderer.device.graphics_queue_idx;
|
||||
if use_transfer_queue
|
||||
&& let Some(idx) = img.renderer.device.distinct_transfer_queue_family_idx
|
||||
|
|
@ -281,7 +273,7 @@ impl VulkanShmImage {
|
|||
SubmitInfo2::default().command_buffer_infos(slice::from_ref(&command_buffer_info));
|
||||
let begin_info =
|
||||
CommandBufferBeginInfo::default().flags(CommandBufferUsageFlags::ONE_TIME_SUBMIT);
|
||||
let release_fence = img.renderer.device.create_fence()?;
|
||||
let vulkan_sync = img.renderer.device.create_sync()?;
|
||||
unsafe {
|
||||
dev.begin_command_buffer(cmd.buffer, &begin_info)
|
||||
.map_err(VulkanError::BeginCommandBuffer)?;
|
||||
|
|
@ -313,7 +305,7 @@ impl VulkanShmImage {
|
|||
_ => img.renderer.device.graphics_queue,
|
||||
},
|
||||
slice::from_ref(&submit_info),
|
||||
release_fence.fence,
|
||||
vulkan_sync.fence(),
|
||||
)
|
||||
.inspect_err(img.renderer.device.idl())
|
||||
.map_err(VulkanError::Submit)?;
|
||||
|
|
@ -322,16 +314,9 @@ impl VulkanShmImage {
|
|||
img.is_undefined.set(false);
|
||||
img.contents_are_undefined.set(false);
|
||||
}
|
||||
let release_sync_file = match release_fence.export_sync_file() {
|
||||
Ok(s) => s,
|
||||
Err(e) => {
|
||||
log::error!("Could not export sync file from fence: {}", ErrorFmt(e));
|
||||
img.renderer.block();
|
||||
None
|
||||
}
|
||||
};
|
||||
let release_sync = vulkan_sync.to_sync(|| img.renderer.block());
|
||||
let point = img.renderer.allocate_point();
|
||||
Ok((cmd, release_fence, release_sync_file, point))
|
||||
Ok((cmd, vulkan_sync, release_sync, point))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -339,12 +324,12 @@ async fn await_upload(
|
|||
id: u64,
|
||||
img: Rc<VulkanImage>,
|
||||
buf: Rc<VulkanCommandBuffer>,
|
||||
sync_file: Option<SyncFile>,
|
||||
_fence: Rc<VulkanFence>,
|
||||
sync: Option<FdSync>,
|
||||
vulkan_sync: VulkanSync,
|
||||
_staging: VulkanStagingBuffer,
|
||||
) {
|
||||
if let Some(sync_file) = sync_file
|
||||
&& let Err(e) = img.renderer.ring.readable(&sync_file.0).await
|
||||
if let Some(sync) = &sync
|
||||
&& let Err(e) = sync.try_signaled(&img.renderer.ring).await
|
||||
{
|
||||
log::error!(
|
||||
"Could not wait for sync file to become readable: {}",
|
||||
|
|
@ -352,6 +337,7 @@ async fn await_upload(
|
|||
);
|
||||
img.renderer.block();
|
||||
}
|
||||
vulkan_sync.handle_validation();
|
||||
img.renderer.gfx_command_buffers.buffers.push(buf);
|
||||
img.renderer.pending_submits.remove(&id);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue