diff options
Diffstat (limited to 'stockton-skeleton/src/draw_passes/util.rs')
-rw-r--r-- | stockton-skeleton/src/draw_passes/util.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/stockton-skeleton/src/draw_passes/util.rs b/stockton-skeleton/src/draw_passes/util.rs new file mode 100644 index 0000000..7e82209 --- /dev/null +++ b/stockton-skeleton/src/draw_passes/util.rs @@ -0,0 +1,41 @@ +//! Utility structs & functions + +use anyhow::Result; + +/// Keeps a given resource for each swapchain image +pub struct TargetSpecificResources<T> { + elements: Vec<T>, + next_idx: usize, +} + +impl<T> TargetSpecificResources<T> { + /// Create a new set of resources, given a function to generate them and the count + /// In most cases, count should be swapchain_properties.image_count + pub fn new<F>(mut generator: F, count: usize) -> Result<Self> + where + F: FnMut() -> Result<T>, + { + let mut elements = Vec::with_capacity(count); + for _ in 0..count { + elements.push(generator()?); + } + + Ok(TargetSpecificResources { + elements, + next_idx: 0, + }) + } + + /// Get the next resource, wrapping around if necessary. + pub fn get_next(&mut self) -> &T { + let el = &self.elements[self.next_idx]; + self.next_idx = (self.next_idx + 1) % self.elements.len(); + el + } + + /// Dissolve the resource set, returning an iterator over each item. + /// In most cases, each item will need deactivated. + pub fn dissolve(self) -> impl Iterator<Item = T> { + self.elements.into_iter() + } +} |