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 { 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]) } 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() diff --git a/src/gfx_apis/vulkan/transfer.rs b/src/gfx_apis/vulkan/transfer.rs index 13d8bd93..e108bb5a 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(); @@ -676,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 {