diff options
Diffstat (limited to 'wgpu/src/image.rs')
| -rw-r--r-- | wgpu/src/image.rs | 47 | 
1 files changed, 23 insertions, 24 deletions
diff --git a/wgpu/src/image.rs b/wgpu/src/image.rs index 2fd73b54..97e30403 100644 --- a/wgpu/src/image.rs +++ b/wgpu/src/image.rs @@ -660,37 +660,36 @@ 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 { -                    if let Some(layer) = self.layers.get_mut(mapping.allocation.layer()) { -                        match &mapping.allocation { -                            ArrayAllocation::WholeLayer { .. } => { -                                *layer = TextureLayer::Empty; -                            } -                            ArrayAllocation::AtlasAllocation { allocation, .. } => { -                                if let TextureLayer::Atlas(allocator) = layer { -                                    allocator.deallocate(allocation.id); -                                } -                            } +                    self.deallocate_single_allocation(&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>( @@ -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)]  | 
