Skip to content

Commit ed5f6fb

Browse files
WIP: feat(core): impl. destroy for QuerySets
TODOs: - Actually implement the destruction properly. - Need to add to `wgpu::QuerySet` dtor.?
1 parent 894d036 commit ed5f6fb

3 files changed

Lines changed: 69 additions & 0 deletions

File tree

wgpu-core/src/device/global.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,6 +1162,25 @@ impl Global {
11621162
(id, Some(error))
11631163
}
11641164

1165+
pub fn query_set_destroy(
1166+
&self,
1167+
query_set_id: id::QuerySetId,
1168+
) -> Result<(), resource::DestroyError> {
1169+
profiling::scope!("QuerySet::destroy");
1170+
api_log!("QuerySet::destroy {query_set_id:?}");
1171+
1172+
let hub = &self.hub;
1173+
1174+
let query_set = hub.query_sets.get(query_set_id).get()?;
1175+
1176+
#[cfg(feature = "trace")]
1177+
if let Some(trace) = query_set.device.trace.lock().as_mut() {
1178+
trace.add(trace::Action::FreeQuerySet(query_set_id));
1179+
}
1180+
1181+
query_set.destroy()
1182+
}
1183+
11651184
pub fn query_set_drop(&self, query_set_id: id::QuerySetId) {
11661185
profiling::scope!("QuerySet::drop");
11671186
api_log!("QuerySet::drop {query_set_id:?}");

wgpu-core/src/device/trace.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ pub enum Action<'a> {
116116
id: id::QuerySetId,
117117
desc: crate::resource::QuerySetDescriptor<'a>,
118118
},
119+
FreeQuerySet(id::QuerySetId),
119120
DestroyQuerySet(id::QuerySetId),
120121
WriteBuffer {
121122
id: id::BufferId,

wgpu-core/src/resource.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1893,6 +1893,55 @@ impl QuerySet {
18931893
pub(crate) fn raw(&self) -> &dyn hal::DynQuerySet {
18941894
self.raw.as_ref()
18951895
}
1896+
1897+
pub(crate) fn destroy(self: &Arc<Self>) -> Result<(), DestroyError> {
1898+
let device = &self.device;
1899+
1900+
let temp = {
1901+
let mut snatch_guard = device.snatchable_lock.write();
1902+
1903+
let raw = match self.raw.snatch(&mut snatch_guard) {
1904+
Some(raw) => raw,
1905+
None => {
1906+
return Err(DestroyError::AlreadyDestroyed);
1907+
}
1908+
};
1909+
1910+
#[cfg(feature = "indirect-validation")]
1911+
let raw_indirect_validation_bind_group = self
1912+
.raw_indirect_validation_bind_group
1913+
.snatch(&mut snatch_guard);
1914+
1915+
drop(snatch_guard);
1916+
1917+
let bind_groups = {
1918+
let mut guard = self.bind_groups.lock();
1919+
mem::take(&mut *guard)
1920+
};
1921+
1922+
queue::TempResource::DestroyedBuffer(DestroyedBuffer {
1923+
raw: ManuallyDrop::new(raw),
1924+
device: Arc::clone(&self.device),
1925+
label: self.label().to_owned(),
1926+
bind_groups,
1927+
#[cfg(feature = "indirect-validation")]
1928+
raw_indirect_validation_bind_group,
1929+
})
1930+
};
1931+
1932+
let mut pending_writes = device.pending_writes.lock();
1933+
if pending_writes.contains_query_set(self) {
1934+
pending_writes.consume_temp(temp);
1935+
} else {
1936+
let mut life_lock = device.lock_life();
1937+
let last_submit_index = life_lock.get_query_set_last_index(self);
1938+
if let Some(last_submit_index) = last_submit_index {
1939+
life_lock.schedule_resource_destruction(temp, last_submit_index);
1940+
}
1941+
}
1942+
1943+
Ok(())
1944+
}
18961945
}
18971946

18981947
#[derive(Clone, Debug, Error)]

0 commit comments

Comments
 (0)