Under Construction
This article is not finished. Help improve it by adding accurate information or correcting grammar and spelling.
BFSHA (Binary caFe SHader Archive) is a shader file format used on the Nintendo Switch. It is an archive of shaders, and can store multiple shaders, plus its shader variations, allowing usage of generic uber shaders. It is used for rendering BFRES files, and therefore usually stored as an external into an BFRES.
File Format
Offset |
Type |
Description
|
0x00 |
Char[8] |
File magic. Always FSHA in ASCII, or 46 53 48 41 20 20 20 20.
|
0x08 |
UInt32 |
Version Number.
|
0x0C |
UInt16 |
Byte-order-mark. FE FF for big endian, FF FE for little endian.
|
0x0E |
Byte |
Alignment shift. 2 raised by this value is the alignment required by this file when loaded into memory.
|
0x0F |
Byte |
Target address size. Size of a pointer in bits. Never set and there remains 0.
|
0x10 |
UInt32 |
File name offset. Points directly to the string, and not to the length unlike all other strings.
|
0x14 |
UInt16 |
A flag which is only used on runtime. One bit sets wether the file is relocated.
|
0x16 |
UInt16 |
Offset to the first section.
|
0x18 |
UInt32 |
Relocation table offset.
|
0x1C |
UInt32 |
Size of the file in bytes.
|
0x20 |
Int64 |
Shader archive offset.
|
0x28 |
Int64 |
String table offset.
|
0x30 |
UInt32 |
Size of string table in bytes.
|
0x34 |
Byte[4] |
Padding.
|
String Table
The string table is a table where all strings are stored. Each string has first the length written, which is a 16-bit integer, and then the string is stored as a null-terminated string. The string length does not include the null byte, and the 16-bit string length value is always aligned by 2. The string sorting algorithm is unknown.
Offset |
Type |
Description
|
0x00 |
Char[4] |
Section magic. Always _STR in ASCII.
|
0x04 |
UInt32 |
Next section offset.
|
0x08 |
UInt32 |
Size of this section in bytes.
|
0x0C |
Byte[4] |
Reserved.
|
0x10 |
Int32 |
Number of strings stored in the string table. The first string is always an empty string ("") and is not included in this count.
|
Dictionary
A dictionary (sometimes known as DICT) is a common structure used in many Nintendo formats such as BFRES and BNTX. It is used for fast name look-up, in order to find a specific array item by its name. It starts with the following structure:
Offset |
Type |
Description
|
0x00 |
Char[4] |
Section magic. Always _DIC in ASCII. Note that in BFRES this magic is set to 00 00 00 00, most likely due to an export error.
|
0x04 |
Int32 |
Number of entries. This does not include the root entry.
|
After, the entries are specified. The root entry follows first, then all other entries are stored. Each entry has the following structure:
Offset |
Type |
Description
|
0x00 |
Int32 |
Ref bit.
|
0x04 |
UInt16[2] |
Child node indices. First the left node, then the right node.
|
0x08 |
Int64 |
Key offset, which points to the key name this entry stores.
|
Relocation Table
Offset |
Type |
Description
|
0x00 |
Char[4] |
Section magic. Always _RLT in ASCII.
|
0x04 |
UInt32 |
Table offset. The offset where this table starts.
|
0x08 |
Int32 |
Number of sections.
|
0x0C |
Byte[4] |
Padding.
|
Offset |
Type |
Description
|
0x00 |
Int64 |
Section pointer, set on runtime.
|
0x08 |
UInt32 |
Section offset.
|
0x0C |
UInt32 |
Section size.
|
0x10 |
UInt32 |
Entry ID.
|
0x14 |
UInt32 |
Number of entries.
|
Offset |
Type |
Description
|
0x00 |
UInt32 |
Entry offset.
|
0x04 |
UInt16 |
Array count.
|
0x06 |
Byte |
Offset count.
|
0x07 |
Byte |
Padding size.
|
Shader Archive
Offset |
Type |
Description
|
0x00 |
Int64 |
Shader archive name offset.
|
0x08 |
Int64 |
Original path offset.
|
0x10 |
Int64 |
Shading model array offset.
|
0x18 |
Int64 |
Shading model dictionary offset.
|
0x20 |
Int64 |
User pointer, set on runtime.
|
0x28 |
Int64 |
Callback pointer, set on runtime.
|
0x30 |
Int64 |
Work memory pointer, set on runtime.
|
0x38 |
UInt16 |
Number of shading models.
|
0x3A |
UInt16 |
Flag. xxxx xxxx ABCD ExFG.
- A: Shader archive initialized.
- B: Intermediate shader source is available.
- C: Shader offline DL.
- D: Force variation. The option is forced to be changed.
- E: Binary shader source is available.
- F: Binary shader source.
- G: Has shader source.
|
0x3C |
Byte[4] |
Paddding.
|
Shading Model
Shader Option
Offset |
Type |
Description
|
0x00 |
Int64 |
Name offset. Points to the name of this shader option.
|
0x08 |
Int64 |
Choice dictionary offset.
|
0x10 |
Int64 |
Choice value array offset. Points to an array of UInt32s.
|
0x18 |
Byte |
Number of choices.
|
0x19 |
Byte |
Default index.
|
0x1A |
UInt16 |
Branch offset. Offset into the uniform block variable.
|
0x1C |
Byte |
Flag. xxxx xxAB.
|
0x1D |
Byte |
Key offset. 0 for static option, static key length for dynamic option.
|
0x1E |
Byte |
Index.
|
0x1F |
Byte |
Shift.
|
0x20 |
Int32 |
Mask.
|
0x24 |
Byte[4] |
Padding.
|
Attribute Variable
Offset |
Type |
Description
|
0x00 |
Byte |
Shading model index.
|
0x01 |
Byte |
Shader location.
|
Sampler Variable
Offset |
Type |
Description
|
0x00 |
Int64 |
Alt name offset.
|
0x08 |
Byte |
Index. Index into the shader.
|
0x09 |
Byte[7] |
Padding.
|
Uniform Block Variable
Offset |
Type |
Description
|
0x00 |
Int64 |
Uniform variable array offset.
|
0x08 |
Int64 |
Uniform variable dictionary offset.
|
0x10 |
Int64 |
Default value offset. Only exists for type material.
|
0x18 |
Byte |
Shading model index.
|
0x19 |
Byte |
Type.
ID |
Name
|
0x00 |
None
|
0x01 |
Material
|
0x02 |
Shape
|
0x03 |
Skeleton
|
0x04 |
Shader option
|
|
0x1A |
UInt16 |
Size of this uniform block in bytes.
|
0x1C |
UInt16 |
Number of uniform variables.
|
0x1E |
Byte[2] |
Padding.
|
Uniform Variable
Offset |
Type |
Description
|
0x00 |
Int64 |
Conversion function name offest.
|
0x08 |
Int32 |
Index into the shader.
|
0x0C |
UInt16 |
Data offset, relative to the start of the owning uniform block variable.
|
0x0E |
Byte |
Owning uniform block variable index.
|
0x0F |
Byte |
Padding.
|
Shader Program
Offset |
Type |
Description
|
0x00 |
Int64 |
Sampler table offset. Points to an array of Int32s.
|
0x08 |
Int64 |
Uniform block table. Points to an array of Int32s.
|
0x10 |
Int64 |
Shader variation offset.
|
0x18 |
Int64 |
Owning shading model offset.
|
0x20 |
UInt32 |
Attribute active flag.
|
0x24 |
UInt16 |
Flag. xxxx xxxx xxx'A BCDE.
- A: Intermediate language.
- B: Source.
- C: Binary.
- D: Initialized.
- E: Update required.
|
0x26 |
UInt16 |
Number of samplers.
|
0x28 |
UInt16 |
Number of uniform blocks.
|
0x2A |
Byte[6] |
Padding.
|
Shader Variation
Shader Info
Offset |
Type |
Description
|
0x00 |
Int64 |
Sampler table offset.
|
0x08 |
Int64 |
Uniform block table offset.
|
0x10 |
Int64 |
Streamout offset.
|
0x18 |
UInt32 |
Number of streamouts.
|
0x1C |
Byte[4] |
Padding.
|
Version List
Version |
Found in
|
3.0.1
|
|
5.0.0
|
- Nintendo Switch System BIOS (2.1.0 – 2.3.0)
|
7.0.0
|
|
7.0.2
|
- Nintendo Switch System BIOS (6.0.0 – 6.2.0)
|
7.0.3
|
|
8.0.0
|
|
9.0.0
|
|
Tools
The following tools can handle BFSHA files: