Reaper: Address Feedback.

This commit is contained in:
Fernando Sahmkow 2021-06-14 13:42:22 +02:00
parent 954ad2a61e
commit 0dd98842bf
6 changed files with 43 additions and 20 deletions

View file

@ -20,6 +20,7 @@
#include "common/alignment.h"
#include "common/common_funcs.h"
#include "common/common_sizes.h"
#include "common/common_types.h"
#include "common/logging/log.h"
#include "common/settings.h"
@ -76,8 +77,8 @@ class TextureCache {
/// Sampler ID for bugged sampler ids
static constexpr SamplerId NULL_SAMPLER_ID{0};
static constexpr u64 expected_memory = 1024ULL * 1024ULL * 1024ULL;
static constexpr u64 critical_memory = 2 * 1024ULL * 1024ULL * 1024ULL;
static constexpr u64 EXPECTED_MEMORY = Common::Size_1_GB;
static constexpr u64 CRITICAL_MEMORY = Common::Size_2_GB;
using Runtime = typename P::Runtime;
using Image = typename P::Image;
@ -394,8 +395,8 @@ void TextureCache<P>::TickFrame() {
++frame_tick;
return;
}
const bool high_priority_mode = total_used_memory >= expected_memory;
const bool aggressive_mode = total_used_memory >= critical_memory;
const bool high_priority_mode = total_used_memory >= EXPECTED_MEMORY;
const bool aggressive_mode = total_used_memory >= CRITICAL_MEMORY;
const u64 ticks_to_destroy = high_priority_mode ? 60 : 100;
int num_iterations = aggressive_mode ? 256 : (high_priority_mode ? 128 : 64);
for (; num_iterations > 0; --num_iterations) {
@ -405,7 +406,8 @@ void TextureCache<P>::TickFrame() {
break;
}
}
const auto [image_id, image] = *deletion_iterator;
auto [image_id, image_tmp] = *deletion_iterator;
Image* image = image_tmp; // fix clang error.
const bool is_alias = True(image->flags & ImageFlagBits::Alias);
const bool is_bad_overlap = True(image->flags & ImageFlagBits::BadOverlap);
const bool must_download = image->IsSafeDownload();
@ -417,8 +419,8 @@ void TextureCache<P>::TickFrame() {
should_care |= aggressive_mode;
if (should_care && image->frame_tick + ticks_needed < frame_tick) {
if (is_bad_overlap) {
const bool overlap_check =
std::ranges::all_of(image->overlapping_images, [&](const ImageId& overlap_id) {
const bool overlap_check = std::ranges::all_of(
image->overlapping_images, [&, image](const ImageId& overlap_id) {
auto& overlap = slot_images[overlap_id];
return overlap.frame_tick >= image->frame_tick;
});
@ -428,8 +430,8 @@ void TextureCache<P>::TickFrame() {
}
}
if (!is_bad_overlap && must_download) {
const bool alias_check =
std::ranges::none_of(image->aliased_images, [&](const AliasedImage& alias) {
const bool alias_check = std::ranges::none_of(
image->aliased_images, [&, image](const AliasedImage& alias) {
auto& alias_image = slot_images[alias.id];
return (alias_image.frame_tick < image->frame_tick) ||
(alias_image.modification_tick < image->modification_tick);
@ -1275,8 +1277,13 @@ void TextureCache<P>::RegisterImage(ImageId image_id) {
image.flags |= ImageFlagBits::Registered;
ForEachPage(image.cpu_addr, image.guest_size_bytes,
[this, image_id](u64 page) { page_table[page].push_back(image_id); });
total_used_memory +=
Common::AlignUp(std::max(image.guest_size_bytes, image.unswizzled_size_bytes), 1024);
u64 tentative_size = std::max(image.guest_size_bytes, image.unswizzled_size_bytes);
if ((IsPixelFormatASTC(image.info.format) &&
True(image.flags & ImageFlagBits::AcceleratedUpload)) ||
True(image.flags & ImageFlagBits::Converted)) {
tentative_size = EstimatedDecompressedSize(tentative_size, image.info.format);
}
total_used_memory += Common::AlignUp(tentative_size, 1024);
}
template <class P>
@ -1286,8 +1293,13 @@ void TextureCache<P>::UnregisterImage(ImageId image_id) {
"Trying to unregister an already registered image");
image.flags &= ~ImageFlagBits::Registered;
image.flags &= ~ImageFlagBits::BadOverlap;
total_used_memory -=
Common::AlignUp(std::max(image.guest_size_bytes, image.unswizzled_size_bytes), 1024);
u64 tentative_size = std::max(image.guest_size_bytes, image.unswizzled_size_bytes);
if ((IsPixelFormatASTC(image.info.format) &&
True(image.flags & ImageFlagBits::AcceleratedUpload)) ||
True(image.flags & ImageFlagBits::Converted)) {
tentative_size = EstimatedDecompressedSize(tentative_size, image.info.format);
}
total_used_memory -= Common::AlignUp(tentative_size, 1024);
ForEachPage(image.cpu_addr, image.guest_size_bytes, [this, image_id](u64 page) {
const auto page_it = page_table.find(page);
if (page_it == page_table.end()) {