Check swapchain frame to still be in use

This commit is contained in:
Dzmitry Malyshau
2021-01-04 17:03:11 -05:00
parent 35a2c8c474
commit 922f2c0977
2 changed files with 25 additions and 8 deletions

View File

@@ -81,6 +81,8 @@ pub enum SwapChainError {
Device(#[from] DeviceError),
#[error("swap chain image is already acquired")]
AlreadyAcquired,
#[error("acquired frame is still referenced")]
StillReferenced,
}
#[derive(Clone, Debug, Error)]
@@ -250,12 +252,17 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
trace.lock().add(Action::PresentSwapChain(swap_chain_id));
}
let view_id = sc
.acquired_view_id
.take()
.ok_or(SwapChainError::AlreadyAcquired)?;
let (view_maybe, _) = hub.texture_views.unregister(view_id.value.0, &mut token);
let view = view_maybe.ok_or(SwapChainError::Invalid)?;
let view = {
let view_id = sc
.acquired_view_id
.take()
.ok_or(SwapChainError::AlreadyAcquired)?;
let (view_maybe, _) = hub.texture_views.unregister(view_id.value.0, &mut token);
view_maybe.ok_or(SwapChainError::Invalid)?
};
if view.life_guard.ref_count.unwrap().load() != 1 {
return Err(SwapChainError::StillReferenced);
}
let image = match view.inner {
resource::TextureViewInner::Native { .. } => unreachable!(),
resource::TextureViewInner::SwapChain { image, .. } => image,

View File

@@ -370,7 +370,12 @@ impl<S: ResourceState> ResourceTracker<S> {
e.insert(new.clone());
}
Entry::Occupied(e) => {
assert_eq!(e.get().epoch, new.epoch);
assert_eq!(
e.get().epoch,
new.epoch,
"ID {:?} wasn't properly removed",
S::Id::zip(index, e.get().epoch, self.backend)
);
let id = Valid(S::Id::zip(index, new.epoch, self.backend));
e.into_mut().state.merge(id, &new.state, None)?;
}
@@ -388,7 +393,12 @@ impl<S: ResourceState> ResourceTracker<S> {
e.insert(new.clone());
}
Entry::Occupied(e) => {
assert_eq!(e.get().epoch, new.epoch);
assert_eq!(
e.get().epoch,
new.epoch,
"ID {:?} wasn't properly removed",
S::Id::zip(index, e.get().epoch, self.backend)
);
let id = Valid(S::Id::zip(index, new.epoch, self.backend));
e.into_mut()
.state