[texture_cache] Fix a rare visual corruption under specific conditions (#3986)

This fixes a rare visual corruption that can occur under specific conditions depending on the hardware used.

This bug is known to affect the loading screens in The Legend of Zelda: Tears of the Kingdom.

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3986
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
This commit is contained in:
MaranBr 2026-05-24 01:03:20 +02:00 committed by crueter
parent 06c8926a2e
commit 573e06131d
No known key found for this signature in database
GPG key ID: 425ACD2D4830EBC6
2 changed files with 5 additions and 2 deletions

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@ -60,7 +63,7 @@ public:
template <typename Func> template <typename Func>
void ForEachItemBelow(TickType tick, Func&& func) { void ForEachItemBelow(TickType tick, Func&& func) {
static constexpr bool RETURNS_BOOL = static constexpr bool RETURNS_BOOL =
std::is_same_v<std::invoke_result<Func, ObjectType>, bool>; std::is_same_v<std::invoke_result_t<Func, ObjectType>, bool>;
Item* iterator = first_item; Item* iterator = first_item;
while (iterator) { while (iterator) {
if (static_cast<s64>(tick) - static_cast<s64>(iterator->tick) < 0) { if (static_cast<s64>(tick) - static_cast<s64>(iterator->tick) < 0) {

View file

@ -128,6 +128,7 @@ void TextureCache<P>::RunGarbageCollector() {
if (num_iterations == 0) { if (num_iterations == 0) {
return true; return true;
} }
--num_iterations;
auto& image = slot_images[image_id]; auto& image = slot_images[image_id];
if (True(image.flags & ImageFlagBits::IsDecoding)) { if (True(image.flags & ImageFlagBits::IsDecoding)) {
return false; return false;
@ -136,7 +137,6 @@ void TextureCache<P>::RunGarbageCollector() {
if ((!aggressive_mode && True(image.flags & ImageFlagBits::CostlyLoad)) || (!high_priority_mode && must_download)) { if ((!aggressive_mode && True(image.flags & ImageFlagBits::CostlyLoad)) || (!high_priority_mode && must_download)) {
return false; return false;
} }
--num_iterations;
if (must_download) { if (must_download) {
auto map = runtime.DownloadStagingBuffer(image.unswizzled_size_bytes); auto map = runtime.DownloadStagingBuffer(image.unswizzled_size_bytes);
const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info));