X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fmemoryallocator.h;h=70cda51643137e89e5af061fccd4b7f2e02b6460;hb=ef891fe4bf86704c37b4269d1aca190405455c12;hp=3e1861bae0fa9b6f088d044babb2460891c2f09c;hpb=b0f143b4db544a582b6fb77236e20ed72d2284cb;p=libs%2Fgl.git diff --git a/source/backends/vulkan/memoryallocator.h b/source/backends/vulkan/memoryallocator.h index 3e1861ba..70cda516 100644 --- a/source/backends/vulkan/memoryallocator.h +++ b/source/backends/vulkan/memoryallocator.h @@ -22,10 +22,19 @@ enum MemoryType class MemoryAllocator: public NonCopyable { private: + enum BlockType + { + UNDECIDED, + BUFFER, + IMAGE + }; + struct Pool { MemoryType type = UNKNOWN_MEMORY; std::vector free_blocks; + int largest_free_buffer = -1; + int largest_free_image = -1; bool can_consolidate = false; }; @@ -43,6 +52,7 @@ private: { int region = -1; bool allocated = false; + BlockType type = UNDECIDED; std::size_t offset = 0; std::size_t size = 0; int prev = -1; @@ -55,6 +65,7 @@ private: 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; @@ -64,10 +75,12 @@ public: ~MemoryAllocator(); private: - unsigned find_memory_pool(unsigned, MemoryType); + 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); - unsigned allocate(std::size_t, std::size_t, unsigned, MemoryType); + 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);