X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fmemoryallocator.h;h=70cda51643137e89e5af061fccd4b7f2e02b6460;hb=ef891fe4bf86704c37b4269d1aca190405455c12;hp=4715bea8311a2f88db74919f24af71005b72a18c;hpb=a9b6dba74b595361df3d9c934e479ccf83ad91a1;p=libs%2Fgl.git diff --git a/source/backends/vulkan/memoryallocator.h b/source/backends/vulkan/memoryallocator.h index 4715bea8..70cda516 100644 --- a/source/backends/vulkan/memoryallocator.h +++ b/source/backends/vulkan/memoryallocator.h @@ -2,6 +2,7 @@ #define MSP_GL_VULKAN_MEMORYALLOCATOR_H_ #include +#include #include #include "handles.h" @@ -18,38 +19,81 @@ enum MemoryType STREAMING_MEMORY }; -class MemoryAllocator +class MemoryAllocator: public NonCopyable { private: - struct Allocation + enum BlockType + { + UNDECIDED, + BUFFER, + IMAGE + }; + + struct Pool { - VkDeviceMemory memory = 0; MemoryType type = UNKNOWN_MEMORY; + std::vector free_blocks; + int largest_free_buffer = -1; + int largest_free_image = -1; + bool can_consolidate = false; + }; + + struct Region + { + int pool = -1; + bool direct = false; + VkDeviceMemory memory = 0; std::size_t size = 0; void *mapped_address = 0; + unsigned map_count = 0; + }; + + struct Block + { + int region = -1; + bool allocated = false; + BlockType type = UNDECIDED; + std::size_t offset = 0; + std::size_t size = 0; + int prev = -1; + int next = -1; }; Device &device; VkPhysicalDevice phys_device; - std::vector memory_types; - std::vector allocations; + std::size_t total_device_memory = 0; + std::size_t default_region_size = 0; + std::size_t direct_alloc_threshold = 0; + std::size_t min_alignment = 256; + std::size_t buffer_image_granularity = 131072; + std::vector pools; + std::vector regions; + std::vector blocks; public: MemoryAllocator(Device &); + ~MemoryAllocator(); private: - unsigned find_memory_type_index(unsigned, MemoryType); - unsigned allocate(std::size_t, unsigned, MemoryType); - Allocation &get_allocation(unsigned); - const Allocation &get_allocation(unsigned) const; + unsigned find_memory_pool(unsigned, MemoryType) const; + unsigned create_region(unsigned, size_t, bool); + std::vector::iterator lower_bound_by_size(std::vector &, std::size_t) const; + std::size_t get_alloc_offset(const Block &, std::size_t, std::size_t, BlockType) const; + void update_largest_free(Pool &); + unsigned allocate(std::size_t, std::size_t, unsigned, MemoryType, BlockType); + unsigned split_block(unsigned, std::size_t); + void consolidate(unsigned); + void merge_block_with_next(unsigned); public: unsigned allocate(VkBuffer, MemoryType); unsigned allocate(VkImage, MemoryType); void release(unsigned); - void *map(unsigned, std::size_t, std::size_t); - void unmap(void *); + void *map(unsigned); + void unmap(unsigned); + + std::string get_debug() const; }; } // namespace GL