1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
// Copyright (c) 2016 The vulkano developers // Licensed under the Apache License, Version 2.0 // <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE-2.0> or the MIT // license <LICENSE-MIT or http://opensource.org/licenses/MIT>, // at your option. All files in the project carrying such // notice may not be copied, modified, or distributed except // according to those terms. use instance::MemoryType; use memory::DeviceMemory; use memory::MappedDeviceMemory; use OomError; pub use self::pool::StdMemoryPool; pub use self::pool::StdMemoryPoolAlloc; pub use self::host_visible::StdHostVisibleMemoryTypePool; pub use self::host_visible::StdHostVisibleMemoryTypePoolAlloc; pub use self::non_host_visible::StdNonHostVisibleMemoryTypePool; pub use self::non_host_visible::StdNonHostVisibleMemoryTypePoolAlloc; mod host_visible; mod non_host_visible; mod pool; /// Pool of GPU-visible memory that can be allocated from. pub unsafe trait MemoryPool: 'static + Send + Sync { /// Object that represents a single allocation. Its destructor should free the chunk. type Alloc: MemoryPoolAlloc; /// Allocates memory from the pool. /// /// # Safety /// /// - The returned object must match the requirements. /// - When a linear object is allocated next to an optimal object, it is mandatory that /// the boundary is aligned to the value of the `buffer_image_granularity` limit. /// /// # Panic /// /// - Panics if `memory_type` doesn't belong to the same physical device as the device which /// was used to create this pool. /// - Panics if `size` is 0. /// - Panics if `alignment` is 0. /// fn alloc(&self, ty: MemoryType, size: usize, alignment: usize, layout: AllocLayout) -> Result<Self::Alloc, OomError>; } /// Object that represents a single allocation. Its destructor should free the chunk. pub unsafe trait MemoryPoolAlloc: 'static + Send + Sync { /// Returns the memory object from which this is allocated. Returns `None` if the memory is /// not mapped. fn mapped_memory(&self) -> Option<&MappedDeviceMemory>; /// Returns the memory object from which this is allocated. fn memory(&self) -> &DeviceMemory; /// Returns the offset at the start of the memory where the first byte of this allocation /// resides. fn offset(&self) -> usize; } /// Layout of the object being allocated. #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum AllocLayout { /// The object has a linear layout. Linear, /// The object has an optimal layout. Optimal, }