aboutsummaryrefslogtreecommitdiff
path: root/stockton-skeleton/src/draw_passes/util.rs
diff options
context:
space:
mode:
Diffstat (limited to 'stockton-skeleton/src/draw_passes/util.rs')
-rw-r--r--stockton-skeleton/src/draw_passes/util.rs41
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()
+ }
+}