Difference between revisions of "SHBIN"
(recent revelations by smea) |
|||
Line 80: | Line 80: | ||
|DT3 | |DT3 | ||
|Dot product vec3*vec3 | |Dot product vec3*vec3 | ||
− | |0000 01DD DDDD | + | |0000 01DD DDDD DAAA AAAA BBBB BBBX XXXX |
|- | |- | ||
|DT4 | |DT4 | ||
|Dot product vec4*vec4 | |Dot product vec4*vec4 | ||
− | |0000 10DD DDDD | + | |0000 10DD DDDD DAAA AAAA BBBB BBBX XXXX |
|- | |- | ||
|MOV | |MOV | ||
|Move register | |Move register | ||
− | |0010 01DD DDDD | + | |0010 01DD DDDD DAAA AAAA 0000 0??X XXXX |
|- | |- | ||
|CMP | |CMP | ||
|Set condition codes | |Set condition codes | ||
− | |1011 1?DD DDDD | + | |1011 1?DD DDDD DAAA AAAA CC?? ???X XXXX |
|- | |- | ||
|CALL/JMP | |CALL/JMP |
Revision as of 14:54, 4 March 2014
Overview
The SHBIN (SHader BINary) file is used to contain compiled and linked shader programs. These can include vertex shaders (typically compiled from .vsh files) and geometry shaders (typically compiled from .gsh files, though .asm have been observed). In commercial games/apps, SHBIN files can be found as standalone files with the extension .shbin, or contained within .bcsdr files. BCSDR files use CGFX as a container, but the underlying DVLB/DVLP/DVLE structure remains unchanged.
A SHBIN's structure starts with a header, then a DVLP, then DVLE(s).
DVLB Header
Offset | Size | Description |
---|---|---|
0x0 | 0x4 | Magic "DVLB" |
0x4 | 0x4 | N = number of DVLEs in SHBIN |
0x8 | 0x4*N | DVLE offset table; each offset is a u32 relative to the start of the DVLB section |
The DVLP file comes directly after the header.
DVLP
Offset | Size | Description |
---|---|---|
0x0 | 0x4 | Magic "DVLP" |
0x4 | 0x4 | ? (Maybe a version number?) |
0x8 | 0x4 | Offset (relative to DVLP start) to the compiled shader binary blob |
0xC | 0x4 | Size of compiled shader binary blob, in words |
0x10 | 0x4 | Offset (relative to DVLP start) to shader instruction extension table |
0x14 | 0x4 | Number of shader instruction extension table entries (each entry is 8-byte long) |
0x18 | 0x4 | Offset (relative to DVLP start) to filename symbol table |
Instructions
Encoding
Name | Description | Encoding |
---|---|---|
DT3 | Dot product vec3*vec3 | 0000 01DD DDDD DAAA AAAA BBBB BBBX XXXX |
DT4 | Dot product vec4*vec4 | 0000 10DD DDDD DAAA AAAA BBBB BBBX XXXX |
MOV | Move register | 0010 01DD DDDD DAAA AAAA 0000 0??X XXXX |
CMP | Set condition codes | 1011 1?DD DDDD DAAA AAAA CC?? ???X XXXX |
CALL/JMP | Jump | 1001 J??? ??SS SSSS SSSS SSLL LLLL LLLL |
IF/ELSE | Enter if-block based on condition codes | 1010 00?E ??SS SSSS SSSS SSLL LLLL LLLL |
END | Ends a block (?) | 1000 0100 0000 0000 0000 0000 0000 0000 |
Fields
Name | Description |
---|---|
D | dest register |
A | opA register |
B | opB register |
C | Component selector for D |
X | extension id |
S | absolute offset for code (in words) |
L | number of instructions to execute |
J | JMP or CALL instruction |
E | IF or ELSE instruction |
DVLE
Offset | Size | Description |
---|---|---|
0x0 | 0x4 | Magic "DVLE" |
0x6 | 0x1 | Shader type (0x0 = vertex shader, 0x1 = geometry shader; might contain other flags) |
0x8 | 0x4 | Program's main offset in binary blob (in words) |
0xC | 0x4 | Program's endmain offset in binary blob (in words) |
0x18 | 0x4 | Offset (relative to DVLE start) to uniform table |
0x1C | 0x4 | Number of entries in uniform table (each entry is 0x14-byte long) |
0x20 | 0x4 | Offset (relative to DVLE start) to label table |
0x24 | 0x4 | Number of entries in label table (each entry is 0x10-byte long) |
0x28 | 0x4 | Offset (relative to DVLE start) to output register table |
0x2C | 0x4 | Number of entries in output register table (each entry is 0x8-byte long) |
0x30 | 0x4 | Offset (relative to DVLE start) to variable (?) table |
0x34 | 0x4 | Number of entries in variable table (each entry is 0x8-byte long) |
0x38 | 0x4 | Offset (relative to DVLE start) to symbol table |
0x3C | 0x4 | Size of symbol table (in bytes) |
Label table entry :
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | Label ID |
0x4 | 0x4 | Offset (relative to shader program blob start) to label's location, in words |
0x8 | 0x4 | ? |
0xC | 0x4 | Offset (relative to DVLE symbol table start) to label's symbol |
Uniform table entry :
Offset | Size | Description |
---|---|---|
0x2 | 0x1 | Uniform ID |
0x4 | 0x4 | x (float24) |
0x8 | 0x4 | y (float24) |
0xC | 0x4 | z (float24) |
0x10 | 0x4 | w (float24) |
Output register table entry :
Offset | Size | Description |
---|---|---|
0x0 | 0x4 | Descriptor ? |
0x4 | 0x2 | Output type (see table below) |
0x6 | 0x2 | (Register ID) >> 1 |
Output types (vertex shader) :
ID | Description |
---|---|
0x0 | result.position |
0x1 | ? |
0x2 | result.color |
0x3 | result.texcoord0 |
0x4 | ? |
0x5 | result.texcoord1 |
0x6 | result.texcoord2 |
0x7 | ? |
0x8 | ? |
Variable table entry :
Offset | Size | Description |
---|---|---|
0x0 | 0x4 | Offset (relative to DVLE symbol table start) to variable's symbol |
0x4 | 0x2 | Variable start register |
0x6 | 0x2 | Variable end register |
Each DVLE is associated to an individual shader shader program contained in the binary blob. A single shader binary blob may contain multiple shader programs of the same kind.
Each program's constants are stored as vec4 in a uniform table. These are sent over to the GPU when changing to a give program.