aboutsummaryrefslogtreecommitdiff
path: root/stockton-render/src/draw/draw_passes/util.rs
diff options
context:
space:
mode:
authortcmal <me@aria.rip>2024-08-25 17:44:23 +0100
committertcmal <me@aria.rip>2024-08-25 17:44:23 +0100
commit6ef351de4ba506e7f0f285569aa0e22255bb68c6 (patch)
tree7aaf25bb93e3d97ba03c408fdef9f7b1933ea7bc /stockton-render/src/draw/draw_passes/util.rs
parent2e33320e62a3dc26555f17e1a79e129a53672a1b (diff)
refactor(render): slight leveldrawpass refactors
Diffstat (limited to 'stockton-render/src/draw/draw_passes/util.rs')
-rw-r--r--stockton-render/src/draw/draw_passes/util.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/stockton-render/src/draw/draw_passes/util.rs b/stockton-render/src/draw/draw_passes/util.rs
new file mode 100644
index 0000000..a42f870
--- /dev/null
+++ b/stockton-render/src/draw/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>(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<'a>(&'a mut self) -> &'a 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()
+ }
+}