diff options
author | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-02-13 22:49:24 +0100 |
---|---|---|
committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-03-13 18:16:03 +0100 |
commit | 20eb368e147e1c27f05d6923c51596f8dfe24e89 (patch) | |
tree | a8b1c8eb79eb55e189a10dfd43b8b6bb1449220f /src/video_core/textures/decoders.h | |
parent | host_shaders: Modify shader cmake integration to allow for larger shaders (diff) | |
download | yuzu-20eb368e147e1c27f05d6923c51596f8dfe24e89.tar yuzu-20eb368e147e1c27f05d6923c51596f8dfe24e89.tar.gz yuzu-20eb368e147e1c27f05d6923c51596f8dfe24e89.tar.bz2 yuzu-20eb368e147e1c27f05d6923c51596f8dfe24e89.tar.lz yuzu-20eb368e147e1c27f05d6923c51596f8dfe24e89.tar.xz yuzu-20eb368e147e1c27f05d6923c51596f8dfe24e89.tar.zst yuzu-20eb368e147e1c27f05d6923c51596f8dfe24e89.zip |
Diffstat (limited to 'src/video_core/textures/decoders.h')
-rw-r--r-- | src/video_core/textures/decoders.h | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/video_core/textures/decoders.h b/src/video_core/textures/decoders.h index d7cdc81e8..4c14cefbf 100644 --- a/src/video_core/textures/decoders.h +++ b/src/video_core/textures/decoders.h @@ -23,8 +23,22 @@ constexpr u32 GOB_SIZE_SHIFT = GOB_SIZE_X_SHIFT + GOB_SIZE_Y_SHIFT + GOB_SIZE_Z_ using SwizzleTable = std::array<std::array<u32, GOB_SIZE_X>, GOB_SIZE_Y>; -/// Returns a z-order swizzle table -SwizzleTable MakeSwizzleTable(); +/** + * This table represents the internal swizzle of a gob, in format 16 bytes x 2 sector packing. + * Calculates the offset of an (x, y) position within a swizzled texture. + * Taken from the Tegra X1 Technical Reference Manual. pages 1187-1188 + */ +constexpr SwizzleTable MakeSwizzleTable() { + SwizzleTable table{}; + for (u32 y = 0; y < table.size(); ++y) { + for (u32 x = 0; x < table[0].size(); ++x) { + table[y][x] = ((x % 64) / 32) * 256 + ((y % 8) / 2) * 64 + ((x % 32) / 16) * 32 + + (y % 2) * 16 + (x % 16); + } + } + return table; +} +constexpr SwizzleTable SWIZZLE_TABLE = MakeSwizzleTable(); /// Unswizzles a block linear texture into linear memory. void UnswizzleTexture(std::span<u8> output, std::span<const u8> input, u32 bytes_per_pixel, |