summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2021-10-17 01:22:13 +0200
committerGravatar Fernando Sahmkow2021-11-16 22:11:31 +0100
commitef1dc4263586f5b81b53a5158db2c1cd2086ed4c (patch)
tree5fc6d6b3323151961f25c557584177790ad37227 /src
parentvulkan: Fix rescaling push constant usage (diff)
downloadyuzu-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.cpp10
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp9
-rw-r--r--src/video_core/texture_cache/texture_cache.h7
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}