diff options
| author | 2023-09-20 02:46:58 +1000 | |
|---|---|---|
| committer | 2023-09-20 03:27:13 +1000 | |
| commit | 02b897ce27f08c0b120db207ea47edd0cfa7998c (patch) | |
| tree | 118827f0d8a5cd7d38a956ffac56357e0c3875b2 /src/video_core/texture_cache | |
| parent | Partial revert of #10433 (diff) | |
| download | yuzu-02b897ce27f08c0b120db207ea47edd0cfa7998c.tar.gz yuzu-02b897ce27f08c0b120db207ea47edd0cfa7998c.tar.xz yuzu-02b897ce27f08c0b120db207ea47edd0cfa7998c.zip | |
Reuse part of my previous idea to to use num_levels to check within AdjustMipBlockSize
The partial revert was not enough for Tsukihime, this might do the trick
Diffstat (limited to 'src/video_core/texture_cache')
| -rw-r--r-- | src/video_core/texture_cache/util.cpp | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/src/video_core/texture_cache/util.cpp b/src/video_core/texture_cache/util.cpp index d36145eaa..0f8ef4277 100644 --- a/src/video_core/texture_cache/util.cpp +++ b/src/video_core/texture_cache/util.cpp | |||
| @@ -68,6 +68,7 @@ struct LevelInfo { | |||
| 68 | Extent2D tile_size; | 68 | Extent2D tile_size; |
| 69 | u32 bpp_log2; | 69 | u32 bpp_log2; |
| 70 | u32 tile_width_spacing; | 70 | u32 tile_width_spacing; |
| 71 | u32 num_levels; | ||
| 71 | }; | 72 | }; |
| 72 | 73 | ||
| 73 | [[nodiscard]] constexpr u32 AdjustTileSize(u32 shift, u32 unit_factor, u32 dimension) { | 74 | [[nodiscard]] constexpr u32 AdjustTileSize(u32 shift, u32 unit_factor, u32 dimension) { |
| @@ -118,11 +119,11 @@ template <u32 GOB_EXTENT> | |||
| 118 | } | 119 | } |
| 119 | 120 | ||
| 120 | [[nodiscard]] constexpr Extent3D AdjustMipBlockSize(Extent3D num_tiles, Extent3D block_size, | 121 | [[nodiscard]] constexpr Extent3D AdjustMipBlockSize(Extent3D num_tiles, Extent3D block_size, |
| 121 | u32 level) { | 122 | u32 level, u32 num_levels) { |
| 122 | return { | 123 | return { |
| 123 | .width = AdjustMipBlockSize<GOB_SIZE_X>(num_tiles.width, block_size.width, level), | 124 | .width = AdjustMipBlockSize<GOB_SIZE_X>(num_tiles.width, block_size.width, level), |
| 124 | .height = AdjustMipBlockSize<GOB_SIZE_Y>(num_tiles.height, block_size.height, level), | 125 | .height = AdjustMipBlockSize<GOB_SIZE_Y>(num_tiles.height, block_size.height, level), |
| 125 | .depth = level == 0 | 126 | .depth = level == 0 && num_levels == 1 |
| 126 | ? block_size.depth | 127 | ? block_size.depth |
| 127 | : AdjustMipBlockSize<GOB_SIZE_Z>(num_tiles.depth, block_size.depth, level), | 128 | : AdjustMipBlockSize<GOB_SIZE_Z>(num_tiles.depth, block_size.depth, level), |
| 128 | }; | 129 | }; |
| @@ -250,7 +251,7 @@ template <u32 GOB_EXTENT> | |||
| 250 | } | 251 | } |
| 251 | 252 | ||
| 252 | [[nodiscard]] constexpr LevelInfo MakeLevelInfo(PixelFormat format, Extent3D size, Extent3D block, | 253 | [[nodiscard]] constexpr LevelInfo MakeLevelInfo(PixelFormat format, Extent3D size, Extent3D block, |
| 253 | u32 tile_width_spacing) { | 254 | u32 tile_width_spacing, u32 num_levels) { |
| 254 | const u32 bytes_per_block = BytesPerBlock(format); | 255 | const u32 bytes_per_block = BytesPerBlock(format); |
| 255 | return { | 256 | return { |
| 256 | .size = | 257 | .size = |
| @@ -263,16 +264,18 @@ template <u32 GOB_EXTENT> | |||
| 263 | .tile_size = DefaultBlockSize(format), | 264 | .tile_size = DefaultBlockSize(format), |
| 264 | .bpp_log2 = BytesPerBlockLog2(bytes_per_block), | 265 | .bpp_log2 = BytesPerBlockLog2(bytes_per_block), |
| 265 | .tile_width_spacing = tile_width_spacing, | 266 | .tile_width_spacing = tile_width_spacing, |
| 267 | .num_levels = num_levels, | ||
| 266 | }; | 268 | }; |
| 267 | } | 269 | } |
| 268 | 270 | ||
| 269 | [[nodiscard]] constexpr LevelInfo MakeLevelInfo(const ImageInfo& info) { | 271 | [[nodiscard]] constexpr LevelInfo MakeLevelInfo(const ImageInfo& info) { |
| 270 | return MakeLevelInfo(info.format, info.size, info.block, info.tile_width_spacing); | 272 | return MakeLevelInfo(info.format, info.size, info.block, info.tile_width_spacing, |
| 273 | info.resources.levels); | ||
| 271 | } | 274 | } |
| 272 | 275 | ||
| 273 | [[nodiscard]] constexpr u32 CalculateLevelOffset(PixelFormat format, Extent3D size, Extent3D block, | 276 | [[nodiscard]] constexpr u32 CalculateLevelOffset(PixelFormat format, Extent3D size, Extent3D block, |
| 274 | u32 tile_width_spacing, u32 level) { | 277 | u32 tile_width_spacing, u32 level) { |
| 275 | const LevelInfo info = MakeLevelInfo(format, size, block, tile_width_spacing); | 278 | const LevelInfo info = MakeLevelInfo(format, size, block, tile_width_spacing, level); |
| 276 | u32 offset = 0; | 279 | u32 offset = 0; |
| 277 | for (u32 current_level = 0; current_level < level; ++current_level) { | 280 | for (u32 current_level = 0; current_level < level; ++current_level) { |
| 278 | offset += CalculateLevelSize(info, current_level); | 281 | offset += CalculateLevelSize(info, current_level); |
| @@ -459,7 +462,7 @@ template <u32 GOB_EXTENT> | |||
| 459 | }; | 462 | }; |
| 460 | const u32 bpp_log2 = BytesPerBlockLog2(info.format); | 463 | const u32 bpp_log2 = BytesPerBlockLog2(info.format); |
| 461 | const u32 alignment = StrideAlignment(num_tiles, info.block, bpp_log2, info.tile_width_spacing); | 464 | const u32 alignment = StrideAlignment(num_tiles, info.block, bpp_log2, info.tile_width_spacing); |
| 462 | const Extent3D mip_block = AdjustMipBlockSize(num_tiles, info.block, 0); | 465 | const Extent3D mip_block = AdjustMipBlockSize(num_tiles, info.block, 0, info.resources.levels); |
| 463 | return Extent3D{ | 466 | return Extent3D{ |
| 464 | .width = Common::AlignUpLog2(num_tiles.width, alignment), | 467 | .width = Common::AlignUpLog2(num_tiles.width, alignment), |
| 465 | .height = Common::AlignUpLog2(num_tiles.height, GOB_SIZE_Y_SHIFT + mip_block.height), | 468 | .height = Common::AlignUpLog2(num_tiles.height, GOB_SIZE_Y_SHIFT + mip_block.height), |
| @@ -526,7 +529,8 @@ void SwizzleBlockLinearImage(Tegra::MemoryManager& gpu_memory, GPUVAddr gpu_addr | |||
| 526 | UNIMPLEMENTED_IF(copy.image_extent != level_size); | 529 | UNIMPLEMENTED_IF(copy.image_extent != level_size); |
| 527 | 530 | ||
| 528 | const Extent3D num_tiles = AdjustTileSize(level_size, tile_size); | 531 | const Extent3D num_tiles = AdjustTileSize(level_size, tile_size); |
| 529 | const Extent3D block = AdjustMipBlockSize(num_tiles, level_info.block, level); | 532 | const Extent3D block = |
| 533 | AdjustMipBlockSize(num_tiles, level_info.block, level, level_info.num_levels); | ||
| 530 | 534 | ||
| 531 | size_t host_offset = copy.buffer_offset; | 535 | size_t host_offset = copy.buffer_offset; |
| 532 | 536 | ||
| @@ -691,7 +695,7 @@ u32 CalculateLevelStrideAlignment(const ImageInfo& info, u32 level) { | |||
| 691 | const Extent2D tile_size = DefaultBlockSize(info.format); | 695 | const Extent2D tile_size = DefaultBlockSize(info.format); |
| 692 | const Extent3D level_size = AdjustMipSize(info.size, level); | 696 | const Extent3D level_size = AdjustMipSize(info.size, level); |
| 693 | const Extent3D num_tiles = AdjustTileSize(level_size, tile_size); | 697 | const Extent3D num_tiles = AdjustTileSize(level_size, tile_size); |
| 694 | const Extent3D block = AdjustMipBlockSize(num_tiles, info.block, level); | 698 | const Extent3D block = AdjustMipBlockSize(num_tiles, info.block, level, info.resources.levels); |
| 695 | const u32 bpp_log2 = BytesPerBlockLog2(info.format); | 699 | const u32 bpp_log2 = BytesPerBlockLog2(info.format); |
| 696 | return StrideAlignment(num_tiles, block, bpp_log2, info.tile_width_spacing); | 700 | return StrideAlignment(num_tiles, block, bpp_log2, info.tile_width_spacing); |
| 697 | } | 701 | } |
| @@ -880,7 +884,8 @@ boost::container::small_vector<BufferImageCopy, 16> UnswizzleImage(Tegra::Memory | |||
| 880 | .image_extent = level_size, | 884 | .image_extent = level_size, |
| 881 | }; | 885 | }; |
| 882 | const Extent3D num_tiles = AdjustTileSize(level_size, tile_size); | 886 | const Extent3D num_tiles = AdjustTileSize(level_size, tile_size); |
| 883 | const Extent3D block = AdjustMipBlockSize(num_tiles, level_info.block, level); | 887 | const Extent3D block = |
| 888 | AdjustMipBlockSize(num_tiles, info.block, level, level_info.num_levels); | ||
| 884 | const u32 stride_alignment = StrideAlignment(num_tiles, info.block, gob, bpp_log2); | 889 | const u32 stride_alignment = StrideAlignment(num_tiles, info.block, gob, bpp_log2); |
| 885 | size_t guest_layer_offset = 0; | 890 | size_t guest_layer_offset = 0; |
| 886 | 891 | ||
| @@ -1034,7 +1039,7 @@ Extent3D MipBlockSize(const ImageInfo& info, u32 level) { | |||
| 1034 | const Extent2D tile_size = DefaultBlockSize(info.format); | 1039 | const Extent2D tile_size = DefaultBlockSize(info.format); |
| 1035 | const Extent3D level_size = AdjustMipSize(info.size, level); | 1040 | const Extent3D level_size = AdjustMipSize(info.size, level); |
| 1036 | const Extent3D num_tiles = AdjustTileSize(level_size, tile_size); | 1041 | const Extent3D num_tiles = AdjustTileSize(level_size, tile_size); |
| 1037 | return AdjustMipBlockSize(num_tiles, level_info.block, level); | 1042 | return AdjustMipBlockSize(num_tiles, level_info.block, level, level_info.num_levels); |
| 1038 | } | 1043 | } |
| 1039 | 1044 | ||
| 1040 | boost::container::small_vector<SwizzleParameters, 16> FullUploadSwizzles(const ImageInfo& info) { | 1045 | boost::container::small_vector<SwizzleParameters, 16> FullUploadSwizzles(const ImageInfo& info) { |
| @@ -1056,7 +1061,8 @@ boost::container::small_vector<SwizzleParameters, 16> FullUploadSwizzles(const I | |||
| 1056 | for (s32 level = 0; level < num_levels; ++level) { | 1061 | for (s32 level = 0; level < num_levels; ++level) { |
| 1057 | const Extent3D level_size = AdjustMipSize(size, level); | 1062 | const Extent3D level_size = AdjustMipSize(size, level); |
| 1058 | const Extent3D num_tiles = AdjustTileSize(level_size, tile_size); | 1063 | const Extent3D num_tiles = AdjustTileSize(level_size, tile_size); |
| 1059 | const Extent3D block = AdjustMipBlockSize(num_tiles, level_info.block, level); | 1064 | const Extent3D block = |
| 1065 | AdjustMipBlockSize(num_tiles, info.block, level, level_info.num_levels); | ||
| 1060 | params[level] = SwizzleParameters{ | 1066 | params[level] = SwizzleParameters{ |
| 1061 | .num_tiles = num_tiles, | 1067 | .num_tiles = num_tiles, |
| 1062 | .block = block, | 1068 | .block = block, |
| @@ -1285,11 +1291,11 @@ u32 MapSizeBytes(const ImageBase& image) { | |||
| 1285 | } | 1291 | } |
| 1286 | } | 1292 | } |
| 1287 | 1293 | ||
| 1288 | static_assert(CalculateLevelSize(LevelInfo{{1920, 1080, 1}, {0, 2, 0}, {1, 1}, 2, 0}, 0) == | 1294 | static_assert(CalculateLevelSize(LevelInfo{{1920, 1080, 1}, {0, 2, 0}, {1, 1}, 2, 0, 1}, 0) == |
| 1289 | 0x7f8000); | 1295 | 0x7f8000); |
| 1290 | static_assert(CalculateLevelSize(LevelInfo{{32, 32, 1}, {0, 0, 4}, {1, 1}, 4, 0}, 0) == 0x4000); | 1296 | static_assert(CalculateLevelSize(LevelInfo{{32, 32, 1}, {0, 0, 4}, {1, 1}, 4, 0, 1}, 0) == 0x4000); |
| 1291 | 1297 | ||
| 1292 | static_assert(CalculateLevelSize(LevelInfo{{128, 8, 1}, {0, 4, 0}, {1, 1}, 4, 0}, 0) == 0x4000); | 1298 | static_assert(CalculateLevelSize(LevelInfo{{128, 8, 1}, {0, 4, 0}, {1, 1}, 4, 0, 1}, 0) == 0x4000); |
| 1293 | 1299 | ||
| 1294 | static_assert(CalculateLevelOffset(PixelFormat::R8_SINT, {1920, 1080, 1}, {0, 2, 0}, 0, 7) == | 1300 | static_assert(CalculateLevelOffset(PixelFormat::R8_SINT, {1920, 1080, 1}, {0, 2, 0}, 0, 7) == |
| 1295 | 0x2afc00); | 1301 | 0x2afc00); |