struct TrackedResource {
ResourceHandle handle{}; // your wrapper around vk objects
uint64_t retireValue = 0; // timeline value when last submitted use completes
};
void destroyWhenSafe(TrackedResource res) {
deferredDeletes.push_back(res);
}
void gc(vk::raii::Device const& device, vk::raii::Semaphore const& timeline) {
const uint64_t now = device.getSemaphoreCounterValue(*timeline);
auto it = std::remove_if(deferredDeletes.begin(), deferredDeletes.end(), [&](TrackedResource const& r){
if (now >= r.retireValue) { destroy(r.handle); return true; }
return false;
});
deferredDeletes.erase(it, deferredDeletes.end());
}