From 074fafad1e81fe2a167ea7d4609e91261d8da5fe Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Mon, 31 May 2021 21:03:35 -0700 Subject: [PATCH] Turn off reuse of command buffers for now It worked ok on Vulkan but is causing problems on DX12 and Metal. Punt for now and come back to this later when we do more sophisticated resource management. --- piet-gpu-hal/src/dx12.rs | 2 -- piet-gpu-hal/src/hub.rs | 9 +++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/piet-gpu-hal/src/dx12.rs b/piet-gpu-hal/src/dx12.rs index cb5fb3b..857fe3c 100644 --- a/piet-gpu-hal/src/dx12.rs +++ b/piet-gpu-hal/src/dx12.rs @@ -459,14 +459,12 @@ impl crate::backend::CmdBuf for CmdBuf { // This is a bit of a mess. Returning the allocator to the free pool // makes sense if the command list will be dropped, but not if it will // be reused. Probably need to implement some logic on drop. - /* if let Some(free_allocators) = self.free_allocators.upgrade() { free_allocators .lock() .unwrap() .push(self.allocator.take().unwrap()); } - */ } unsafe fn dispatch( diff --git a/piet-gpu-hal/src/hub.rs b/piet-gpu-hal/src/hub.rs index b280881..2791bc9 100644 --- a/piet-gpu-hal/src/hub.rs +++ b/piet-gpu-hal/src/hub.rs @@ -169,6 +169,11 @@ impl Session { let mut item = pending.swap_remove(i); // TODO: wait is superfluous, can just reset let _ = self.0.device.wait_and_reset(vec![&mut item.fence]); + + // Reuse of command buffers works on Vulkan, but not at all on + // Metal and is problematic on DX12 (the allocator is returned) + // to the pool. Punt for now. + /* let mut pool = self.0.cmd_buf_pool.lock().unwrap(); pool.push((item.cmd_buf, item.fence)); std::mem::drop(item.resources); @@ -176,6 +181,7 @@ impl Session { pool.push((staging_cmd_buf.cmd_buf, staging_cmd_buf.fence)); std::mem::drop(staging_cmd_buf.resources); } + */ } else { i += 1; } @@ -562,11 +568,14 @@ impl SubmittedCmdBuf { unsafe { session.device.wait_and_reset(vec![&mut item.fence])?; } + // See discussion in `poll_cleanup` + /* session .cmd_buf_pool .lock() .unwrap() .push((item.cmd_buf, item.fence)); + */ std::mem::drop(item.resources); } // else session dropped error?