aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache/image_base.h
diff options
context:
space:
mode:
authorTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-28 15:37:34 -0400
committerTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-28 15:37:34 -0400
commit934ad3b97c12e1d40cf4e1f6094c756873b6af82 (patch)
tree5e867981c552d4b74898db22a90230dbd4fda546 /src/video_core/texture_cache/image_base.h
parent8393e2912616ce475619900be8cb29e551ff2997 (diff)
Keep huge ASTC arrays from a lower mip on the host (title 1 terrain)
Title 1's terrain virtual textures are 8192x8192x68 ASTC 8x8 sRGB arrays with 12 levels: 1.5 GB in guest memory (fully backed) but 23 GB each as the RGBA8 Eden decodes ASTC to, so they were created unbacked and the near terrain sampled black. A GPU-decoded ASTC 2D array over 1 GiB decoded now keeps only the levels from the first one that fits in 512 MiB (here 3: 1024x1024, 380 MiB); host mip 0 is that guest level. Uploads read each layer's tail of the mip chain into a compact buffer and decode only those levels, views shift their level range, and these images are never downloaded. Normalized coordinates and derivative LOD address the smaller image correctly; the nearest terrain is lower resolution than on the console. Also logs how unbacked images are used (views, render targets, blits, DMA).
Diffstat (limited to 'src/video_core/texture_cache/image_base.h')
-rw-r--r--src/video_core/texture_cache/image_base.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/video_core/texture_cache/image_base.h b/src/video_core/texture_cache/image_base.h
index 846a6f7fc1..d0af53631d 100644
--- a/src/video_core/texture_cache/image_base.h
+++ b/src/video_core/texture_cache/image_base.h
@@ -46,6 +46,9 @@ enum class ImageFlagBits : u32 {
AsynchronousDecode = 1 << 16,
IsDecoding = 1 << 17, ///< Is currently being decoded asynchronously.
Unbacked = 1 << 18, ///< Host image has no memory (too big to back); never upload/download.
+ /// The host image keeps only mip levels >= host_level_offset (its decoded copy would not fit
+ /// in VRAM); uploads skip the rest, downloads are never done.
+ TrimmedLevels = 1 << 19,
};
DECLARE_ENUM_FLAG_OPERATORS(ImageFlagBits)
@@ -94,6 +97,7 @@ struct ImageBase {
u32 unswizzled_size_bytes = 0;
u32 converted_size_bytes = 0;
u32 scale_rating = 0;
+ u32 host_level_offset = 0; ///< Guest mip level held by host mip 0 (see TrimmedLevels).
u64 scale_tick = 0;
bool has_scaled = false;