From 1f6ac35e83f9869b1e0c0690fc0d1b509ed2f6a9 Mon Sep 17 00:00:00 2001 From: teoxoy <28601907+teoxoy@users.noreply.github.com> Date: Mon, 1 Jul 2024 12:43:26 +0200 Subject: [PATCH] change `Storage.force_replace` to take an `Arc` --- wgpu-core/src/device/resource.rs | 7 ++++--- wgpu-core/src/registry.rs | 2 +- wgpu-core/src/storage.rs | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/wgpu-core/src/device/resource.rs b/wgpu-core/src/device/resource.rs index 4c44d19ea..362810257 100644 --- a/wgpu-core/src/device/resource.rs +++ b/wgpu-core/src/device/resource.rs @@ -2590,7 +2590,7 @@ impl Device { for (bgl_id, map) in ids.group_ids.iter_mut().zip(derived_group_layouts) { let bgl = self.create_bind_group_layout(&None, map, bgl::Origin::Derived)?; - bgl_registry.force_replace(*bgl_id, bgl); + bgl_registry.force_replace(*bgl_id, Arc::new(bgl)); } let layout_desc = binding_model::PipelineLayoutDescriptor { @@ -2599,8 +2599,9 @@ impl Device { push_constant_ranges: Cow::Borrowed(&[]), //TODO? }; let layout = self.create_pipeline_layout(&layout_desc, bgl_registry)?; - pipeline_layout_registry.force_replace(ids.root_id, layout); - Ok(pipeline_layout_registry.get(ids.root_id).unwrap()) + let layout = Arc::new(layout); + pipeline_layout_registry.force_replace(ids.root_id, layout.clone()); + Ok(layout) } pub(crate) fn create_compute_pipeline( diff --git a/wgpu-core/src/registry.rs b/wgpu-core/src/registry.rs index 9ec9668d9..1f2bdecd5 100644 --- a/wgpu-core/src/registry.rs +++ b/wgpu-core/src/registry.rs @@ -129,7 +129,7 @@ impl Registry { self.identity.free(id); storage.remove(id) } - pub(crate) fn force_replace(&self, id: Id, value: T) { + pub(crate) fn force_replace(&self, id: Id, value: Arc) { let mut storage = self.storage.write(); storage.force_replace(id, value) } diff --git a/wgpu-core/src/storage.rs b/wgpu-core/src/storage.rs index 31b2af1e1..77c2e36b3 100644 --- a/wgpu-core/src/storage.rs +++ b/wgpu-core/src/storage.rs @@ -164,10 +164,10 @@ where } } - pub(crate) fn force_replace(&mut self, id: Id, value: T) { + pub(crate) fn force_replace(&mut self, id: Id, value: Arc) { log::trace!("User is replacing {}{:?}", T::TYPE, id); let (index, epoch, _) = id.unzip(); - self.map[index as usize] = Element::Occupied(Arc::new(value), epoch); + self.map[index as usize] = Element::Occupied(value, epoch); } pub(crate) fn remove(&mut self, id: Id) -> Option> {