diff --git a/wgpu-native/src/instance.rs b/wgpu-native/src/instance.rs index 4b7c32707a..c99818d1ef 100644 --- a/wgpu-native/src/instance.rs +++ b/wgpu-native/src/instance.rs @@ -1,6 +1,5 @@ use crate::{ binding_model::MAX_BIND_GROUPS, - device::BIND_BUFFER_ALIGNMENT, hub::HUB, AdapterHandle, AdapterId, @@ -9,7 +8,7 @@ use crate::{ SurfaceHandle, }; #[cfg(feature = "local")] -use crate::{DeviceId, SurfaceId}; +use crate::{device::BIND_BUFFER_ALIGNMENT, DeviceId, SurfaceId}; #[cfg(feature = "local")] use log::info; diff --git a/wgpu-native/src/track.rs b/wgpu-native/src/track.rs index e1af6fdfd6..e5a4b77f20 100644 --- a/wgpu-native/src/track.rs +++ b/wgpu-native/src/track.rs @@ -22,6 +22,51 @@ use std::{ ops::{BitOr, Range}, }; +#[derive(Clone, Debug)] +pub struct RangedStates { + ranges: Vec<(Range, T)>, +} + +pub type TextureLayerStates = RangedStates; +pub type TextureStates = RangedStates; + +impl RangedStates { + fn isolate(&mut self, index: Range) -> &mut T { + let mut pos = self.ranges + .iter() + .position(|&(ref range, _)| index.start >= range.start) + .unwrap(); + let base_range = self.ranges[pos].0.clone(); + assert!(index.end <= base_range.end); + if base_range.start < index.start { + let value = ((base_range.start .. index.start), self.ranges[pos].1.clone()); + self.ranges.insert(pos, value); + pos += 1; + self.ranges[pos].0.start = index.start; + } + if base_range.end > index.end { + let value = ((index.end .. base_range.end), self.ranges[pos].1.clone()); + self.ranges.insert(pos + 1, value); + self.ranges[pos].0.end = index.end; + } + &mut self.ranges[pos].1 + } +} + +impl TextureStates { + fn change_state( + &mut self, level: hal::image::Level, layer: hal::image::Layer, usage: TextureUsage + ) -> Option { + let layer_states = self.isolate(level .. level + 1); + let cur_usage = layer_states.isolate(layer .. layer + 1); + if *cur_usage != usage { + Some(mem::replace(cur_usage, usage)) + } else { + None + } + } +} + #[derive(Clone, Debug, PartialEq)] #[allow(unused)] pub enum Tracktion {