/// Configuration for [`GpuAllocator`] /// /// [`GpuAllocator`]: type.GpuAllocator #[derive(Clone, Copy, Debug, PartialEq, Eq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct Config { /// Size in bytes of request that will be served by dedicated memory object. /// This value should be large enough to not exhaust memory object limit /// and not use slow memory object allocation when it is not necessary. pub dedicated_threshold: u64, /// Size in bytes of request that will be served by dedicated memory object if preferred. /// This value should be large enough to not exhaust memory object limit /// and not use slow memory object allocation when it is not necessary. /// /// This won't make much sense if this value is larger than `dedicated_threshold`. pub preferred_dedicated_threshold: u64, /// Size in bytes of transient memory request that will be served by dedicated memory object. /// This value should be large enough to not exhaust memory object limit /// and not use slow memory object allocation when it is not necessary. /// /// This won't make much sense if this value is lesser than `dedicated_threshold`. pub transient_dedicated_threshold: u64, /// Size in bytes of first chunk in free-list allocator. pub starting_free_list_chunk: u64, /// Upper limit for size in bytes of chunks in free-list allocator. pub final_free_list_chunk: u64, /// Minimal size for buddy allocator. pub minimal_buddy_size: u64, /// Initial memory object size for buddy allocator. /// If less than `minimal_buddy_size` then `minimal_buddy_size` is used instead. pub initial_buddy_dedicated_size: u64, } impl Config { /// Returns default configuration. /// /// This is not `Default` implementation to discourage usage outside of /// prototyping. /// /// Proper configuration should depend on hardware and intended usage.\ /// But those values can be used as starting point.\ /// Note that they can simply not work for some platforms with lesser /// memory capacity than today's "modern" GPU (year 2020). pub fn i_am_prototyping() -> Self { // Assume that today's modern GPU is made of 1024 potatoes. let potato = Config::i_am_potato(); Config { dedicated_threshold: potato.dedicated_threshold * 1024, preferred_dedicated_threshold: potato.preferred_dedicated_threshold * 1024, transient_dedicated_threshold: potato.transient_dedicated_threshold * 1024, starting_free_list_chunk: potato.starting_free_list_chunk * 1024, final_free_list_chunk: potato.final_free_list_chunk * 1024, minimal_buddy_size: potato.minimal_buddy_size * 1024, initial_buddy_dedicated_size: potato.initial_buddy_dedicated_size * 1024, } } /// Returns default configuration for average sized potato. pub fn i_am_potato() -> Self { Config { dedicated_threshold: 32 * 1024, preferred_dedicated_threshold: 1024, transient_dedicated_threshold: 128 * 1024, starting_free_list_chunk: 8 * 1024, final_free_list_chunk: 128 * 1024, minimal_buddy_size: 1, initial_buddy_dedicated_size: 8 * 1024, } } }