video_core: use interval map for page count tracking

This commit is contained in:
Liam
2023-12-12 17:15:52 -05:00
parent 462ba1b360
commit 030e6b3980
7 changed files with 66 additions and 76 deletions

View File

@ -3,8 +3,7 @@
#pragma once
#include <array>
#include <atomic>
#include <boost/icl/interval_map.hpp>
#include "common/common_types.h"
#include "video_core/rasterizer_interface.h"
@ -21,28 +20,16 @@ public:
explicit RasterizerAccelerated(Core::Memory::Memory& cpu_memory_);
~RasterizerAccelerated() override;
void UpdatePagesCachedCount(VAddr addr, u64 size, int delta) override;
void UpdatePagesCachedCount(VAddr addr, u64 size, bool cache) override;
private:
class CacheEntry final {
public:
CacheEntry() = default;
using PageIndex = VAddr;
using PageReferenceCount = u16;
std::atomic_uint16_t& Count(std::size_t page) {
return values[page & 3];
}
using IntervalMap = boost::icl::interval_map<PageIndex, PageReferenceCount>;
using IntervalType = IntervalMap::interval_type;
const std::atomic_uint16_t& Count(std::size_t page) const {
return values[page & 3];
}
private:
std::array<std::atomic_uint16_t, 4> values{};
};
static_assert(sizeof(CacheEntry) == 8, "CacheEntry should be 8 bytes!");
using CachedPages = std::array<CacheEntry, 0x2000000>;
std::unique_ptr<CachedPages> cached_pages;
IntervalMap map;
Core::Memory::Memory& cpu_memory;
};