Skip to content

Commit d814851

Browse files
[wgpu-core] pass resources as Arcs when adding them to the registry (#5499)
* [wgpu-core] pass resources as Arcs when adding them to the registry (fix #5493) * [wgpu-core] also add `Arc::new` to `#[cfg(dx12)]` blocks * [wgpu-core] allow `clippy::arc_with_non_send_sync`
1 parent 1c48a23 commit d814851

File tree

5 files changed

+48
-36
lines changed

5 files changed

+48
-36
lines changed

wgpu-core/src/device/global.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ impl Global {
257257
hal::BufferUses::COPY_DST
258258
};
259259

260-
let (id, resource) = fid.assign(buffer);
260+
let (id, resource) = fid.assign(Arc::new(buffer));
261261
api_log!("Device::create_buffer({desc:?}) -> {id:?}");
262262

263263
device
@@ -572,7 +572,7 @@ impl Global {
572572
Err(error) => break error,
573573
};
574574

575-
let (id, resource) = fid.assign(texture);
575+
let (id, resource) = fid.assign(Arc::new(texture));
576576
api_log!("Device::create_texture({desc:?}) -> {id:?}");
577577

578578
device
@@ -646,7 +646,7 @@ impl Global {
646646
texture.initialization_status =
647647
RwLock::new(TextureInitTracker::new(desc.mip_level_count, 0));
648648

649-
let (id, resource) = fid.assign(texture);
649+
let (id, resource) = fid.assign(Arc::new(texture));
650650
api_log!("Device::create_texture({desc:?}) -> {id:?}");
651651

652652
device
@@ -699,7 +699,7 @@ impl Global {
699699

700700
let buffer = device.create_buffer_from_hal(hal_buffer, desc);
701701

702-
let (id, buffer) = fid.assign(buffer);
702+
let (id, buffer) = fid.assign(Arc::new(buffer));
703703
api_log!("Device::create_buffer -> {id:?}");
704704

705705
device
@@ -818,7 +818,7 @@ impl Global {
818818
Err(e) => break e,
819819
};
820820

821-
let (id, resource) = fid.assign(view);
821+
let (id, resource) = fid.assign(Arc::new(view));
822822

823823
{
824824
let mut views = texture.views.lock();
@@ -900,7 +900,7 @@ impl Global {
900900
Err(e) => break e,
901901
};
902902

903-
let (id, resource) = fid.assign(sampler);
903+
let (id, resource) = fid.assign(Arc::new(sampler));
904904
api_log!("Device::create_sampler -> {id:?}");
905905
device.trackers.lock().samplers.insert_single(resource);
906906

@@ -982,7 +982,7 @@ impl Global {
982982
let bgl =
983983
device.create_bind_group_layout(&desc.label, entry_map, bgl::Origin::Pool)?;
984984

985-
let (id_inner, arc) = fid.take().unwrap().assign(bgl);
985+
let (id_inner, arc) = fid.take().unwrap().assign(Arc::new(bgl));
986986
id = Some(id_inner);
987987

988988
Ok(arc)
@@ -1063,7 +1063,7 @@ impl Global {
10631063
Err(e) => break e,
10641064
};
10651065

1066-
let (id, _) = fid.assign(layout);
1066+
let (id, _) = fid.assign(Arc::new(layout));
10671067
api_log!("Device::create_pipeline_layout -> {id:?}");
10681068
return (id, None);
10691069
};
@@ -1130,7 +1130,7 @@ impl Global {
11301130
Err(e) => break e,
11311131
};
11321132

1133-
let (id, resource) = fid.assign(bind_group);
1133+
let (id, resource) = fid.assign(Arc::new(bind_group));
11341134

11351135
let weak_ref = Arc::downgrade(&resource);
11361136
for range in &resource.used_texture_ranges {
@@ -1245,7 +1245,7 @@ impl Global {
12451245
Err(e) => break e,
12461246
};
12471247

1248-
let (id, _) = fid.assign(shader);
1248+
let (id, _) = fid.assign(Arc::new(shader));
12491249
api_log!("Device::create_shader_module -> {id:?}");
12501250
return (id, None);
12511251
};
@@ -1302,7 +1302,7 @@ impl Global {
13021302
Ok(shader) => shader,
13031303
Err(e) => break e,
13041304
};
1305-
let (id, _) = fid.assign(shader);
1305+
let (id, _) = fid.assign(Arc::new(shader));
13061306
api_log!("Device::create_shader_module_spirv -> {id:?}");
13071307
return (id, None);
13081308
};
@@ -1367,7 +1367,7 @@ impl Global {
13671367
.map(|s| s.to_string()),
13681368
);
13691369

1370-
let (id, _) = fid.assign(command_buffer);
1370+
let (id, _) = fid.assign(Arc::new(command_buffer));
13711371
api_log!("Device::create_command_encoder -> {id:?}");
13721372
return (id.transmute(), None);
13731373
};
@@ -1460,7 +1460,7 @@ impl Global {
14601460
Err(e) => break e,
14611461
};
14621462

1463-
let (id, resource) = fid.assign(render_bundle);
1463+
let (id, resource) = fid.assign(Arc::new(render_bundle));
14641464
api_log!("RenderBundleEncoder::finish -> {id:?}");
14651465
device.trackers.lock().bundles.insert_single(resource);
14661466
return (id, None);
@@ -1523,7 +1523,7 @@ impl Global {
15231523
Err(err) => break err,
15241524
};
15251525

1526-
let (id, resource) = fid.assign(query_set);
1526+
let (id, resource) = fid.assign(Arc::new(query_set));
15271527
api_log!("Device::create_query_set -> {id:?}");
15281528
device.trackers.lock().query_sets.insert_single(resource);
15291529

@@ -1601,7 +1601,7 @@ impl Global {
16011601
Err(e) => break e,
16021602
};
16031603

1604-
let (id, resource) = fid.assign(pipeline);
1604+
let (id, resource) = fid.assign(Arc::new(pipeline));
16051605
api_log!("Device::create_render_pipeline -> {id:?}");
16061606

16071607
device
@@ -1734,7 +1734,7 @@ impl Global {
17341734
Err(e) => break e,
17351735
};
17361736

1737-
let (id, resource) = fid.assign(pipeline);
1737+
let (id, resource) = fid.assign(Arc::new(pipeline));
17381738
api_log!("Device::create_compute_pipeline -> {id:?}");
17391739

17401740
device

wgpu-core/src/device/queue.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ impl Global {
490490
prepare_staging_buffer(device, buffer_size.get(), device.instance_flags)?;
491491

492492
let fid = hub.staging_buffers.prepare(id_in);
493-
let (id, _) = fid.assign(staging_buffer);
493+
let (id, _) = fid.assign(Arc::new(staging_buffer));
494494
resource_log!("Queue::create_staging_buffer {id:?}");
495495

496496
Ok((id, staging_buffer_ptr))

wgpu-core/src/instance.rs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,8 @@ impl Global {
525525
raw: hal_surface,
526526
};
527527

528-
let (id, _) = self.surfaces.prepare(id_in).assign(surface);
528+
#[allow(clippy::arc_with_non_send_sync)]
529+
let (id, _) = self.surfaces.prepare(id_in).assign(Arc::new(surface));
529530
Ok(id)
530531
}
531532

@@ -558,7 +559,7 @@ impl Global {
558559
},
559560
};
560561

561-
let (id, _) = self.surfaces.prepare(id_in).assign(surface);
562+
let (id, _) = self.surfaces.prepare(id_in).assign(Arc::new(surface));
562563
id
563564
}
564565

@@ -587,7 +588,7 @@ impl Global {
587588
},
588589
};
589590

590-
let (id, _) = self.surfaces.prepare(id_in).assign(surface);
591+
let (id, _) = self.surfaces.prepare(id_in).assign(Arc::new(surface));
591592
id
592593
}
593594

@@ -616,7 +617,7 @@ impl Global {
616617
},
617618
};
618619

619-
let (id, _) = self.surfaces.prepare(id_in).assign(surface);
620+
let (id, _) = self.surfaces.prepare(id_in).assign(Arc::new(surface));
620621
id
621622
}
622623

@@ -647,7 +648,7 @@ impl Global {
647648
},
648649
};
649650

650-
let (id, _) = self.surfaces.prepare(id_in).assign(surface);
651+
let (id, _) = self.surfaces.prepare(id_in).assign(Arc::new(surface));
651652
id
652653
}
653654

@@ -707,7 +708,7 @@ impl Global {
707708
for raw in hal_adapters {
708709
let adapter = Adapter::new(raw);
709710
log::info!("Adapter {:?} {:?}", A::VARIANT, adapter.raw.info);
710-
let (id, _) = hub.adapters.prepare(id_backend).assign(adapter);
711+
let (id, _) = hub.adapters.prepare(id_backend).assign(Arc::new(adapter));
711712
list.push(id);
712713
}
713714
}
@@ -754,7 +755,10 @@ impl Global {
754755
None => {
755756
let adapter = Adapter::new(list.swap_remove(*selected));
756757
log::info!("Adapter {:?} {:?}", A::VARIANT, adapter.raw.info);
757-
let (id, _) = HalApi::hub(self).adapters.prepare(new_id).assign(adapter);
758+
let (id, _) = HalApi::hub(self)
759+
.adapters
760+
.prepare(new_id)
761+
.assign(Arc::new(adapter));
758762
Some(id)
759763
}
760764
}
@@ -937,13 +941,13 @@ impl Global {
937941

938942
let (id, _adapter): (_, Arc<Adapter<A>>) = match A::VARIANT {
939943
#[cfg(vulkan)]
940-
Backend::Vulkan => fid.assign(Adapter::new(hal_adapter)),
944+
Backend::Vulkan => fid.assign(Arc::new(Adapter::new(hal_adapter))),
941945
#[cfg(metal)]
942-
Backend::Metal => fid.assign(Adapter::new(hal_adapter)),
946+
Backend::Metal => fid.assign(Arc::new(Adapter::new(hal_adapter))),
943947
#[cfg(dx12)]
944-
Backend::Dx12 => fid.assign(Adapter::new(hal_adapter)),
948+
Backend::Dx12 => fid.assign(Arc::new(Adapter::new(hal_adapter))),
945949
#[cfg(gles)]
946-
Backend::Gl => fid.assign(Adapter::new(hal_adapter)),
950+
Backend::Gl => fid.assign(Arc::new(Adapter::new(hal_adapter))),
947951
_ => unreachable!(),
948952
};
949953
resource_log!("Created Adapter {:?}", id);
@@ -1066,13 +1070,13 @@ impl Global {
10661070
Ok((device, queue)) => (device, queue),
10671071
Err(e) => break e,
10681072
};
1069-
let (device_id, _) = device_fid.assign(device);
1073+
let (device_id, _) = device_fid.assign(Arc::new(device));
10701074
resource_log!("Created Device {:?}", device_id);
10711075

10721076
let device = hub.devices.get(device_id).unwrap();
10731077
queue.device = Some(device.clone());
10741078

1075-
let (queue_id, queue) = queue_fid.assign(queue);
1079+
let (queue_id, queue) = queue_fid.assign(Arc::new(queue));
10761080
resource_log!("Created Queue {:?}", queue_id);
10771081

10781082
device.set_queue(queue);
@@ -1118,13 +1122,13 @@ impl Global {
11181122
Ok(device) => device,
11191123
Err(e) => break e,
11201124
};
1121-
let (device_id, _) = devices_fid.assign(device);
1125+
let (device_id, _) = devices_fid.assign(Arc::new(device));
11221126
resource_log!("Created Device {:?}", device_id);
11231127

11241128
let device = hub.devices.get(device_id).unwrap();
11251129
queue.device = Some(device.clone());
11261130

1127-
let (queue_id, queue) = queues_fid.assign(queue);
1131+
let (queue_id, queue) = queues_fid.assign(Arc::new(queue));
11281132
resource_log!("Created Queue {:?}", queue_id);
11291133

11301134
device.set_queue(queue);

wgpu-core/src/present.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ When this texture is presented, we remove it from the device tracker as well as
99
extract it from the hub.
1010
!*/
1111

12-
use std::borrow::Borrow;
12+
use std::{borrow::Borrow, sync::Arc};
1313

1414
#[cfg(feature = "trace")]
1515
use crate::device::trace::Action;
@@ -231,7 +231,7 @@ impl Global {
231231
bind_groups: Mutex::new(Vec::new()),
232232
};
233233

234-
let (id, resource) = fid.assign(texture);
234+
let (id, resource) = fid.assign(Arc::new(texture));
235235
log::debug!("Created CURRENT Surface Texture {:?}", id);
236236

237237
{

wgpu-core/src/registry.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,20 @@ impl<T: Resource> FutureId<'_, T> {
7878
Arc::new(value)
7979
}
8080

81+
pub fn init_in_place(&self, mut value: Arc<T>) -> Arc<T> {
82+
Arc::get_mut(&mut value)
83+
.unwrap()
84+
.as_info_mut()
85+
.set_id(self.id);
86+
value
87+
}
88+
8189
/// Assign a new resource to this ID.
8290
///
8391
/// Registers it with the registry, and fills out the resource info.
84-
pub fn assign(self, value: T) -> (Id<T::Marker>, Arc<T>) {
92+
pub fn assign(self, value: Arc<T>) -> (Id<T::Marker>, Arc<T>) {
8593
let mut data = self.data.write();
86-
data.insert(self.id, self.init(value));
94+
data.insert(self.id, self.init_in_place(value));
8795
(self.id, data.get(self.id).unwrap().clone())
8896
}
8997

0 commit comments

Comments
 (0)