wgpu_core/indirect_validation/
utils.rs

1use alloc::vec::Vec;
2
3pub(crate) struct UniqueIndexScratch(bit_set::BitSet);
4
5impl UniqueIndexScratch {
6    pub(crate) fn new() -> Self {
7        Self(bit_set::BitSet::new())
8    }
9}
10
11pub(crate) struct UniqueIndex<'a, I: Iterator<Item = usize>> {
12    inner: I,
13    scratch: &'a mut UniqueIndexScratch,
14}
15
16impl<'a, I: Iterator<Item = usize>> UniqueIndex<'a, I> {
17    fn new(inner: I, scratch: &'a mut UniqueIndexScratch) -> Self {
18        scratch.0.clear();
19        Self { inner, scratch }
20    }
21}
22
23impl<'a, I: Iterator<Item = usize>> Iterator for UniqueIndex<'a, I> {
24    type Item = usize;
25
26    fn next(&mut self) -> Option<Self::Item> {
27        self.inner.find(|&i| self.scratch.0.insert(i))
28    }
29}
30
31pub(crate) trait UniqueIndexExt: Iterator<Item = usize> {
32    fn unique<'a>(self, scratch: &'a mut UniqueIndexScratch) -> UniqueIndex<'a, Self>
33    where
34        Self: Sized,
35    {
36        UniqueIndex::new(self, scratch)
37    }
38}
39
40impl<T: Iterator<Item = usize>> UniqueIndexExt for T {}
41
42type BufferBarrier<'b> = hal::BufferBarrier<'b, dyn hal::DynBuffer>;
43
44pub(crate) struct BufferBarrierScratch<'b>(Vec<BufferBarrier<'b>>);
45
46impl<'b> BufferBarrierScratch<'b> {
47    pub(crate) fn new() -> Self {
48        Self(Vec::new())
49    }
50}
51
52pub(crate) struct BufferBarriers<'a, 'b> {
53    scratch: &'a mut BufferBarrierScratch<'b>,
54}
55
56impl<'a, 'b> BufferBarriers<'a, 'b> {
57    pub(crate) fn new(scratch: &'a mut BufferBarrierScratch<'_>) -> Self {
58        // change lifetime of buffer reference, this is safe since `scratch` is empty,
59        // it was either just created or it has been cleared on `BufferBarriers::drop`
60        let scratch = unsafe {
61            core::mem::transmute::<&'a mut BufferBarrierScratch<'_>, &'a mut BufferBarrierScratch<'b>>(
62                scratch,
63            )
64        };
65        Self { scratch }
66    }
67
68    pub(crate) fn extend(self, iter: impl Iterator<Item = BufferBarrier<'b>>) -> Self {
69        self.scratch.0.extend(iter);
70        self
71    }
72
73    pub(crate) fn encode(self, encoder: &mut dyn hal::DynCommandEncoder) {
74        unsafe {
75            encoder.transition_buffers(&self.scratch.0);
76        }
77    }
78}
79
80impl<'a, 'b> Drop for BufferBarriers<'a, 'b> {
81    fn drop(&mut self) {
82        self.scratch.0.clear();
83    }
84}