Difference between revisions of "GTX\GSH (File Format)"
Aboood40091 (talk | contribs) m |
|||
Line 1: | Line 1: | ||
− | + | '''GTX''' and '''GSH''' files are used in various [[Wii U]] games, including [[Mario Kart 8]]. GSH stands for '''G'''X2 '''SH'''ader and GTX stands for '''G'''X2 '''T'''e'''X'''ture'''. | |
− | |||
− | ''' | ||
== Header == | == Header == | ||
+ | Every GTX/GSH file begins with an 0x20 byte '''Gfx2''' header. | ||
− | |||
{| class="wikitable" | {| class="wikitable" | ||
! Offset | ! Offset | ||
Line 48: | Line 46: | ||
== Data Blocks == | == 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. | After the header comes some data blocks, data blocks contain a 0x20 byte '''BLK{''' block header followed by data specified by the block type. | ||
Line 92: | Line 89: | ||
=== Block types === | === Block types === | ||
− | |||
− | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 133: | Line 128: | ||
|- | |- | ||
| 0x0C | | 0x0C | ||
− | | Follows this block header the swizzled | + | | Follows this block header the swizzled image data. |
|- | |- | ||
| 0x0D | | 0x0D | ||
− | | Follows this block header the swizzled | + | | Follows this block header the swizzled mipmaps data. |
|- | |- | ||
| 0x0E | | 0x0E | ||
Line 149: | Line 144: | ||
=== Image info === | === Image info === | ||
+ | The image info directly follows the block header that has a block type 0x0B, and should exactly have a size of 0x9C: | ||
− | |||
{| class="wikitable" | {| class="wikitable" | ||
! Offset | ! Offset | ||
Line 248: | Line 243: | ||
| Unknown. | | Unknown. | ||
|} | |} | ||
− | |||
− | |||
− | |||
− | |||
== Swizzling == | == Swizzling == | ||
− | + | [https://pastebin.com/VDvs7q8Y This] code can swizzle image and mipmap data. Call ''swizzle()'' by giving it the width, height, format (in hex), tileMode, swizzle value, pitch and the swizzled data. If you're swizzling then set do_swizzle to ''True''. If you're deswizzling then set do_swizzle to ''False''. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | If you're swizzling then set do_swizzle to True. | ||
− | If you're deswizzling then set do_swizzle to False. | ||
− | |||
− | |||
= Tools = | = Tools = | ||
− | + | The following tools can handle GTX/GSH files: | |
− | The following | ||
− | |||
* [https://github.com/aboood40091/GTX-Extractor GTX Extractor], by [[User:Aboood40091|AboodXD]] | * [https://github.com/aboood40091/GTX-Extractor GTX Extractor], by [[User:Aboood40091|AboodXD]] | ||
[[Category:File Format]] | [[Category:File Format]] |
Revision as of 16:25, 20 May 2017
GTX and GSH files are used in various Wii U games, including Mario Kart 8. GSH stands for GX2 SHader and GTX stands for GX2 TeXture.
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
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. |
Swizzling
This code can swizzle image and mipmap data. Call swizzle() by giving it the width, height, format (in hex), tileMode, swizzle value, pitch and the swizzled data. If you're swizzling then set do_swizzle to True. If you're deswizzling then set do_swizzle to False.
Tools
The following tools can handle GTX/GSH files:
- GTX Extractor, by AboodXD