]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/memoryallocator.h
Avoid allocating buffers and images too close together
[libs/gl.git] / source / backends / vulkan / memoryallocator.h
index 0b185585e89e14bab48536449c7c68c8d1bbcfd3..70cda51643137e89e5af061fccd4b7f2e02b6460 100644 (file)
@@ -22,10 +22,19 @@ enum MemoryType
 class MemoryAllocator: public NonCopyable
 {
 private:
+       enum BlockType
+       {
+               UNDECIDED,
+               BUFFER,
+               IMAGE
+       };
+
        struct Pool
        {
                MemoryType type = UNKNOWN_MEMORY;
                std::vector<unsigned> 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<Pool> pools;
        std::vector<Region> regions;
        std::vector<Block> blocks;
@@ -67,7 +78,9 @@ private:
        unsigned find_memory_pool(unsigned, MemoryType) const;
        unsigned create_region(unsigned, size_t, bool);
        std::vector<unsigned>::iterator lower_bound_by_size(std::vector<unsigned> &, std::size_t) const;
-       unsigned allocate(std::size_t, std::size_t, unsigned, MemoryType);
+       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);