diff options
| author | 2021-10-12 01:45:54 -0400 | |
|---|---|---|
| committer | 2021-11-16 22:11:31 +0100 | |
| commit | 4de584005fe8ae00608f8c3267a78e7cf0eb52aa (patch) | |
| tree | adbbf400f85034b0661513f27f56e110685c2950 /src/video_core/texture_cache | |
| parent | vk_texture_cache: Fix BlitScale of non-2D images (diff) | |
| download | yuzu-4de584005fe8ae00608f8c3267a78e7cf0eb52aa.tar.gz yuzu-4de584005fe8ae00608f8c3267a78e7cf0eb52aa.tar.xz yuzu-4de584005fe8ae00608f8c3267a78e7cf0eb52aa.zip | |
texture_cache: Fix infinitely recursive ImageCanRescale check
Diffstat (limited to 'src/video_core/texture_cache')
| -rw-r--r-- | src/video_core/texture_cache/image_base.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/texture_cache/image_base.h | 5 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 16 |
3 files changed, 13 insertions, 10 deletions
diff --git a/src/video_core/texture_cache/image_base.cpp b/src/video_core/texture_cache/image_base.cpp index 25a211df8..1909c9ecb 100644 --- a/src/video_core/texture_cache/image_base.cpp +++ b/src/video_core/texture_cache/image_base.cpp | |||
| @@ -256,6 +256,8 @@ void AddImageAlias(ImageBase& lhs, ImageBase& rhs, ImageId lhs_id, ImageId rhs_i | |||
| 256 | } | 256 | } |
| 257 | lhs.aliased_images.push_back(std::move(lhs_alias)); | 257 | lhs.aliased_images.push_back(std::move(lhs_alias)); |
| 258 | rhs.aliased_images.push_back(std::move(rhs_alias)); | 258 | rhs.aliased_images.push_back(std::move(rhs_alias)); |
| 259 | lhs.flags &= ~ImageFlagBits::IsRescalable; | ||
| 260 | rhs.flags &= ~ImageFlagBits::IsRescalable; | ||
| 259 | } | 261 | } |
| 260 | 262 | ||
| 261 | } // namespace VideoCommon | 263 | } // namespace VideoCommon |
diff --git a/src/video_core/texture_cache/image_base.h b/src/video_core/texture_cache/image_base.h index 9c34687e0..bab290ac7 100644 --- a/src/video_core/texture_cache/image_base.h +++ b/src/video_core/texture_cache/image_base.h | |||
| @@ -36,8 +36,9 @@ enum class ImageFlagBits : u32 { | |||
| 36 | 36 | ||
| 37 | // Rescaler | 37 | // Rescaler |
| 38 | Rescaled = 1 << 12, | 38 | Rescaled = 1 << 12, |
| 39 | RescaleChecked = 1 << 13, | 39 | CheckingRescalable = 1 << 13, |
| 40 | Blacklisted = 1 << 14, | 40 | IsRescalable = 1 << 14, |
| 41 | Blacklisted = 1 << 15, | ||
| 41 | }; | 42 | }; |
| 42 | DECLARE_ENUM_FLAG_OPERATORS(ImageFlagBits) | 43 | DECLARE_ENUM_FLAG_OPERATORS(ImageFlagBits) |
| 43 | 44 | ||
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index c77332b46..c1fb12679 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -795,25 +795,25 @@ bool TextureCache<P>::BlackListImage(ImageId image_id) { | |||
| 795 | 795 | ||
| 796 | template <class P> | 796 | template <class P> |
| 797 | bool TextureCache<P>::ImageCanRescale(ImageBase& image) { | 797 | bool TextureCache<P>::ImageCanRescale(ImageBase& image) { |
| 798 | if (True(image.flags & ImageFlagBits::Blacklisted)) { | 798 | if (!image.info.rescaleable || True(image.flags & ImageFlagBits::Blacklisted)) { |
| 799 | return false; | 799 | return false; |
| 800 | } | 800 | } |
| 801 | if (True(image.flags & (ImageFlagBits::Rescaled | ImageFlagBits::RescaleChecked))) { | 801 | if (True(image.flags & (ImageFlagBits::Rescaled | ImageFlagBits::CheckingRescalable))) { |
| 802 | return true; | 802 | return true; |
| 803 | } | 803 | } |
| 804 | if (!image.info.rescaleable) { | 804 | if (True(image.flags & ImageFlagBits::IsRescalable)) { |
| 805 | image.flags &= ~ImageFlagBits::RescaleChecked; | 805 | return true; |
| 806 | return false; | ||
| 807 | } | 806 | } |
| 808 | image.flags |= ImageFlagBits::RescaleChecked; | 807 | image.flags |= ImageFlagBits::CheckingRescalable; |
| 809 | for (const auto& alias : image.aliased_images) { | 808 | for (const auto& alias : image.aliased_images) { |
| 810 | Image& other_image = slot_images[alias.id]; | 809 | Image& other_image = slot_images[alias.id]; |
| 811 | if (!ImageCanRescale(other_image)) { | 810 | if (!ImageCanRescale(other_image)) { |
| 812 | image.flags &= ~ImageFlagBits::RescaleChecked; | 811 | image.flags &= ~ImageFlagBits::CheckingRescalable; |
| 813 | return false; | 812 | return false; |
| 814 | } | 813 | } |
| 815 | } | 814 | } |
| 816 | image.flags &= ~ImageFlagBits::RescaleChecked; | 815 | image.flags &= ~ImageFlagBits::CheckingRescalable; |
| 816 | image.flags |= ImageFlagBits::IsRescalable; | ||
| 817 | return true; | 817 | return true; |
| 818 | } | 818 | } |
| 819 | 819 | ||