#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] pubenum MemoryLocation { /// The allocated resource is stored at an unknown memory location; let the driver decide what's the best location
Unknown, /// Store the allocation in GPU only accessible memory - typically this is the faster GPU resource and this should be /// where most of the allocations live.
GpuOnly, /// Memory useful for uploading data to the GPU and potentially for constant buffers
CpuToGpu, /// Memory useful for CPU readback of data
GpuToCpu,
}
#[non_exhaustive] #[derive(Copy, Clone, Debug)] pubstruct AllocatorDebugSettings { /// Logs out debugging information about the various heaps the current device has on startup pub log_memory_information: bool, /// Logs out all memory leaks on shutdown with log level Warn pub log_leaks_on_shutdown: bool, /// Stores a copy of the full backtrace for every allocation made, this makes it easier to debug leaks /// or other memory allocations, but storing stack traces has a RAM overhead so should be disabled /// in shipping applications. #[cfg(feature = "std")] pub store_stack_traces: bool, /// Log out every allocation as it's being made with log level Debug, rather spammy so off by default pub log_allocations: bool, /// Log out every free that is being called with log level Debug, rather spammy so off by default pub log_frees: bool, /// Log out stack traces when either `log_allocations` or `log_frees` is enabled. #[cfg(feature = "std")] pub log_stack_traces: bool,
}
/// The sizes of the memory blocks that the allocator will create. /// /// Useful for tuning the allocator to your application's needs. For example most games will be fine with the default /// values, but eg. an app might want to use smaller block sizes to reduce the amount of memory used. /// /// Clamped between 4MB and 256MB, and rounds up to the nearest multiple of 4MB for alignment reasons. /// /// Note that these limits only apply to shared memory blocks that can hold multiple allocations. /// If an allocation does not fit within the corresponding maximum block size, it will be placed /// in a dedicated memory block holding only this allocation, without limitations other than what /// the underlying hardware and driver are able to provide. /// /// # Fixed or growable block size /// /// This structure represents ranges of allowed sizes for shared memory blocks. /// By default, if the upper bounds are not extended using `with_max_*_memblock_size`, /// the allocator will be configured to use a fixed memory block size for shared /// allocations. /// /// Otherwise, the allocator will pick a memory block size within the specifed /// range, depending on the number of existing allocations for the memory /// type. /// /// As a rule of thumb, the allocator will start with the minimum block size /// and double the size with each new allocation, up to the specified maximum /// block size. This growth is tracked independently for each memory type. /// The block size also decreases when blocks are deallocated. /// /// # Example /// /// ``` /// use gpu_allocator::AllocationSizes; /// const MB: u64 = 1024 * 1024; /// // This configuration uses fixed memory block sizes. /// let fixed = AllocationSizes::new(256 * MB, 64 * MB); /// /// // This configuration starts with 8MB memory blocks /// // and grows the block size of a given memory type each /// // time a new allocation is needed, up to a limit of /// // 256MB for device memory and 64MB for host memory. /// let growing = AllocationSizes::new(8 * MB, 8 * MB) /// .with_max_device_memblock_size(256 * MB) /// .with_max_host_memblock_size(64 * MB); /// ``` #[derive(Clone, Copy, Debug)] pubstruct AllocationSizes { /// The initial size for device memory blocks. /// /// The size of new device memory blocks doubles each time a new block is needed, up to /// [`AllocationSizes::max_device_memblock_size`]. /// /// Defaults to 256MB.
min_device_memblock_size: u64, /// The maximum size for device memory blocks. /// /// Defaults to the value of [`AllocationSizes::min_device_memblock_size`].
max_device_memblock_size: u64, /// The initial size for host memory blocks. /// /// The size of new host memory blocks doubles each time a new block is needed, up to /// [`AllocationSizes::max_host_memblock_size`]. /// /// Defaults to 64MB.
min_host_memblock_size: u64, /// The maximum size for host memory blocks. /// /// Defaults to the value of [`AllocationSizes::min_host_memblock_size`].
max_host_memblock_size: u64,
}
impl AllocationSizes { /// Sets the minimum device and host memory block sizes. /// /// The maximum block sizes are initialized to the minimum sizes and /// can be increased using [`AllocationSizes::with_max_device_memblock_size`] and /// [`AllocationSizes::with_max_host_memblock_size`]. pubfn new(device_memblock_size: u64, host_memblock_size: u64) -> Self { let device_memblock_size = Self::adjust_memblock_size(device_memblock_size, "Device"); let host_memblock_size = Self::adjust_memblock_size(host_memblock_size, "Host");
let val = size / (4 * MB) + 1; let new_size = val * 4 * MB;
log::warn!( "{kind} memory block size must be a multiple of 4MB, clamping to {}MB",
new_size / MB
);
new_size
}
/// Used internally to decide the size of a shared memory block /// based within the allowed range, based on the number of /// existing allocations. The more blocks there already are /// (where the requested allocation didn't fit), the larger /// the returned memory block size is going to be (up to /// `max_*_memblock_size`). pub(crate) fn get_memblock_size(&self, is_host: bool, count: usize) -> u64 { let (min_size, max_size) = if is_host {
(self.min_host_memblock_size, self.max_host_memblock_size)
} else {
(self.min_device_memblock_size, self.max_device_memblock_size)
};
// The ranges are clamped to 4MB..256MB so we never need to // shift by more than 7 bits. Clamping here to avoid having // to worry about overflows. let shift = count.min(7) as u64;
(min_size << shift).min(max_size)
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.