ISBE Layout¶
The ISBE is a piece of staging memory shared between the PE and SM containing the attributes for VTG stages.
In normal cases, no shader needs to access it and instead use ALD or AST
but in some some cases (like ALD vtx handling or mesh shaders) direct access to
it is necessary.
This document the observations made about the layout of it.
The ISBE “space” is separated in multiple regions (map, patch, primitive and attribute)
and can be accessed with ISBERD and ISBEWR instructions.
There is always two ISBE “space” present: one for inputs and one for outputs. Input and output ISBE memory can be shared by setting bit 25 of the SPH.
NOTE: Before Turing, only ISBERD was supported with the .MAP flag.
Map region¶
The Map region contains all the vertex indices for all primitives.
When used as output, it starts with the primitives count.
Byte Range |
Name |
Note |
|---|---|---|
0x0 |
primitive_count |
32-bit, Only present as output ISBE |
0x0?..(0x0? + primitive_count * $vtx_per_prim_count) |
primitive_indices[i] |
8-bit, Offset is 0x04 as output ISBE otherwise 0x00 |
Attribute region¶
The Attribute region contains all attributes and is allocated based on the SPH input/output mask and mesh shader methods.
With the SKEW flag applied on ISBERD and ISBEWR, each type of attribute is packed with
32 values of the same type forming “memory lines” of 128 bytes each.
Additionally, the order of the attribute packs is determined by the unique attribute id. (see nak_attr or SPH headers definitions for the values)
Finally, if more than 32 values are needed, the layout repeat itself.
Here is an example for 256 vertices being defined with ATTR_POINT_SIZE (0x6C) and
ATTR_POSITION_X (0x70) active:
Byte Range |
Name |
|---|---|
0x000..0x080 |
ATTR_POINT_SIZE[0..31] |
0x000..0x100 |
ATTR_POSITION_X[0..31] |
0x180..0x200 |
ATTR_POINT_SIZE[32..63] |
0x200..0x280 |
ATTR_POSITION_X[32..63] |
0x280..0x300 |
ATTR_POINT_SIZE[63..95] |
0x300..0x380 |
ATTR_POSITION_X[63..95] |
… |
… |
0x700..0x780 |
ATTR_POINT_SIZE[224..255] |
0x780..0x800 |
ATTR_POSITION_X[224..255] |