From 7cb642eba7bb3f25dff14ce9a7b7916c2911b314 Mon Sep 17 00:00:00 2001 From: atlv Date: Tue, 5 Aug 2025 10:43:54 -0400 Subject: [PATCH] fix STATUS_HEAP_CORRUPTION crash in create_sampler (#8043) Co-authored-by: Erich Gubler --- CHANGELOG.md | 6 ++++++ wgpu-hal/src/vulkan/device.rs | 12 +++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 489efaa608..4360ce1600 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,12 @@ By @Vecvec in [#7913](https://github.com/gfx-rs/wgpu/pull/7913). Naga now requires that no type be larger than 1 GB. This limit may be lowered in the future; feedback on an appropriate value for the limit is welcome. By @andyleiserson in [#7950](https://github.com/gfx-rs/wgpu/pull/7950). +### Bug Fixes + +#### Vulkan + +Fix `STATUS_HEAP_CORRUPTION` crash when concurrently calling `create_sampler`. By @atlv24 in [#8043](https://github.com/gfx-rs/wgpu/pull/8043). + ## v26.0.2 (2025-07-23) ### Bug Fixes diff --git a/wgpu-hal/src/vulkan/device.rs b/wgpu-hal/src/vulkan/device.rs index 8705441692..1d22963531 100644 --- a/wgpu-hal/src/vulkan/device.rs +++ b/wgpu-hal/src/vulkan/device.rs @@ -1404,19 +1404,21 @@ impl crate::Device for super::Device { create_info = create_info.border_color(conv::map_border_color(color)); } - let raw = self - .shared - .sampler_cache - .lock() - .create_sampler(&self.shared.raw, create_info)?; + let mut sampler_cache_guard = self.shared.sampler_cache.lock(); + + let raw = sampler_cache_guard.create_sampler(&self.shared.raw, create_info)?; // Note: Cached samplers will just continually overwrite the label // // https://github.com/gfx-rs/wgpu/issues/6867 if let Some(label) = desc.label { + // SAFETY: we are holding a lock on the sampler cache, + // so we can only be setting the name from one thread. unsafe { self.shared.set_object_name(raw, label) }; } + drop(sampler_cache_guard); + self.counters.samplers.add(1); Ok(super::Sampler { raw, create_info })