When deallocating the last allocation in an allocator mark its layer as empty
MODIFY
wgpu/src/image.rs
wgpu/src/image.rs
@@ -660,38 +660,37 @@ impl TextureArray {
fn deallocate(&mut self, allocation: &ImageAllocation) {
match allocation {
ImageAllocation::SingleAllocation(allocation) => {
- if let Some(layer) = self.layers.get_mut(allocation.layer()) {
- match allocation {
- ArrayAllocation::WholeLayer { .. } => {
- *layer = TextureLayer::Empty;
- }
- ArrayAllocation::AtlasAllocation { allocation, .. } => {
- if let TextureLayer::Atlas(allocator) = layer {
- allocator.deallocate(allocation.id);
+ self.deallocate_single_allocation(allocation);
}
+ ImageAllocation::MultipleAllocations { mappings, .. } => {
+ for mapping in mappings {
+ self.deallocate_single_allocation(&mapping.allocation);
}
}
}
}
- ImageAllocation::MultipleAllocations { mappings, .. } => {
- for mapping in mappings {
- if let Some(layer) = self.layers.get_mut(mapping.allocation.layer()) {
- match &mapping.allocation {
+
+ fn deallocate_single_allocation(&mut self, allocation: &ArrayAllocation) {
+ if let Some(layer) = self.layers.get_mut(allocation.layer()) {
+ match allocation {
ArrayAllocation::WholeLayer { .. } => {
*layer = TextureLayer::Empty;
}
ArrayAllocation::AtlasAllocation { allocation, .. } => {
if let TextureLayer::Atlas(allocator) = layer {
allocator.deallocate(allocation.id);
+
+ let mut empty_allocator = true;
+ allocator.for_each_allocated_rectangle(|_, _| empty_allocator = false);
+
+ if empty_allocator {
+ *layer = TextureLayer::Empty;
}
}
}
}
}
}
- }
-
- }
fn upload<C, I>(
&mut self,
@@ -953,7 +952,7 @@ const QUAD_VERTS: [Vertex; 4] = [
},
];
-const ATLAS_SIZE: u32 = 4096;
+const ATLAS_SIZE: u32 = 256;
#[repr(C)]
#[derive(Debug, Clone, Copy)]

When deallocating the last allocation in an allocator mark its layer as empty