early-access version 1792

This commit is contained in:
pineappleEA
2021-06-17 04:08:27 +02:00
parent 353c0bee63
commit d3ce8c0322
17 changed files with 124 additions and 50 deletions

View File

@@ -16,6 +16,7 @@
#include <boost/container/small_vector.hpp>
#include "common/common_sizes.h"
#include "common/common_types.h"
#include "common/div_ceil.h"
#include "common/microprofile.h"
@@ -65,8 +66,8 @@ class BufferCache {
static constexpr BufferId NULL_BUFFER_ID{0};
static constexpr u64 expected_memory = 512ULL * 1024ULL * 1024ULL;
static constexpr u64 critical_memory = 1024ULL * 1024ULL * 1024ULL;
static constexpr u64 EXPECTED_MEMORY = Common::Size_512_MB;
static constexpr u64 CRITICAL_MEMORY = Common::Size_1_GB;
using Maxwell = Tegra::Engines::Maxwell3D::Regs;
@@ -105,6 +106,8 @@ public:
void TickFrame();
void RunGarbageCollector();
void WriteMemory(VAddr cpu_addr, u64 size);
void CachedWriteMemory(VAddr cpu_addr, u64 size);
@@ -349,30 +352,8 @@ BufferCache<P>::BufferCache(VideoCore::RasterizerInterface& rasterizer_,
}
template <class P>
void BufferCache<P>::TickFrame() {
const bool enabled_gc = Settings::values.use_caches_gc.GetValue();
SCOPE_EXIT({
++frame_tick;
delayed_destruction_ring.Tick();
});
// Calculate hits and shots and move hit bits to the right
const u32 hits = std::reduce(uniform_cache_hits.begin(), uniform_cache_hits.end());
const u32 shots = std::reduce(uniform_cache_shots.begin(), uniform_cache_shots.end());
std::copy_n(uniform_cache_hits.begin(), uniform_cache_hits.size() - 1,
uniform_cache_hits.begin() + 1);
std::copy_n(uniform_cache_shots.begin(), uniform_cache_shots.size() - 1,
uniform_cache_shots.begin() + 1);
uniform_cache_hits[0] = 0;
uniform_cache_shots[0] = 0;
const bool skip_preferred = hits * 256 < shots * 251;
uniform_buffer_skip_cache_size = skip_preferred ? DEFAULT_SKIP_CACHE_SIZE : 0;
const bool activate_gc = enabled_gc && total_used_memory >= expected_memory;
if (!activate_gc) {
return;
}
const bool aggressive_gc = total_used_memory >= critical_memory;
void BufferCache<P>::RunGarbageCollector() {
const bool aggressive_gc = total_used_memory >= CRITICAL_MEMORY;
const u64 ticks_to_destroy = aggressive_gc ? 60 : 120;
int num_iterations = aggressive_gc ? 64 : 32;
for (; num_iterations > 0; --num_iterations) {
@@ -391,6 +372,28 @@ void BufferCache<P>::TickFrame() {
}
}
template <class P>
void BufferCache<P>::TickFrame() {
// Calculate hits and shots and move hit bits to the right
const u32 hits = std::reduce(uniform_cache_hits.begin(), uniform_cache_hits.end());
const u32 shots = std::reduce(uniform_cache_shots.begin(), uniform_cache_shots.end());
std::copy_n(uniform_cache_hits.begin(), uniform_cache_hits.size() - 1,
uniform_cache_hits.begin() + 1);
std::copy_n(uniform_cache_shots.begin(), uniform_cache_shots.size() - 1,
uniform_cache_shots.begin() + 1);
uniform_cache_hits[0] = 0;
uniform_cache_shots[0] = 0;
const bool skip_preferred = hits * 256 < shots * 251;
uniform_buffer_skip_cache_size = skip_preferred ? DEFAULT_SKIP_CACHE_SIZE : 0;
if (Settings::values.use_caches_gc.GetValue() && total_used_memory >= EXPECTED_MEMORY) {
RunGarbageCollector();
}
++frame_tick;
delayed_destruction_ring.Tick();
}
template <class P>
void BufferCache<P>::WriteMemory(VAddr cpu_addr, u64 size) {
ForEachBufferInRange(cpu_addr, size, [&](BufferId, Buffer& buffer) {