SHBIN: Difference between revisions

Oreo639 (talk | contribs)
Update DVLP information
Oreo639 (talk | contribs)
Update DVOJ section
 
(8 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[Category:File formats]]
[[Category:File formats]]


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 applications, 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.
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 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 contextual details (entry point, constant values, debug symbols, etc) are specified in an executable header (DVLE). There may be multiple DVLE 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".
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]]
For a description of the instruction set, see the following page : [[Shader Instruction Set]]
Line 45: Line 45:
|  0x4
|  0x4
|  0x4
|  0x4
|  Unknown, same value as in DVLE. (Possibly a version number?)
|  Unknown, same value as in DVLE. (Likely a version number)
|-
|-
|  0x8
|  0x8
Line 95: Line 95:
|  0x4
|  0x4
|  0x2
|  0x2
|  Unknown, same value as in DVLP. (Possibly a version number?)
|  Unknown, same value as in DVLP. (Likely a version number)
|-
|-
|  0x6
|  0x6
Line 103: Line 103:
|  0x7
|  0x7
|  0x1
|  0x1
|  true = merge vertex/geometry shader outmaps ('dummy' output attribute is present)
|  true = merge vertex and geometry shader outmaps (geometry shader)
|-
|-
|  0x8
|  0x8
Line 127: Line 127:
|  0x15
|  0x15
|  0x1
|  0x1
|  Starting float uniform register number for storing the fixed-size primitive vertex array (geometry shader, fixed mode)
|  Starting float constant register number for storing the fixed-size primitive vertex array (geometry shader, fixed mode)
|-
|-
|  0x16
|  0x16
Line 187: Line 187:
|-
|-
|  0x0
|  0x0
0x1
0x2
|  Label ID
|  Label ID
|-
|  0x0
|  0x2
|  Unknown (always 1?)
|-
|-
|  0x4
|  0x4
Line 196: Line 200:
|  0x8
|  0x8
|  0x4
|  0x4
?
Size of label's location (in words). 0xFFFFFFFF/(uint32_t)-1 if there is no size.
|-
|-
|  0xC
|  0xC
Line 206: Line 210:
=== Constant Table Entry ===
=== Constant Table Entry ===


Each executable's constants are stored as in constant uniform 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.
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.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 220: Line 224:
|  0x2
|  0x2
|  0x1
|  0x1
Uniform ID
Constant register ID
|}
|}


Line 237: Line 241:
|  0x2
|  0x2
|  0x1
|  0x1
Uniform bool ID
Boolean constant register ID
|-
|-
|  0x4
|  0x4
Line 256: Line 260:
|  0x2
|  0x2
|  0x1
|  0x1
Uniform integer vector ID
Integer constant register ID
|-
|-
|  0x4
|  0x4
Line 287: Line 291:
|  0x2
|  0x2
|  0x1
|  0x1
Uniform vector ID
floating-point constant register ID
|-
|-
|  0x4
|  0x4
Line 309: Line 313:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Bit
Offset
!  Size
!  Description
!  Description
|-
|-
0-3
0x0
|  0x2
|  Output type (see table below)
|  Output type (see table below)
|-
|-
16-19
0x2
|  0x2
|  Register ID
|  Register ID
|-
|-
32-35
0x4
|  0x2
|  Output attribute component mask (e.g. 5=xz)
|  Output attribute component mask (e.g. 5=xz)
|-
|  0x6
|  0x2
|  Unknown (Consistently the same number throughout the DVLE, may vary between DVLEs?)
|-
|}
|}


Line 325: Line 338:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
ID
Type
!  Description
!  Description
|-
|-
Line 357: Line 370:


=== Uniform Table Entry ===
=== Uniform Table Entry ===
Keep in mind that the usage of the term "Uniform" here is used as [https://developer.download.nvidia.com/CgTutorial/cg_tutorial_chapter03.html 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.
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 369: Line 387:
|  0x4
|  0x4
|  0x2
|  0x2
Variable start register
Register index of the start of the uniform
|-
|-
|  0x6
|  0x6
|  0x2
|  0x2
Variable end register (equal to start register for non-arrays)
Register index of the end of the uniform (equal to start register for non-arrays)
|-
|-
|}
|}
Line 415: Line 433:
|-
|-
|  0x04
|  0x04
0x4
0x2
|  Unknown. Seems to be related to the DVLE shader type.
|  Unknown. (Likely a version number)
|-
|  0x06
|  0x1
|  Shader type (0x0 = vertex shader, 0x1 = geometry shader; might contain other flags)
|-
|  0x07
|  0x1
|  true = merge vertex and geometry shader outmaps (geometry shader)
|-
|-
|  0x08
|  0x08
0x4
0x2
Unknown.
Bitmask of used input registers.
|-
|  0x10
|  0x2
|  Bitmask of used output registers.
|-
|-
|  0x0C
|  0x0C
Line 452: Line 482:
|  0x28
|  0x28
|  0x4
|  0x4
|  Offset (relative to DVLP start) to shader instruction extension table
|  Offset to operand descriptor table
|-
|-
|  0x2C
|  0x2C
|  0x4
|  0x4
|  Number of shader instruction extension table entries (each entry is 8-byte long)
|  Number of operand descriptor table entries (each entry is 8-bytes long)
|-
|-
|  0x30
|  0x30