in crates/ratchet-core/src/gpu/pools/dynamic_resource_pool.rs [247:303]
fn resource_alloc_and_reuse() {
let mut pool = Pool::default();
let initial_resource_descs = [0, 0, 1, 2, 2, 3];
// Alloc on a new pool always returns a new resource.
allocate_resources(&initial_resource_descs, &mut pool, true);
// After pass maintenance we get used resources.
// Still, no resources were dropped.
{
let drop_counter_before = DROP_COUNTER.with(|c| c.get());
let mut called_destroy = false;
pool.begin_pass(1, |_| called_destroy = true);
assert!(!called_destroy);
assert_eq!(drop_counter_before, DROP_COUNTER.with(|c| c.get()),);
}
// Allocate the same resources again, this should *not* create any new resources.
allocate_resources(&initial_resource_descs, &mut pool, false);
// Doing it again, it will again create resources.
allocate_resources(&initial_resource_descs, &mut pool, true);
// Doing pass maintenance twice will drop all resources
{
let drop_counter_before = DROP_COUNTER.with(|c| c.get());
let mut called_destroy = false;
pool.begin_pass(2, |_| called_destroy = true);
assert!(!called_destroy);
pool.begin_pass(3, |_| called_destroy = true);
assert!(called_destroy);
let drop_counter_now = DROP_COUNTER.with(|c| c.get());
assert_eq!(
drop_counter_before + initial_resource_descs.len() * 2,
drop_counter_now
);
assert_eq!(pool.total_resource_size_in_bytes(), 0);
}
// Holding on to the resource avoids both re-use and dropping.
{
let drop_counter_before = DROP_COUNTER.with(|c| c.get());
let resource0 = pool.get_or_create(&ConcreteResourceDesc(0), |_| ConcreteResource);
let resource1 = pool.get_or_create(&ConcreteResourceDesc(0), |_| ConcreteResource);
assert_ne!(resource0.handle, resource1.handle);
drop(resource1);
let mut called_destroy = false;
pool.begin_pass(4, |_| called_destroy = true);
assert!(!called_destroy);
assert_eq!(drop_counter_before, DROP_COUNTER.with(|c| c.get()),);
pool.begin_pass(5, |_| called_destroy = true);
assert!(called_destroy);
assert_eq!(drop_counter_before + 1, DROP_COUNTER.with(|c| c.get()),);
}
}