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 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}