diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-05-21 06:06:40 +0200 |
---|---|---|
committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-05-21 21:44:00 +0200 |
commit | a2dcc642c1737721bafe54605c7826fa08d18f47 (patch) | |
tree | 655b96d46815d93259b12dccc8acad293437db41 /src/video_core/buffer_cache/map_interval.h | |
parent | buffer_cache: Use boost::container::small_vector for maps in range (diff) | |
download | yuzu-a2dcc642c1737721bafe54605c7826fa08d18f47.tar yuzu-a2dcc642c1737721bafe54605c7826fa08d18f47.tar.gz yuzu-a2dcc642c1737721bafe54605c7826fa08d18f47.tar.bz2 yuzu-a2dcc642c1737721bafe54605c7826fa08d18f47.tar.lz yuzu-a2dcc642c1737721bafe54605c7826fa08d18f47.tar.xz yuzu-a2dcc642c1737721bafe54605c7826fa08d18f47.tar.zst yuzu-a2dcc642c1737721bafe54605c7826fa08d18f47.zip |
Diffstat (limited to 'src/video_core/buffer_cache/map_interval.h')
-rw-r--r-- | src/video_core/buffer_cache/map_interval.h | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/video_core/buffer_cache/map_interval.h b/src/video_core/buffer_cache/map_interval.h index 45705cccf..fe0bcd1d8 100644 --- a/src/video_core/buffer_cache/map_interval.h +++ b/src/video_core/buffer_cache/map_interval.h @@ -4,6 +4,11 @@ #pragma once +#include <array> +#include <cstddef> +#include <memory> +#include <vector> + #include <boost/intrusive/set_hook.hpp> #include "common/common_types.h" @@ -12,6 +17,8 @@ namespace VideoCommon { struct MapInterval : public boost::intrusive::set_base_hook<boost::intrusive::optimize_size<true>> { + MapInterval() = default; + /*implicit*/ MapInterval(VAddr start_) noexcept : start{start_} {} explicit MapInterval(VAddr start_, VAddr end_, GPUVAddr gpu_addr_) noexcept @@ -48,4 +55,38 @@ struct MapIntervalCompare { } }; +class MapIntervalAllocator { +public: + MapIntervalAllocator(); + ~MapIntervalAllocator(); + + MapInterval* Allocate() { + if (free_list.empty()) { + AllocateNewChunk(); + } + MapInterval* const interval = free_list.back(); + free_list.pop_back(); + return interval; + } + + void Release(MapInterval* interval) { + free_list.push_back(interval); + } + +private: + struct Chunk { + std::unique_ptr<Chunk> next; + std::array<MapInterval, 0x8000> data; + }; + + void AllocateNewChunk(); + + void FillFreeList(Chunk& chunk); + + std::vector<MapInterval*> free_list; + std::unique_ptr<Chunk>* new_chunk = &first_chunk.next; + + Chunk first_chunk; +}; + } // namespace VideoCommon |