From 33e8df0f4405fcccd77469959d72bddd07d3713b Mon Sep 17 00:00:00 2001 From: metamuffin <42977997+metamuffin@users.noreply.github.com> Date: Mon, 27 Jan 2025 18:01:57 +0100 Subject: [PATCH] Fix deadlock between snatchable_lock and trackers in Queue::write_texture (#7004) * Fix deadlock between snatchable_lock and trackers in Queue::write_texture * Fix another deadlock in write_texture between pending_writes and snatchable_lock. --- CHANGELOG.md | 1 + wgpu-core/src/device/queue.rs | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7f164f0d4..f0a7b70b17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -75,6 +75,7 @@ By @brodycj in [#6924](https://github.com/gfx-rs/wgpu/pull/6924). - Fix `wgpu` not building with `--no-default-features` on when targeting `wasm32-unknown-unknown`. By @wumpf in [#6946](https://github.com/gfx-rs/wgpu/pull/6946). - Fix `CopyExternalImageDestInfo` not exported on `wgpu`. By @wumpf in [#6962](https://github.com/gfx-rs/wgpu/pull/6962). - Fix drop order in `Surface`. By @ed-2100 in [#6997](https://github.com/gfx-rs/wgpu/pull/6997) +- Fix a possible deadlock within `Queue::write_texture`. By @metamuffin in [#7004](https://github.com/gfx-rs/wgpu/pull/7004) #### Vulkan diff --git a/wgpu-core/src/device/queue.rs b/wgpu-core/src/device/queue.rs index ded2de8d5e..e4211ef2f0 100644 --- a/wgpu-core/src/device/queue.rs +++ b/wgpu-core/src/device/queue.rs @@ -697,6 +697,8 @@ impl Queue { .map_err(TransferError::from)?; } + let snatch_guard = self.device.snatchable_lock.read(); + let mut pending_writes = self.pending_writes.lock(); let encoder = pending_writes.activate(); @@ -732,7 +734,7 @@ impl Queue { &mut trackers.textures, &self.device.alignments, self.device.zero_buffer.as_ref(), - &self.device.snatchable_lock.read(), + &snatch_guard, ) .map_err(QueueWriteError::from)?; } @@ -742,8 +744,6 @@ impl Queue { } } - let snatch_guard = self.device.snatchable_lock.read(); - let dst_raw = dst.try_raw(&snatch_guard)?; let (block_width, block_height) = dst.desc.format.block_dimensions();