diff options
| author | 2022-01-06 19:47:15 +0100 | |
|---|---|---|
| committer | 2022-10-06 21:00:52 +0200 | |
| commit | e44ac8b821833672f7c99ad22dbe57ac9403279d (patch) | |
| tree | 9457817c1a58c02e21800e44a7c193de04b76c61 /src | |
| parent | Texture cache: Fix the remaining issues with memory mnagement and unmapping. (diff) | |
| download | yuzu-e44ac8b821833672f7c99ad22dbe57ac9403279d.tar.gz yuzu-e44ac8b821833672f7c99ad22dbe57ac9403279d.tar.xz yuzu-e44ac8b821833672f7c99ad22dbe57ac9403279d.zip | |
Texture Cache: Fix GC and GPU Modified on Joins.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index a483892e4..66de41f04 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -1758,6 +1758,7 @@ void TextureCache<P>::SynchronizeAliases(ImageId image_id) { | |||
| 1758 | boost::container::small_vector<const AliasedImage*, 1> aliased_images; | 1758 | boost::container::small_vector<const AliasedImage*, 1> aliased_images; |
| 1759 | Image& image = slot_images[image_id]; | 1759 | Image& image = slot_images[image_id]; |
| 1760 | bool any_rescaled = True(image.flags & ImageFlagBits::Rescaled); | 1760 | bool any_rescaled = True(image.flags & ImageFlagBits::Rescaled); |
| 1761 | bool any_modified = True(image.flags & ImageFlagBits::GpuModified); | ||
| 1761 | u64 most_recent_tick = image.modification_tick; | 1762 | u64 most_recent_tick = image.modification_tick; |
| 1762 | for (const AliasedImage& aliased : image.aliased_images) { | 1763 | for (const AliasedImage& aliased : image.aliased_images) { |
| 1763 | ImageBase& aliased_image = slot_images[aliased.id]; | 1764 | ImageBase& aliased_image = slot_images[aliased.id]; |
| @@ -1765,9 +1766,7 @@ void TextureCache<P>::SynchronizeAliases(ImageId image_id) { | |||
| 1765 | most_recent_tick = std::max(most_recent_tick, aliased_image.modification_tick); | 1766 | most_recent_tick = std::max(most_recent_tick, aliased_image.modification_tick); |
| 1766 | aliased_images.push_back(&aliased); | 1767 | aliased_images.push_back(&aliased); |
| 1767 | any_rescaled |= True(aliased_image.flags & ImageFlagBits::Rescaled); | 1768 | any_rescaled |= True(aliased_image.flags & ImageFlagBits::Rescaled); |
| 1768 | if (True(aliased_image.flags & ImageFlagBits::GpuModified)) { | 1769 | any_modified |= True(aliased_image.flags & ImageFlagBits::GpuModified); |
| 1769 | image.flags |= ImageFlagBits::GpuModified; | ||
| 1770 | } | ||
| 1771 | } | 1770 | } |
| 1772 | } | 1771 | } |
| 1773 | if (aliased_images.empty()) { | 1772 | if (aliased_images.empty()) { |
| @@ -1782,6 +1781,9 @@ void TextureCache<P>::SynchronizeAliases(ImageId image_id) { | |||
| 1782 | } | 1781 | } |
| 1783 | } | 1782 | } |
| 1784 | image.modification_tick = most_recent_tick; | 1783 | image.modification_tick = most_recent_tick; |
| 1784 | if (any_modified) { | ||
| 1785 | image.flags |= ImageFlagBits::GpuModified; | ||
| 1786 | } | ||
| 1785 | std::ranges::sort(aliased_images, [this](const AliasedImage* lhs, const AliasedImage* rhs) { | 1787 | std::ranges::sort(aliased_images, [this](const AliasedImage* lhs, const AliasedImage* rhs) { |
| 1786 | const ImageBase& lhs_image = slot_images[lhs->id]; | 1788 | const ImageBase& lhs_image = slot_images[lhs->id]; |
| 1787 | const ImageBase& rhs_image = slot_images[rhs->id]; | 1789 | const ImageBase& rhs_image = slot_images[rhs->id]; |