Skip to content

Commit

Permalink
Handle user callbacks in surface_configure (#4220)
Browse files Browse the repository at this point in the history
  • Loading branch information
nical authored Oct 9, 2023
1 parent 51742e4 commit 651299b
Showing 1 changed file with 21 additions and 8 deletions.
29 changes: 21 additions & 8 deletions wgpu-core/src/device/global.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2262,15 +2262,19 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
Ok(())
}

log::info!("configuring surface with {:?}", config);
let hub = A::hub(self);
let mut token = Token::root();
// User callbacks must not be called while we are holding locks.
let mut user_callbacks = None;

let (mut surface_guard, mut token) = self.surfaces.write(&mut token);
let (adapter_guard, mut token) = hub.adapters.read(&mut token);
let (device_guard, mut token) = hub.devices.read(&mut token);
log::info!("configuring surface with {:?}", config);

let error = 'outer: loop {
let hub = A::hub(self);
let mut token = Token::root();

let (mut surface_guard, mut token) = self.surfaces.write(&mut token);
let (adapter_guard, mut token) = hub.adapters.read(&mut token);
let (device_guard, mut token) = hub.devices.read(&mut token);

let device = match device_guard.get(device_id) {
Ok(device) => device,
Err(_) => break DeviceError::Invalid.into(),
Expand Down Expand Up @@ -2346,8 +2350,13 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
}

// Wait for all work to finish before configuring the surface.
if let Err(e) = device.maintain(hub, wgt::Maintain::Wait, &mut token) {
break e.into();
match device.maintain(hub, wgt::Maintain::Wait, &mut token) {
Ok((closures, _)) => {
user_callbacks = Some(closures);
}
Err(e) => {
break e.into();
}
}

// All textures must be destroyed before the surface can be re-configured.
Expand Down Expand Up @@ -2395,6 +2404,10 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
return None;
};

if let Some(callbacks) = user_callbacks {
callbacks.fire();
}

Some(error)
}

Expand Down

0 comments on commit 651299b

Please sign in to comment.