diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/texture_cache/util.cpp | 86 |
1 files changed, 33 insertions, 53 deletions
diff --git a/src/video_core/texture_cache/util.cpp b/src/video_core/texture_cache/util.cpp index c872517b8..59cf2f561 100644 --- a/src/video_core/texture_cache/util.cpp +++ b/src/video_core/texture_cache/util.cpp | |||
| @@ -169,23 +169,6 @@ template <u32 GOB_EXTENT> | |||
| 169 | return Common::DivCeil(AdjustMipSize(size, level), block_size); | 169 | return Common::DivCeil(AdjustMipSize(size, level), block_size); |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | [[nodiscard]] constexpr std::pair<int, int> Samples(int num_samples) { | ||
| 173 | switch (num_samples) { | ||
| 174 | case 1: | ||
| 175 | return {1, 1}; | ||
| 176 | case 2: | ||
| 177 | return {2, 1}; | ||
| 178 | case 4: | ||
| 179 | return {2, 2}; | ||
| 180 | case 8: | ||
| 181 | return {4, 2}; | ||
| 182 | case 16: | ||
| 183 | return {4, 4}; | ||
| 184 | } | ||
| 185 | UNREACHABLE_MSG("Invalid number of samples={}", num_samples); | ||
| 186 | return {1, 1}; | ||
| 187 | } | ||
| 188 | |||
| 189 | [[nodiscard]] constexpr Extent2D DefaultBlockSize(PixelFormat format) { | 172 | [[nodiscard]] constexpr Extent2D DefaultBlockSize(PixelFormat format) { |
| 190 | return {DefaultBlockWidth(format), DefaultBlockHeight(format)}; | 173 | return {DefaultBlockWidth(format), DefaultBlockHeight(format)}; |
| 191 | } | 174 | } |
| @@ -283,14 +266,13 @@ template <u32 GOB_EXTENT> | |||
| 283 | } | 266 | } |
| 284 | 267 | ||
| 285 | [[nodiscard]] constexpr LevelInfo MakeLevelInfo(PixelFormat format, Extent3D size, Extent3D block, | 268 | [[nodiscard]] constexpr LevelInfo MakeLevelInfo(PixelFormat format, Extent3D size, Extent3D block, |
| 286 | u32 num_samples, u32 tile_width_spacing) { | 269 | u32 tile_width_spacing) { |
| 287 | const auto [samples_x, samples_y] = Samples(num_samples); | ||
| 288 | const u32 bytes_per_block = BytesPerBlock(format); | 270 | const u32 bytes_per_block = BytesPerBlock(format); |
| 289 | return { | 271 | return { |
| 290 | .size = | 272 | .size = |
| 291 | { | 273 | { |
| 292 | .width = size.width * samples_x, | 274 | .width = size.width, |
| 293 | .height = size.height * samples_y, | 275 | .height = size.height, |
| 294 | .depth = size.depth, | 276 | .depth = size.depth, |
| 295 | }, | 277 | }, |
| 296 | .block = block, | 278 | .block = block, |
| @@ -301,14 +283,12 @@ template <u32 GOB_EXTENT> | |||
| 301 | } | 283 | } |
| 302 | 284 | ||
| 303 | [[nodiscard]] constexpr LevelInfo MakeLevelInfo(const ImageInfo& info) { | 285 | [[nodiscard]] constexpr LevelInfo MakeLevelInfo(const ImageInfo& info) { |
| 304 | return MakeLevelInfo(info.format, info.size, info.block, info.num_samples, | 286 | return MakeLevelInfo(info.format, info.size, info.block, info.tile_width_spacing); |
| 305 | info.tile_width_spacing); | ||
| 306 | } | 287 | } |
| 307 | 288 | ||
| 308 | [[nodiscard]] constexpr u32 CalculateLevelOffset(PixelFormat format, Extent3D size, Extent3D block, | 289 | [[nodiscard]] constexpr u32 CalculateLevelOffset(PixelFormat format, Extent3D size, Extent3D block, |
| 309 | u32 num_samples, u32 tile_width_spacing, | 290 | u32 tile_width_spacing, u32 level) { |
| 310 | u32 level) { | 291 | const LevelInfo info = MakeLevelInfo(format, size, block, tile_width_spacing); |
| 311 | const LevelInfo info = MakeLevelInfo(format, size, block, num_samples, tile_width_spacing); | ||
| 312 | u32 offset = 0; | 292 | u32 offset = 0; |
| 313 | for (u32 current_level = 0; current_level < level; ++current_level) { | 293 | for (u32 current_level = 0; current_level < level; ++current_level) { |
| 314 | offset += CalculateLevelSize(info, current_level); | 294 | offset += CalculateLevelSize(info, current_level); |
| @@ -645,8 +625,8 @@ u32 CalculateLayerStride(const ImageInfo& info) noexcept { | |||
| 645 | 625 | ||
| 646 | u32 CalculateLayerSize(const ImageInfo& info) noexcept { | 626 | u32 CalculateLayerSize(const ImageInfo& info) noexcept { |
| 647 | ASSERT(info.type != ImageType::Linear); | 627 | ASSERT(info.type != ImageType::Linear); |
| 648 | return CalculateLevelOffset(info.format, info.size, info.block, info.num_samples, | 628 | return CalculateLevelOffset(info.format, info.size, info.block, info.tile_width_spacing, |
| 649 | info.tile_width_spacing, info.resources.levels); | 629 | info.resources.levels); |
| 650 | } | 630 | } |
| 651 | 631 | ||
| 652 | LevelArray CalculateMipLevelOffsets(const ImageInfo& info) noexcept { | 632 | LevelArray CalculateMipLevelOffsets(const ImageInfo& info) noexcept { |
| @@ -1195,37 +1175,37 @@ static_assert(CalculateLevelSize(LevelInfo{{1920, 1080, 1}, {0, 2, 0}, {1, 1}, 2 | |||
| 1195 | 0x7f8000); | 1175 | 0x7f8000); |
| 1196 | static_assert(CalculateLevelSize(LevelInfo{{32, 32, 1}, {0, 0, 4}, {1, 1}, 4, 0}, 0) == 0x4000); | 1176 | static_assert(CalculateLevelSize(LevelInfo{{32, 32, 1}, {0, 0, 4}, {1, 1}, 4, 0}, 0) == 0x4000); |
| 1197 | 1177 | ||
| 1198 | static_assert(CalculateLevelOffset(PixelFormat::R8_SINT, {1920, 1080, 1}, {0, 2, 0}, 1, 0, 7) == | 1178 | static_assert(CalculateLevelOffset(PixelFormat::R8_SINT, {1920, 1080, 1}, {0, 2, 0}, 0, 7) == |
| 1199 | 0x2afc00); | 1179 | 0x2afc00); |
| 1200 | static_assert(CalculateLevelOffset(PixelFormat::ASTC_2D_12X12_UNORM, {8192, 4096, 1}, {0, 2, 0}, 1, | 1180 | static_assert(CalculateLevelOffset(PixelFormat::ASTC_2D_12X12_UNORM, {8192, 4096, 1}, {0, 2, 0}, 0, |
| 1201 | 0, 12) == 0x50d200); | 1181 | 12) == 0x50d200); |
| 1202 | 1182 | ||
| 1203 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1183 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 0) == |
| 1204 | 0) == 0); | 1184 | 0); |
| 1205 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1185 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 1) == |
| 1206 | 1) == 0x400000); | 1186 | 0x400000); |
| 1207 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1187 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 2) == |
| 1208 | 2) == 0x500000); | 1188 | 0x500000); |
| 1209 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1189 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 3) == |
| 1210 | 3) == 0x540000); | 1190 | 0x540000); |
| 1211 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1191 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 4) == |
| 1212 | 4) == 0x550000); | 1192 | 0x550000); |
| 1213 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1193 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 5) == |
| 1214 | 5) == 0x554000); | 1194 | 0x554000); |
| 1215 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1195 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 6) == |
| 1216 | 6) == 0x555000); | 1196 | 0x555000); |
| 1217 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1197 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 7) == |
| 1218 | 7) == 0x555400); | 1198 | 0x555400); |
| 1219 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1199 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 8) == |
| 1220 | 8) == 0x555600); | 1200 | 0x555600); |
| 1221 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1201 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 9) == |
| 1222 | 9) == 0x555800); | 1202 | 0x555800); |
| 1223 | 1203 | ||
| 1224 | constexpr u32 ValidateLayerSize(PixelFormat format, u32 width, u32 height, u32 block_height, | 1204 | constexpr u32 ValidateLayerSize(PixelFormat format, u32 width, u32 height, u32 block_height, |
| 1225 | u32 tile_width_spacing, u32 level) { | 1205 | u32 tile_width_spacing, u32 level) { |
| 1226 | const Extent3D size{width, height, 1}; | 1206 | const Extent3D size{width, height, 1}; |
| 1227 | const Extent3D block{0, block_height, 0}; | 1207 | const Extent3D block{0, block_height, 0}; |
| 1228 | const u32 offset = CalculateLevelOffset(format, size, block, 1, tile_width_spacing, level); | 1208 | const u32 offset = CalculateLevelOffset(format, size, block, tile_width_spacing, level); |
| 1229 | return AlignLayerSize(offset, size, block, DefaultBlockHeight(format), tile_width_spacing); | 1209 | return AlignLayerSize(offset, size, block, DefaultBlockHeight(format), tile_width_spacing); |
| 1230 | } | 1210 | } |
| 1231 | 1211 | ||