SHBIN

SHBIN

The SHBIN (SHader BINary) format is used to contain compiled and linked shader programs. These can include vertex shaders and geometry shaders. In commercial applications, SHBIN files can be found as standalone files with the extension .shbin, or within container formats like, for example, CGFX (with the extension .bcsdr). They are typically compiled from .vsh files, .gsh files, and sometimes .asm files.

A SHBIN’s structure starts with a binary header (DVLB), then a single program header (DVLP), then one or more executable headers DVLE(s). The binary header specifies the number and location of DVLEs. The program header specifies the generic parts of the shader (i.e. the shader program data, the operand descriptor data, and a filename symbol table). The executable headers specify the contextual details (i.e. entry point, constant values, debug symbols, etc). There may be multiple executable headers, so in this sense multiple shaders sharing the same program code can be stored in a single SHBIN. Hence for the following, note the distinction between “program” and “executable”.

For a description of the instruction set, see the following page : Shader Instruction Set

OffsetSizeDescription
0x00x4Magic “DVLB”
0x40x4N = number of DVLEs in SHBIN
0x80x4*NDVLE offset table; each offset is a u32 relative to the start of the DVLB section

The DVLP section comes directly after the binary header.

DVLP #

OffsetSizeDescription
0x00x4Magic “DVLP”
0x40x4Unknown, same value as in DVLE. (Likely a version number)
0x80x4Offset (relative to DVLP start) to the compiled shader binary blob
0xC0x4Size of compiled shader binary blob, in words
0x100x4Offset (relative to DVLP start) to operand descriptor table
0x140x4Number of operand descriptor table entries (each entry is 8-bytes long)
0x180x4Unknown (Same value as offset to filename symbol table?)
0x1C0x4Unknown (Always zero?)
0x200x4Offset (relative to DVLP start) to filename symbol table
0x240x4Size of filename symbol table

DVLE #

OffsetSizeDescription
0x00x4Magic “DVLE”
0x40x2Unknown, same value as in DVLP. (Likely a version number)
0x60x1Shader type (0x0 = vertex shader, 0x1 = geometry shader; might contain other flags)
0x70x1true = merge vertex and geometry shader outmaps (geometry shader)
0x80x4Executable’s main offset in binary blob (in words)
0xC0x4Executable’s program’s endmain offset in binary blob (in words)
0x100x2Bitmask of used input registers
0x120x2Bitmask of used output registers
0x140x1Geometry shader type (point = 0x0, variable/subdivide = 0x1, fixed/particle = 0x2)
0x150x1Starting float constant register number for storing the fixed-size primitive vertex array (geometry shader, fixed mode)
0x160x1Number of fully-defined vertices in the variable-size primitive vertex array (geometry shader, variable mode)
0x170x1Number of vertices in the fixed-size primitive vertex array (geometry shader, fixed mode)
0x180x4Offset (relative to DVLE start) to constant table
0x1C0x4Number of entries in constant table (each entry is 0x14-byte long)
0x200x4Offset (relative to DVLE start) to label table
0x240x4Number of entries in label table (each entry is 0x10-byte long)
0x280x4Offset (relative to DVLE start) to output register table
0x2C0x4Number of entries in output register table (each entry is 0x8-byte long)
0x300x4Offset (relative to DVLE start) to uniform table
0x340x4Number of entries in uniform table (each entry is 0x8-byte long)
0x380x4Offset (relative to DVLE start) to symbol table
0x3C0x4Size of symbol table (in bytes)

Label Table Entry #

OffsetSizeDescription
0x00x2Label ID
0x00x2Unknown (always 1?)
0x40x4Offset (relative to shader program blob start) to label’s location, in words
0x80x4Size of label’s location (in words). 0xFFFFFFFF/(uint32_t)-1 if there is no size.
0xC0x4Offset (relative to DVLE symbol table start) to label’s symbol

Constant Table Entry #

Each executable’s constants are stored in a constant table. This information is used by ctrulib’s SHDR framework to automatically send those values to the GPU when changing to a given program. An entry is constituted by a header and the constant data, the latter of which uses a format specific to the constant type.

OffsetSizeDescription
0x00x1Constant type (0=bool, 1=ivec4, 2=vec4)
0x20x1Constant register ID

Corresponding constant entry formats:

OffsetSizeDescription
0x00x10x0
0x20x1Boolean constant register ID
0x40x1Value (boolean)
OffsetSizeDescription
0x00x10x1
0x20x1Integer constant register ID
0x40x1x (u8)
0x50x1y (u8)
0x60x1z (u8)
0x70x1w (u8)
OffsetSizeDescription
0x00x10x2
0x20x1floating-point constant register ID
0x40x4x (float24)
0x80x4y (float24)
0xC0x4z (float24)
0x100x4w (float24)

Output Table Entry #

OffsetSizeDescription
0x00x2Output type (see table below)
0x20x2Register ID
0x40x2Output attribute component mask (e.g. 5=xz)
0x60x2Unknown (Consistently the same number throughout the DVLE, may vary between DVLEs?)

Output types :

TypeDescription
0x0result.position
0x1result.normalquat
0x2result.color
0x3result.texcoord0
0x4result.texcoord0w
0x5result.texcoord1
0x6result.texcoord2
0x7?
0x8result.view

Uniform Table Entry #

Keep in mind that the usage of the term “Uniform” here is used as 🔗 defined by Nvidia (variable who obtains its initial value from an external environment) and not as defined by RenderMan/GLSL (variables whose values are constant over a shaded surface).

The uniform table contains a list of all registers whose initial values are derived by an external source along with their layout and associated symbol.

OffsetSizeDescription
0x00x4Offset (relative to DVLE symbol table start) to variable’s symbol
0x40x2Register index of the start of the uniform
0x60x2Register index of the end of the uniform (equal to start register for non-arrays)

The register indices refer to a unified register space for non-output registers. The mapping of register index values to registers is the following:

ValuesRegisters
0x00-0x0Fv0-v15
0x10-0x6Fc0-c95
0x70-0x73i0-i3
0x78-0x87b0-b15

DVOJ #

There is another file format for shaders, which starts with the string “DVOJ”. This format seems to be used for unlinked shader objects. It seems likely that one or multiple DVOJs can be linked to a DVLB file, similarly to the C compilation model.

Structurally, a DVOJ header captures all information there is about a single shader instance. It uses the same fields like the DVLB, DVLP, and DVLE structures, but also stores two unknown blocks of data. It seems that the entry point of a DVOJ is always the first shader instruction.

All offsets in the following table are given relative to the DVOJ start.

OffsetSizeDescription
0x000x4Magic “DVOJ”
0x040x2Unknown. (Likely a version number)
0x060x1Shader type (0x0 = vertex shader, 0x1 = geometry shader; might contain other flags)
0x070x1true = merge vertex and geometry shader outmaps (geometry shader)
0x080x2Bitmask of used input registers.
0x100x2Bitmask of used output registers.
0x0C0x4Padding? (usually 0xFFFFFFFF)
0x100x4Offset to constant table
0x140x4Number of entries in constant table (each entry is 0x14-byte long)
0x180x4Offset to label table
0x1C0x4Number of entries in label table (each entry is 0x10-byte long)
0x200x4Offset to the compiled shader binary blob
0x240x4Size of compiled shader binary blob, in words
0x280x4Offset to operand descriptor table
0x2C0x4Number of operand descriptor table entries (each entry is 8-bytes long)
0x300x4Offset to unknown block 1
0x340x4Number of items in unknown block 1 (each item is 8-byte long). This seems to be equal to the total number of instructions.
0x380x4Offset to unknown block 2
0x3C0x4Number of items in unknown block 2 (each item is 12-byte long). This seems to be equal to the number of instructions taking arguments (i.e. excluding NOP, END, …)
0x400x4Offset to output register table
0x440x4Number of entries in output register table (each entry is 0x8-byte long)
0x480x4Offset to uniform table
0x4C0x4Number of entries in uniform table (each entry is 0x8-byte long)
0x500x4Offset to symbol table
0x540x4Size of symbol table (in bytes)

Unknown Block 1 Item #

A wild guess is that this denotes shader source line information. Take the information with a grain of salt, though, since it hasn’t been backed by any empirical data so far.

The index N of the item within Unknown Block 1 corresponds to the Nth instruction in the shader binary.

OffsetSizeDescription
0x00x4Byte offset within symbol table pointing to a source shader filename.
0x40x4Line number of the corresponding shader instruction within the shader source code.

Unknown Block 2 Item #

OffsetSizeDescription
0x00x4This seems to be an index of a shader instruction. All non-nullary instructions seem to be referenced exactly once.
0x40x4
0x80x4

Category:File formats