From 6726d53b4751b7d210a9e65e1bc6990e306e2153 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Mon, 23 Mar 2026 18:47:50 +0100 Subject: [PATCH 1/5] vulkan: permanently disable async shm resources on error --- src/gfx_apis/vulkan/transfer.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/gfx_apis/vulkan/transfer.rs b/src/gfx_apis/vulkan/transfer.rs index 13d8bd93..4ca4fa3d 100644 --- a/src/gfx_apis/vulkan/transfer.rs +++ b/src/gfx_apis/vulkan/transfer.rs @@ -54,9 +54,12 @@ pub struct VulkanShmImageAsyncData { impl VulkanShmImageAsyncData { fn complete(&self, result: Result<(), VulkanError>) { - self.busy.set(false); - if let Some(staging) = self.staging.take() { - staging.busy.set(false); + let staging = self.staging.take(); + if result.is_ok() { + self.busy.set(false); + if let Some(staging) = staging { + staging.busy.set(false); + } } self.buffer.take(); self.client_mem.take(); From 3659006417542bd9115803829bfc497fb534ec1d Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Mon, 23 Mar 2026 18:22:17 +0100 Subject: [PATCH 2/5] vulkan: add missing return in error case --- src/gfx_apis/vulkan/transfer.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gfx_apis/vulkan/transfer.rs b/src/gfx_apis/vulkan/transfer.rs index 4ca4fa3d..e108bb5a 100644 --- a/src/gfx_apis/vulkan/transfer.rs +++ b/src/gfx_apis/vulkan/transfer.rs @@ -679,6 +679,7 @@ fn complete_async_host_copy( store(data); if let Err(e) = res { data.complete(Err(VulkanError::AsyncCopyToStaging(e))); + return; } data.data_copied.set(true); match tt { From 122e28139adbaec6ceded73eb06c590156a5ed3e Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Mon, 23 Mar 2026 18:52:37 +0100 Subject: [PATCH 3/5] vulkan: fix incoherent_range size calculation --- src/gfx_apis/vulkan/allocator.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gfx_apis/vulkan/allocator.rs b/src/gfx_apis/vulkan/allocator.rs index c7fd5c1a..0cdffd0c 100644 --- a/src/gfx_apis/vulkan/allocator.rs +++ b/src/gfx_apis/vulkan/allocator.rs @@ -100,10 +100,12 @@ impl VulkanAllocation { } fn incoherent_range(&self, mask: u64) -> MappedMemoryRange<'static> { + let lo = self.offset & !mask; + let hi = (self.offset + self.size + mask) & !mask; MappedMemoryRange::default() .memory(self.memory) - .offset(self.offset & !mask) - .size((self.size + mask) & !mask) + .offset(lo) + .size(hi - lo) } fn device(&self) -> &VulkanDevice { From d527e17d582df99a42b36209beefd1d430df3cdf Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Mon, 23 Mar 2026 18:58:13 +0100 Subject: [PATCH 4/5] vulkan: fix dst stage when downloading shm image --- src/gfx_apis/vulkan/shm_image.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gfx_apis/vulkan/shm_image.rs b/src/gfx_apis/vulkan/shm_image.rs index 06e347d7..0d816fef 100644 --- a/src/gfx_apis/vulkan/shm_image.rs +++ b/src/gfx_apis/vulkan/shm_image.rs @@ -258,7 +258,10 @@ impl VulkanShmImage { TransferType::Upload => AccessFlags2::SHADER_SAMPLED_READ, TransferType::Download => AccessFlags2::COLOR_ATTACHMENT_WRITE, }) - .dst_stage_mask(PipelineStageFlags2::FRAGMENT_SHADER); + .dst_stage_mask(match tt { + TransferType::Upload => PipelineStageFlags2::FRAGMENT_SHADER, + TransferType::Download => PipelineStageFlags2::COLOR_ATTACHMENT_OUTPUT, + }); } let final_buffer_barrier = memory_barrier(true); let final_dep_info = DependencyInfoKHR::default() From a61c98aaecc93a2701c045408649ffbeaac14612 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Mon, 23 Mar 2026 19:09:57 +0100 Subject: [PATCH 5/5] vulkan: don't create empty copy regions --- src/gfx_apis/vulkan/renderer.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gfx_apis/vulkan/renderer.rs b/src/gfx_apis/vulkan/renderer.rs index 911fa6a8..3d3d1411 100644 --- a/src/gfx_apis/vulkan/renderer.rs +++ b/src/gfx_apis/vulkan/renderer.rs @@ -2304,6 +2304,9 @@ where } let x2 = x2.min(fb.width as i32); let y2 = y2.min(fb.height as i32); + if x1 == x2 || y1 == y2 { + return None; + } Some([x1, y1, x2, y2]) }