GTX\GSH (File Format)

From MK8
Revision as of 11:37, 19 May 2017 by Aboood40091 (talk | contribs)
Jump to navigation Jump to search

The GTX/GSH file formats are used in various Wii U games, including MK8.

GSH stands for GX2 shader file, while GTX stands for GX2 texture file.

Header

Every GTX/GSH file begins with an 0x20 byte Gfx2 header.

Offset Size Description
0x00 4 "Gfx2" File identifier, ASCII string.
0x04 4 Size of header in bytes. Must be the real size (0x20), or header (and hence file) is unreadable.
0x08 4 Major version number. Must be 0x07, or header is unreadable.
0x0C 4 Minor version number. Must be 0x01.
0x10 4 GPU version for which this file is designed for.
0x14 4 Align mode.
0x18 4 Reserved, Always 0x00.
0x1C 4 Reserved, Always 0x00.
0x20 End of Gfx2 header.

Data Blocks

After the header comes some data blocks, data blocks contain a 0x20 byte BLK{ block header followed by data specified by the block type.

Block Header

Offset Size Description
0x00 4 "BLK{" Header of the block, ASCII string.
0x04 4 Size of block header in bytes.
0x08 4 Major version number. Must be 0x01 or header is unreadable.
0x0C 4 Minor version number. Must be 0x00.
0x10 4 Block type, it determines the type of the following data.
0x14 4 Size of the following data. In bytes, always 0x9C if the block type is 0x0B.
0x18 4 A unique identifier for this block, allowing it to be referenced by other blocks
0x1C 4 An incrementing index for each instance of a given type.

Block types

IIRC Block type 0x04 doesn't exist, I hope so.

Type Description
0x00 Not actually a valid Block type.
0x01 Follows this block header the end of the file.
0x02 Follows this block header padding. (Used to align following data)
0x03 Follows this block header Vertex shader header.
0x05 Follows this block header Vertex shader program.
0x06 Follows this block header Pixel shader header.
0x07 Follows this block header Pixel shader program.
0x08 Follows this block header Geometry shader header.
0x09 Follows this block header Geometry shader program.
0x0A Same as 0x09? (Duplicate?)
0x0B Follows this block header the Image header.
0x0C Follows this block header the swizzled Image data.
0x0D Follows this block header the swizzled Mipmaps data.
0x0E Follows this block header Compute shader header.
0x0F Follows this block header Compute shader program.
0x10 Treated like a 0x02 block, users can do what they want with this block.

Image info

The image info directly follows the block header that has a block type 0x0B, and should exactly have a size of 0x9C:

Offset Size Description
0x00 4 Dimension. Indicates the "shape" of a given surface or texture (see line 849 here).
0x04 4 Texture Width. Width of the texture in pixels.
0x08 4 Texture Height. Height of the texture in pixels.
0x0C 4 Depth.
0x10 4 Number of Mipmaps.
0x14 4 Texture Format. Go to line 589 on this page for explanation and format values.
0x18 4 AA Mode. Indicates the AA mode (number of samples) for the surface (see line 865 here).
0x1C 4 Usage. Indicates how the given surface may be used (see line 823 here).
0x20 4 Data Length. Length of texture data in bytes.
0x24 4 Data Pointer?
0x28 4 Mipmaps Data Length. Length of mipmaps data in bytes.
0x2C 4 Mipmaps Pointer?
0x30 4 Tile Mode. Indicates the desired tiling mode for the surface (see line 795 here).
0x34 4 Swizzle Value.
0x38 4 Alignment. Always 512 * bytes per pixel.
0x3C 4 Pitch.
0x40 0x0D Mip Offset. Offset for each mipmap?
0x4D 0x2B Unknown. Mipmaps related? (Almost always 0 in textures with no mipmaps)
0x78 4 Number of Mipmaps. Again...
0x7C 4 Unknown. Always 0.
0x80 4 Unknown. Always 1.
0x84 4 Unknown. Always 0x00010203. (Is this some kind of a pattern? 00->01->02->03)
0x88 0x14 Unknown.

Formats

TODO.

Swizzling

Reverse-engineering the swizzling was a nightmare, so documenting it will be too. The following code can swizzle/deswizzle data if you give it the right values.

Basically call swizzle() by giving it the width, height, depth, format (in hex), tileMode, swizzle value, pitch, and data.

If you're swizzling then set do_swizzle to True. If you're deswizzling then set do_swizzle to False.

https://pastebin.com/VDvs7q8Y

Tools

The following tool can extract and generate GTX files: