Skip to content

Commit 286306d

Browse files
authored
Store the device's queue via a weak ref instead of an ID (#5230)
1 parent abc0b30 commit 286306d

File tree

4 files changed

+23
-17
lines changed

4 files changed

+23
-17
lines changed

wgpu-core/src/device/global.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,9 +1330,8 @@ impl Global {
13301330
if !device.is_valid() {
13311331
break DeviceError::Lost;
13321332
}
1333-
let queue = match hub.queues.get(device.queue_id.read().unwrap()) {
1334-
Ok(queue) => queue,
1335-
Err(_) => break DeviceError::InvalidQueueId,
1333+
let Some(queue) = device.get_queue() else {
1334+
break DeviceError::InvalidQueueId;
13361335
};
13371336
let encoder = match device
13381337
.command_allocator

wgpu-core/src/device/resource.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use crate::{
1313
hal_api::HalApi,
1414
hal_label,
1515
hub::Hub,
16-
id::QueueId,
1716
init_tracker::{
1817
BufferInitTracker, BufferInitTrackerAction, MemoryInitKind, TextureInitRange,
1918
TextureInitTracker, TextureInitTrackerAction,
@@ -38,6 +37,7 @@ use crate::{
3837

3938
use arrayvec::ArrayVec;
4039
use hal::{CommandEncoder as _, Device as _};
40+
use once_cell::sync::OnceCell;
4141
use parking_lot::{Mutex, MutexGuard, RwLock};
4242

4343
use smallvec::SmallVec;
@@ -56,7 +56,7 @@ use std::{
5656

5757
use super::{
5858
life::{self, ResourceMaps},
59-
queue::{self},
59+
queue::{self, Queue},
6060
DeviceDescriptor, DeviceError, ImplicitPipelineContext, UserClosures, ENTRYPOINT_FAILURE_ERROR,
6161
IMPLICIT_BIND_GROUP_LAYOUT_ERROR_LABEL, ZERO_BUFFER_SIZE,
6262
};
@@ -89,8 +89,8 @@ use super::{
8989
pub struct Device<A: HalApi> {
9090
raw: Option<A::Device>,
9191
pub(crate) adapter: Arc<Adapter<A>>,
92-
pub(crate) queue_id: RwLock<Option<QueueId>>,
93-
queue_to_drop: RwLock<Option<A::Queue>>,
92+
pub(crate) queue: OnceCell<Weak<Queue<A>>>,
93+
queue_to_drop: OnceCell<A::Queue>,
9494
pub(crate) zero_buffer: Option<A::Buffer>,
9595
pub(crate) info: ResourceInfo<Device<A>>,
9696

@@ -162,7 +162,7 @@ impl<A: HalApi> Drop for Device<A> {
162162
unsafe {
163163
raw.destroy_buffer(self.zero_buffer.take().unwrap());
164164
raw.destroy_fence(self.fence.write().take().unwrap());
165-
let queue = self.queue_to_drop.write().take().unwrap();
165+
let queue = self.queue_to_drop.take().unwrap();
166166
raw.exit(queue);
167167
}
168168
}
@@ -260,8 +260,8 @@ impl<A: HalApi> Device<A> {
260260
Ok(Self {
261261
raw: Some(raw_device),
262262
adapter: adapter.clone(),
263-
queue_id: RwLock::new(None),
264-
queue_to_drop: RwLock::new(None),
263+
queue: OnceCell::new(),
264+
queue_to_drop: OnceCell::new(),
265265
zero_buffer: Some(zero_buffer),
266266
info: ResourceInfo::new("<device>"),
267267
command_allocator: Mutex::new(Some(com_alloc)),
@@ -302,7 +302,7 @@ impl<A: HalApi> Device<A> {
302302
}
303303

304304
pub(crate) fn release_queue(&self, queue: A::Queue) {
305-
self.queue_to_drop.write().replace(queue);
305+
assert!(self.queue_to_drop.set(queue).is_ok());
306306
}
307307

308308
pub(crate) fn lock_life<'a>(&'a self) -> MutexGuard<'a, LifetimeTracker<A>> {
@@ -359,6 +359,14 @@ impl<A: HalApi> Device<A> {
359359
}
360360
}
361361

362+
pub fn get_queue(&self) -> Option<Arc<Queue<A>>> {
363+
self.queue.get().as_ref()?.upgrade()
364+
}
365+
366+
pub fn set_queue(&self, queue: Arc<Queue<A>>) {
367+
assert!(self.queue.set(Arc::downgrade(&queue)).is_ok());
368+
}
369+
362370
/// Check this device for completed commands.
363371
///
364372
/// The `maintain` argument tells how the maintence function should behave, either

wgpu-core/src/instance.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,10 +1072,10 @@ impl Global {
10721072
let device = hub.devices.get(device_id).unwrap();
10731073
queue.device = Some(device.clone());
10741074

1075-
let (queue_id, _) = queue_fid.assign(queue);
1075+
let (queue_id, queue) = queue_fid.assign(queue);
10761076
resource_log!("Created Queue {:?}", queue_id);
10771077

1078-
device.queue_id.write().replace(queue_id);
1078+
device.set_queue(queue);
10791079

10801080
return (device_id, queue_id, None);
10811081
};
@@ -1124,10 +1124,10 @@ impl Global {
11241124
let device = hub.devices.get(device_id).unwrap();
11251125
queue.device = Some(device.clone());
11261126

1127-
let (queue_id, _) = queues_fid.assign(queue);
1127+
let (queue_id, queue) = queues_fid.assign(queue);
11281128
resource_log!("Created Queue {:?}", queue_id);
11291129

1130-
device.queue_id.write().replace(queue_id);
1130+
device.set_queue(queue);
11311131

11321132
return (device_id, queue_id, None);
11331133
};

wgpu-core/src/present.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,7 @@ impl Global {
294294
if !device.is_valid() {
295295
return Err(DeviceError::Lost.into());
296296
}
297-
let queue_id = device.queue_id.read().unwrap();
298-
let queue = hub.queues.get(queue_id).unwrap();
297+
let queue = device.get_queue().unwrap();
299298

300299
#[cfg(feature = "trace")]
301300
if let Some(ref mut trace) = *device.trace.lock() {

0 commit comments

Comments
 (0)