SHBIN

Revision as of 14:54, 4 March 2014 by Plutooo (talk | contribs) (recent revelations by smea)

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.