ISBE Layout — The Mesa 3D Graphics Library latest documentation

# 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]