Move LazySpan rows through one retained offset
This commit is contained in:
1 parent
992482414f
commit
f95835593f
8 files changed
+453
-50
No files matched your search
@@ -45,6 +45,26 @@ impl Dirty {
|
||||
self.words[word] |= 1 << (i % 64);
|
||||
}
|
||||
|
||||
pub fn contains(&self, i: usize) -> bool {
|
||||
self.all
|
||||
|| self
|
||||
.words
|
||||
.get(i / 64)
|
||||
.is_some_and(|word| word & (1 << (i % 64)) != 0)
|
||||
}
|
||||
|
||||
/// Clear one entry that was restored to the value already on the GPU.
|
||||
/// `all` has no per-entry representation and is used only when every
|
||||
/// byte must be uploaded regardless of later writes, so it stays set.
|
||||
pub fn unmark(&mut self, i: usize) {
|
||||
if self.all {
|
||||
return;
|
||||
}
|
||||
if let Some(word) = self.words.get_mut(i / 64) {
|
||||
*word &= !(1 << (i % 64));
|
||||
}
|
||||
}
|
||||
|
||||
/// Everything must be written: the buffer was reallocated (its
|
||||
/// contents are undefined), or the array was cleared.
|
||||
pub fn mark_all(&mut self) {
|
||||
@@ -114,6 +134,17 @@ mod tests {
|
||||
assert_eq!(marked(&[3, 4, 5], 64, 0), vec![3..6]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_restored_entry_can_be_unmarked() {
|
||||
let mut dirty = Dirty::default();
|
||||
dirty.mark(3);
|
||||
dirty.mark(5);
|
||||
assert!(dirty.contains(3));
|
||||
dirty.unmark(3);
|
||||
assert!(!dirty.contains(3));
|
||||
assert_eq!(dirty.ranges(8, 0), vec![5..6]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_run_that_crosses_a_word_boundary_is_one_range() {
|
||||
assert_eq!(marked(&[62, 63, 64, 65], 128, 0), vec![62..66]);
|
||||
|
||||
Reference in new issue
Block a user