buffer_base: Partially revert changes from #9559
This fixes a regression where Yoshi's Crafted World (and potentially other titles) would enter an infinite loop when GPU Accuracy was set to "Normal"
This commit is contained in:
		| @@ -538,7 +538,7 @@ TEST_CASE("BufferBase: Cached write downloads") { | |||||||
|     int num = 0; |     int num = 0; | ||||||
|     buffer.ForEachDownloadRangeAndClear(c, WORD, [&](u64 offset, u64 size) { ++num; }); |     buffer.ForEachDownloadRangeAndClear(c, WORD, [&](u64 offset, u64 size) { ++num; }); | ||||||
|     buffer.ForEachUploadRange(c, WORD, [&](u64 offset, u64 size) { ++num; }); |     buffer.ForEachUploadRange(c, WORD, [&](u64 offset, u64 size) { ++num; }); | ||||||
|     REQUIRE(num == 1); |     REQUIRE(num == 0); | ||||||
|     REQUIRE(!buffer.IsRegionCpuModified(c + PAGE, PAGE)); |     REQUIRE(!buffer.IsRegionCpuModified(c + PAGE, PAGE)); | ||||||
|     REQUIRE(!buffer.IsRegionGpuModified(c + PAGE, PAGE)); |     REQUIRE(!buffer.IsRegionGpuModified(c + PAGE, PAGE)); | ||||||
|     buffer.FlushCachedWrites(); |     buffer.FlushCachedWrites(); | ||||||
|   | |||||||
| @@ -430,7 +430,7 @@ private: | |||||||
|         if (query_begin >= SizeBytes() || size < 0) { |         if (query_begin >= SizeBytes() || size < 0) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         [[maybe_unused]] u64* const untracked_words = Array<Type::Untracked>(); |         u64* const untracked_words = Array<Type::Untracked>(); | ||||||
|         u64* const state_words = Array<type>(); |         u64* const state_words = Array<type>(); | ||||||
|         const u64 query_end = query_begin + std::min(static_cast<u64>(size), SizeBytes()); |         const u64 query_end = query_begin + std::min(static_cast<u64>(size), SizeBytes()); | ||||||
|         u64* const words_begin = state_words + query_begin / BYTES_PER_WORD; |         u64* const words_begin = state_words + query_begin / BYTES_PER_WORD; | ||||||
| @@ -483,7 +483,7 @@ private: | |||||||
|                 NotifyRasterizer<true>(word_index, current_bits, ~u64{0}); |                 NotifyRasterizer<true>(word_index, current_bits, ~u64{0}); | ||||||
|             } |             } | ||||||
|             // Exclude CPU modified pages when visiting GPU pages |             // Exclude CPU modified pages when visiting GPU pages | ||||||
|             const u64 word = current_word; |             const u64 word = current_word & ~(type == Type::GPU ? untracked_words[word_index] : 0); | ||||||
|             u64 page = page_begin; |             u64 page = page_begin; | ||||||
|             page_begin = 0; |             page_begin = 0; | ||||||
|  |  | ||||||
| @@ -531,7 +531,7 @@ private: | |||||||
|     [[nodiscard]] bool IsRegionModified(u64 offset, u64 size) const noexcept { |     [[nodiscard]] bool IsRegionModified(u64 offset, u64 size) const noexcept { | ||||||
|         static_assert(type != Type::Untracked); |         static_assert(type != Type::Untracked); | ||||||
|  |  | ||||||
|         [[maybe_unused]] const u64* const untracked_words = Array<Type::Untracked>(); |         const u64* const untracked_words = Array<Type::Untracked>(); | ||||||
|         const u64* const state_words = Array<type>(); |         const u64* const state_words = Array<type>(); | ||||||
|         const u64 num_query_words = size / BYTES_PER_WORD + 1; |         const u64 num_query_words = size / BYTES_PER_WORD + 1; | ||||||
|         const u64 word_begin = offset / BYTES_PER_WORD; |         const u64 word_begin = offset / BYTES_PER_WORD; | ||||||
| @@ -539,7 +539,8 @@ private: | |||||||
|         const u64 page_limit = Common::DivCeil(offset + size, BYTES_PER_PAGE); |         const u64 page_limit = Common::DivCeil(offset + size, BYTES_PER_PAGE); | ||||||
|         u64 page_index = (offset / BYTES_PER_PAGE) % PAGES_PER_WORD; |         u64 page_index = (offset / BYTES_PER_PAGE) % PAGES_PER_WORD; | ||||||
|         for (u64 word_index = word_begin; word_index < word_end; ++word_index, page_index = 0) { |         for (u64 word_index = word_begin; word_index < word_end; ++word_index, page_index = 0) { | ||||||
|             const u64 word = state_words[word_index]; |             const u64 off_word = type == Type::GPU ? untracked_words[word_index] : 0; | ||||||
|  |             const u64 word = state_words[word_index] & ~off_word; | ||||||
|             if (word == 0) { |             if (word == 0) { | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
| @@ -563,7 +564,7 @@ private: | |||||||
|     [[nodiscard]] std::pair<u64, u64> ModifiedRegion(u64 offset, u64 size) const noexcept { |     [[nodiscard]] std::pair<u64, u64> ModifiedRegion(u64 offset, u64 size) const noexcept { | ||||||
|         static_assert(type != Type::Untracked); |         static_assert(type != Type::Untracked); | ||||||
|  |  | ||||||
|         [[maybe_unused]] const u64* const untracked_words = Array<Type::Untracked>(); |         const u64* const untracked_words = Array<Type::Untracked>(); | ||||||
|         const u64* const state_words = Array<type>(); |         const u64* const state_words = Array<type>(); | ||||||
|         const u64 num_query_words = size / BYTES_PER_WORD + 1; |         const u64 num_query_words = size / BYTES_PER_WORD + 1; | ||||||
|         const u64 word_begin = offset / BYTES_PER_WORD; |         const u64 word_begin = offset / BYTES_PER_WORD; | ||||||
| @@ -573,7 +574,8 @@ private: | |||||||
|         u64 begin = std::numeric_limits<u64>::max(); |         u64 begin = std::numeric_limits<u64>::max(); | ||||||
|         u64 end = 0; |         u64 end = 0; | ||||||
|         for (u64 word_index = word_begin; word_index < word_end; ++word_index) { |         for (u64 word_index = word_begin; word_index < word_end; ++word_index) { | ||||||
|             const u64 word = state_words[word_index]; |             const u64 off_word = type == Type::GPU ? untracked_words[word_index] : 0; | ||||||
|  |             const u64 word = state_words[word_index] & ~off_word; | ||||||
|             if (word == 0) { |             if (word == 0) { | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user