From 6fe041d54401356d0289716bf649e0a93306178b Mon Sep 17 00:00:00 2001 From: teoxoy <28601907+teoxoy@users.noreply.github.com> Date: Thu, 27 Jun 2024 17:42:54 +0200 Subject: [PATCH] make `Queue.device` non-optional --- wgpu-core/src/device/queue.rs | 30 ++++++++++-------------------- wgpu-core/src/instance.rs | 17 ++++++++--------- 2 files changed, 18 insertions(+), 29 deletions(-) diff --git a/wgpu-core/src/device/queue.rs b/wgpu-core/src/device/queue.rs index 30d8f20be3..13fac78851 100644 --- a/wgpu-core/src/device/queue.rs +++ b/wgpu-core/src/device/queue.rs @@ -37,8 +37,8 @@ use thiserror::Error; use super::Device; pub struct Queue { - pub(crate) device: Option>>, pub(crate) raw: Option, + pub(crate) device: Arc>, } crate::impl_resource_type!(Queue); @@ -48,19 +48,14 @@ impl Labeled for Queue { "" } } +crate::impl_parent_device!(Queue); crate::impl_storage_item!(Queue); -impl ParentDevice for Queue { - fn device(&self) -> &Arc> { - self.device.as_ref().unwrap() - } -} - impl Drop for Queue { fn drop(&mut self) { resource_log!("Drop {}", self.error_ident()); let queue = self.raw.take().unwrap(); - self.device.as_ref().unwrap().release_queue(queue); + self.device.release_queue(queue); } } @@ -429,7 +424,7 @@ impl Global { .get(queue_id) .map_err(|_| QueueWriteError::InvalidQueueId)?; - let device = queue.device.as_ref().unwrap(); + let device = &queue.device; let data_size = data.len() as wgt::BufferAddress; @@ -497,7 +492,7 @@ impl Global { .get(queue_id) .map_err(|_| QueueWriteError::InvalidQueueId)?; - let device = queue.device.as_ref().unwrap(); + let device = &queue.device; let (staging_buffer, staging_buffer_ptr) = prepare_staging_buffer(device, buffer_size.get(), device.instance_flags)?; @@ -524,7 +519,7 @@ impl Global { .get(queue_id) .map_err(|_| QueueWriteError::InvalidQueueId)?; - let device = queue.device.as_ref().unwrap(); + let device = &queue.device; let staging_buffer = hub.staging_buffers.unregister(staging_buffer_id); if staging_buffer.is_none() { @@ -692,7 +687,7 @@ impl Global { .get(queue_id) .map_err(|_| QueueWriteError::InvalidQueueId)?; - let device = queue.device.as_ref().unwrap(); + let device = &queue.device; #[cfg(feature = "trace")] if let Some(ref mut trace) = *device.trace.lock() { @@ -950,7 +945,7 @@ impl Global { .get(queue_id) .map_err(|_| QueueWriteError::InvalidQueueId)?; - let device = queue.device.as_ref().unwrap(); + let device = &queue.device; if size.width == 0 || size.height == 0 || size.depth_or_array_layers == 0 { log::trace!("Ignoring write_texture of size 0"); @@ -1144,7 +1139,7 @@ impl Global { .get(queue_id) .map_err(|_| QueueSubmitError::InvalidQueueId)?; - let device = queue.device.as_ref().unwrap(); + let device = &queue.device; let snatch_guard = device.snatchable_lock.read(); @@ -1551,12 +1546,7 @@ impl Global { //TODO: flush pending writes let hub = A::hub(self); match hub.queues.get(queue_id) { - Ok(queue) => queue - .device - .as_ref() - .unwrap() - .lock_life() - .add_work_done_closure(closure), + Ok(queue) => queue.device.lock_life().add_work_done_closure(closure), Err(_) => return Err(InvalidQueue), } Ok(()) diff --git a/wgpu-core/src/instance.rs b/wgpu-core/src/instance.rs index 5e407b8fa3..6f4e183590 100644 --- a/wgpu-core/src/instance.rs +++ b/wgpu-core/src/instance.rs @@ -284,7 +284,7 @@ impl Adapter { desc: &DeviceDescriptor, instance_flags: wgt::InstanceFlags, trace_path: Option<&std::path::Path>, - ) -> Result<(Device, Queue), RequestDeviceError> { + ) -> Result<(Arc>, Queue), RequestDeviceError> { api_log!("Adapter::create_device"); if let Ok(device) = Device::new( @@ -295,8 +295,9 @@ impl Adapter { trace_path, instance_flags, ) { + let device = Arc::new(device); let queue = Queue { - device: None, + device: device.clone(), raw: Some(hal_device.queue), }; return Ok((device, queue)); @@ -309,7 +310,7 @@ impl Adapter { desc: &DeviceDescriptor, instance_flags: wgt::InstanceFlags, trace_path: Option<&std::path::Path>, - ) -> Result<(Device, Queue), RequestDeviceError> { + ) -> Result<(Arc>, Queue), RequestDeviceError> { // Verify all features were exposed by the adapter if !self.raw.features.contains(desc.required_features) { return Err(RequestDeviceError::UnsupportedFeature( @@ -1084,16 +1085,15 @@ impl Global { Ok(adapter) => adapter, Err(_) => break 'error RequestDeviceError::InvalidAdapter, }; - let (device, mut queue) = + let (device, queue) = match adapter.create_device_and_queue(desc, self.instance.flags, trace_path) { Ok((device, queue)) => (device, queue), Err(e) => break 'error e, }; - let (device_id, _) = device_fid.assign(Arc::new(device)); + let (device_id, _) = device_fid.assign(device); resource_log!("Created Device {:?}", device_id); let device = hub.devices.get(device_id).unwrap(); - queue.device = Some(device.clone()); let (queue_id, queue) = queue_fid.assign(Arc::new(queue)); resource_log!("Created Queue {:?}", queue_id); @@ -1132,7 +1132,7 @@ impl Global { Ok(adapter) => adapter, Err(_) => break 'error RequestDeviceError::InvalidAdapter, }; - let (device, mut queue) = match adapter.create_device_and_queue_from_hal( + let (device, queue) = match adapter.create_device_and_queue_from_hal( hal_device, desc, self.instance.flags, @@ -1141,11 +1141,10 @@ impl Global { Ok(device) => device, Err(e) => break 'error e, }; - let (device_id, _) = devices_fid.assign(Arc::new(device)); + let (device_id, _) = devices_fid.assign(device); resource_log!("Created Device {:?}", device_id); let device = hub.devices.get(device_id).unwrap(); - queue.device = Some(device.clone()); let (queue_id, queue) = queues_fid.assign(Arc::new(queue)); resource_log!("Created Queue {:?}", queue_id);