diff options
| author | 2021-10-17 01:22:13 +0200 | |
|---|---|---|
| committer | 2021-11-16 22:11:31 +0100 | |
| commit | ef1dc4263586f5b81b53a5158db2c1cd2086ed4c (patch) | |
| tree | 5fc6d6b3323151961f25c557584177790ad37227 /src | |
| parent | vulkan: Fix rescaling push constant usage (diff) | |
| download | yuzu-ef1dc4263586f5b81b53a5158db2c1cd2086ed4c.tar.gz yuzu-ef1dc4263586f5b81b53a5158db2c1cd2086ed4c.tar.xz yuzu-ef1dc4263586f5b81b53a5158db2c1cd2086ed4c.zip | |
Texture cache: Fix memory consumption and ignore rating when a depth texture is rendered.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 9 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 7 |
3 files changed, 19 insertions, 7 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index ec1afd31a..944a3aa65 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp | |||
| @@ -967,21 +967,24 @@ bool Image::ScaleUp() { | |||
| 967 | if (True(flags & ImageFlagBits::Rescaled)) { | 967 | if (True(flags & ImageFlagBits::Rescaled)) { |
| 968 | return false; | 968 | return false; |
| 969 | } | 969 | } |
| 970 | flags |= ImageFlagBits::Rescaled; | ||
| 970 | if (!runtime->resolution.active) { | 971 | if (!runtime->resolution.active) { |
| 971 | return false; | 972 | return false; |
| 972 | } | 973 | } |
| 973 | if (gl_format == 0 && gl_type == 0) { | 974 | if (gl_format == 0 && gl_type == 0) { |
| 974 | // compressed textures | 975 | // compressed textures |
| 976 | flags &= ~ImageFlagBits::Rescaled; | ||
| 975 | return false; | 977 | return false; |
| 976 | } | 978 | } |
| 977 | if (info.type == ImageType::Linear) { | 979 | if (info.type == ImageType::Linear) { |
| 978 | UNIMPLEMENTED(); | 980 | UNREACHABLE(); |
| 981 | flags &= ~ImageFlagBits::Rescaled; | ||
| 979 | return false; | 982 | return false; |
| 980 | } | 983 | } |
| 981 | if (!Scale()) { | 984 | if (!Scale()) { |
| 985 | flags &= ~ImageFlagBits::Rescaled; | ||
| 982 | return false; | 986 | return false; |
| 983 | } | 987 | } |
| 984 | flags |= ImageFlagBits::Rescaled; | ||
| 985 | return true; | 988 | return true; |
| 986 | } | 989 | } |
| 987 | 990 | ||
| @@ -990,6 +993,9 @@ bool Image::ScaleDown() { | |||
| 990 | return false; | 993 | return false; |
| 991 | } | 994 | } |
| 992 | flags &= ~ImageFlagBits::Rescaled; | 995 | flags &= ~ImageFlagBits::Rescaled; |
| 996 | if (!runtime->resolution.active) { | ||
| 997 | return false; | ||
| 998 | } | ||
| 993 | current_texture = texture.handle; | 999 | current_texture = texture.handle; |
| 994 | return true; | 1000 | return true; |
| 995 | } | 1001 | } |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 9b90c7d9b..a4fbbc735 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -1126,6 +1126,7 @@ bool Image::ScaleUp() { | |||
| 1126 | return false; | 1126 | return false; |
| 1127 | } | 1127 | } |
| 1128 | ASSERT(info.type != ImageType::Linear); | 1128 | ASSERT(info.type != ImageType::Linear); |
| 1129 | flags |= ImageFlagBits::Rescaled; | ||
| 1129 | const auto& resolution = runtime->resolution; | 1130 | const auto& resolution = runtime->resolution; |
| 1130 | if (!resolution.active) { | 1131 | if (!resolution.active) { |
| 1131 | return false; | 1132 | return false; |
| @@ -1188,11 +1189,11 @@ bool Image::ScaleUp() { | |||
| 1188 | dst_region, src_region, Tegra::Engines::Fermi2D::Filter::Point, BLIT_OPERATION); | 1189 | dst_region, src_region, Tegra::Engines::Fermi2D::Filter::Point, BLIT_OPERATION); |
| 1189 | } else { | 1190 | } else { |
| 1190 | // TODO: Use helper blits where applicable | 1191 | // TODO: Use helper blits where applicable |
| 1192 | flags &= ~ImageFlagBits::Rescaled; | ||
| 1191 | LOG_ERROR(Render_Vulkan, "Device does not support scaling format {}", format); | 1193 | LOG_ERROR(Render_Vulkan, "Device does not support scaling format {}", format); |
| 1192 | return false; | 1194 | return false; |
| 1193 | } | 1195 | } |
| 1194 | } | 1196 | } |
| 1195 | flags |= ImageFlagBits::Rescaled; | ||
| 1196 | return true; | 1197 | return true; |
| 1197 | } | 1198 | } |
| 1198 | 1199 | ||
| @@ -1200,8 +1201,12 @@ bool Image::ScaleDown() { | |||
| 1200 | if (False(flags & ImageFlagBits::Rescaled)) { | 1201 | if (False(flags & ImageFlagBits::Rescaled)) { |
| 1201 | return false; | 1202 | return false; |
| 1202 | } | 1203 | } |
| 1203 | ASSERT(info.type != ImageType::Linear); | ||
| 1204 | flags &= ~ImageFlagBits::Rescaled; | 1204 | flags &= ~ImageFlagBits::Rescaled; |
| 1205 | const auto& resolution = runtime->resolution; | ||
| 1206 | if (!resolution.active) { | ||
| 1207 | return false; | ||
| 1208 | } | ||
| 1209 | ASSERT(info.type != ImageType::Linear); | ||
| 1205 | current_image = *original_image; | 1210 | current_image = *original_image; |
| 1206 | return true; | 1211 | return true; |
| 1207 | } | 1212 | } |
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 261cb6c48..c06cddae9 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -230,7 +230,8 @@ void TextureCache<P>::UpdateRenderTargets(bool is_clear) { | |||
| 230 | auto& image = slot_images[image_id]; | 230 | auto& image = slot_images[image_id]; |
| 231 | can_rescale &= ImageCanRescale(image); | 231 | can_rescale &= ImageCanRescale(image); |
| 232 | any_blacklisted |= True(image.flags & ImageFlagBits::Blacklisted); | 232 | any_blacklisted |= True(image.flags & ImageFlagBits::Blacklisted); |
| 233 | any_rescaled |= True(image.flags & ImageFlagBits::Rescaled); | 233 | any_rescaled |= True(image.flags & ImageFlagBits::Rescaled) || |
| 234 | GetFormatType(image.info.format) != SurfaceType::ColorTexture; | ||
| 234 | scale_rating = std::max<u32>(scale_rating, image.scale_tick <= frame_tick | 235 | scale_rating = std::max<u32>(scale_rating, image.scale_tick <= frame_tick |
| 235 | ? image.scale_rating + 1U | 236 | ? image.scale_rating + 1U |
| 236 | : image.scale_rating); | 237 | : image.scale_rating); |
| @@ -857,7 +858,7 @@ u64 TextureCache<P>::GetScaledImageSizeBytes(Image& image) { | |||
| 857 | const f32 add_to_size = Settings::values.resolution_info.up_factor - 1.0f; | 858 | const f32 add_to_size = Settings::values.resolution_info.up_factor - 1.0f; |
| 858 | const bool sign = std::signbit(add_to_size); | 859 | const bool sign = std::signbit(add_to_size); |
| 859 | const u32 image_size_bytes = std::max(image.guest_size_bytes, image.unswizzled_size_bytes); | 860 | const u32 image_size_bytes = std::max(image.guest_size_bytes, image.unswizzled_size_bytes); |
| 860 | const u64 tentative_size = image_size_bytes * static_cast<u32>(std::abs(add_to_size)); | 861 | const u64 tentative_size = image_size_bytes * static_cast<u64>(std::abs(add_to_size)); |
| 861 | const u64 fitted_size = Common::AlignUp(tentative_size, 1024); | 862 | const u64 fitted_size = Common::AlignUp(tentative_size, 1024); |
| 862 | return sign ? -fitted_size : fitted_size; | 863 | return sign ? -fitted_size : fitted_size; |
| 863 | } | 864 | } |
| @@ -879,7 +880,7 @@ bool TextureCache<P>::ScaleDown(Image& image) { | |||
| 879 | if (!rescaled) { | 880 | if (!rescaled) { |
| 880 | return false; | 881 | return false; |
| 881 | } | 882 | } |
| 882 | total_used_memory += GetScaledImageSizeBytes(image); | 883 | total_used_memory -= GetScaledImageSizeBytes(image); |
| 883 | InvalidateScale(image); | 884 | InvalidateScale(image); |
| 884 | return true; | 885 | return true; |
| 885 | } | 886 | } |