325 lines
12 KiB
Markdown
325 lines
12 KiB
Markdown
# Memory Layout Examples
|
|
|
|
Note, this is how we'll layout the data in Amber. Some of these types don't
|
|
exist in standard GLSL (they exist in GL_EXT_shader_explicit_arithmetic_types).
|
|
We allow them in Amber to give flexibility in the data provided, but attempt to
|
|
follow the layout rules with all types for consistency.
|
|
|
|
For the purposes of this document, all scalars are stored in little-endian. The
|
|
lower number components of a vector appear earlier than higher numbered ones.
|
|
Similar for columns and rows of matrices.
|
|
|
|
All type names used in the file are the Amber names. They differ from GLSL but
|
|
are a bit more explicit, so are used here for clarity.
|
|
|
|
## Scalars
|
|
|
|
| Name | Bytes |
|
|
|------|-------|
|
|
| int8 | <kbd>[b]</kbd> |
|
|
| uint8 | <kbd>[b]</kbd> |
|
|
| int16 | <kbd>[bb]</kbd> |
|
|
| uint16 | <kbd>[bb]</kbd> |
|
|
| float16 | <kbd>[bb]</kbd> |
|
|
| int32 | <kbd>[bbbb]</kbd> |
|
|
| uint32 | <kbd>[bbbb]</kbd> |
|
|
| float | <kbd>[bbbb]</kbd> |
|
|
| int64 | <kbd>[bbbb][bbbb]</kbd> |
|
|
| uint64 | <kbd>[bbbb][bbbb]</kbd> |
|
|
| double | <kbd>[bbbb][bbbb]</kbd> |
|
|
|
|
## Vectors
|
|
### STD140 & STD430
|
|
|
|
| Name | Bytes |
|
|
|------|-------|
|
|
| vec2\<float> | <kbd>[bbbb][bbbb]</kbd> |
|
|
| vec3\<float> | <kbd>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
| vec4\<float> | <kbd>[bbbb][bbbb][bbbb][bbbb]</kbd> |
|
|
| vec2\<int8> | <kbd>[bb]</kbd> |
|
|
| vec3\<int8> | <kbd>[bbb-]</kbd> |
|
|
| vec4\<int8> | <kbd>[bbbb]</kbd> |
|
|
| vec2\<int16> | <kbd>[bbbb]</kbd> |
|
|
| vec3\<int16> | <kbd>[bbbb][bb--]</kbd> |
|
|
| vec4\<int16> | <kbd>[bbbb][bbbb]</kbd> |
|
|
| vec2\<int32> | <kbd>[bbbb][bbbb]</kbd> |
|
|
| vec3\<int32> | <kbd>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
| vec4\<int32> | <kbd>[bbbb][bbbb][bbbb][bbbb]</kbd> |
|
|
|
|
|
|
## Scalar Arrays
|
|
### STD140
|
|
| Name | Bytes |
|
|
|------|-------|
|
|
| int8[] | <kbd>[b---][----][----][----]</kbd> |
|
|
| int16[] | <kbd>[bb--][----][----][----]</kbd> |
|
|
| int32[] | <kbd>[bbbb][----][----][----]</kbd> |
|
|
| int64[] | <kbd>[bbbb][bbbb][----][----]</kbd> |
|
|
| float[] | <kbd>[bbbb][----][----][----]</kbd> |
|
|
|
|
### STD430
|
|
| Name | Bytes |
|
|
|------|-------|
|
|
| int8[] | <kbd>[b]</kbd> |
|
|
| int16[] | <kbd>[bb]</kbd> |
|
|
| int32[] | <kbd>[bbbb]</kbd> |
|
|
| int64[] | <kbd>[bbbb][bbbb]</kbd> |
|
|
| float[] | <kbd>[bbbb]</kbd> |
|
|
|
|
|
|
## Vector Arrays
|
|
### STD140
|
|
| Name | Bytes |
|
|
|------|-------|
|
|
| vec2\<float>[] | <kbd>[bbbb][bbbb][----][----]</kbd> |
|
|
| vec3\<float>[] | <kbd>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
| vec4\<float>[] | <kbd>[bbbb][bbbb][bbbb][bbbb]</kbd> |
|
|
| vec2\<int8>[] | <kbd>[bb--][----][----][----]</kbd> |
|
|
| vec2\<int16>[] | <kbd>[bbbb][----][----][----]</kbd> |
|
|
| vec2\<int32>[] | <kbd>[bbbb][bbbb][----][----]</kbd> |
|
|
| vec3\<int8>[] | <kbd>[bbb-][----][----][----]</kbd> |
|
|
| vec3\<int16>[] | <kbd>[bbbb][bb--][----][----]</kbd> |
|
|
| vec3\<int32>[] | <kbd>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
| vec4\<int8>[] | <kbd>[bbbb][----][----][----]</kbd> |
|
|
| vec4\<int16>[] | <kbd>[bbbb][bbbb][----][----]</kbd> |
|
|
| vec4\<int32>[] | <kbd>[bbbb][bbbb][bbbb][bbbb]</kbd> |
|
|
|
|
### STD430
|
|
| Name | Bytes |
|
|
|------|-------|
|
|
| vec2\<float>[] | <kbd>[bbbb][bbbb]</kbd> |
|
|
| vec3\<float>[] | <kbd>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
| vec4\<float>[] | <kbd>[bbbb][bbbb][bbbb][bbbb]</kbd> |
|
|
| vec2\<int8>[] | <kbd>[bb]</kbd> |
|
|
| vec2\<int16>[] | <kbd>[bbbb]</kbd> |
|
|
| vec2\<int32>[] | <kbd>[bbbb][bbbb]</kbd> |
|
|
| vec3\<int8>[] | <kbd>[bbb-]</kbd> |
|
|
| vec3\<int16>[] | <kbd>[bbbb][bb--]</kbd> |
|
|
| vec3\<int32>[] | <kbd>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
| vec4\<int8>[] | <kbd>[bbbb]</kbd> |
|
|
| vec4\<int16>[] | <kbd>[bbbb][bbbb]</kbd> |
|
|
| vec4\<int32>[] | <kbd>[bbbb][bbbb][bbbb][bbbb]</kbd> |
|
|
|
|
|
|
## Matrices (All matrices are column-major matrices, format is matCxR)
|
|
|
|
Note, GLSL does not have matrices with integer components although they exist in
|
|
other shader languages.
|
|
|
|
### STD140
|
|
| Name | Bytes |
|
|
|------|-------|
|
|
| mat2x2\<int8> | <kbd>[bb--][----][----][----]<br/>[bb--][----][----][----]</kbd> |
|
|
| mat2x2\<fp16> | <kbd>[bbbb][----][----][----]<br/>[bbbb][----][----][----]</kbd> |
|
|
| mat2x2\<float> | <kbd>[bbbb][bbbb][----][----]<br/>[bbbb][bbbb][----][----]</kbd> |
|
|
| mat2x3\<float> | <kbd>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
| mat2x4\<float> | <kbd>[bbbb][bbbb][bbbb][bbbb]<br/>[bbbb][bbbb][bbbb][bbbb]</kbd> |
|
|
| mat3x2\<float> | <kbd>[bbbb][bbbb][----][----]<br/>[bbbb][bbbb][----][----]<br/>[bbbb][bbbb][----][----]</kbd> |
|
|
| mat4x2\<float> | <kbd>[bbbb][bbbb][----][----]<br/>[bbbb][bbbb][----][----]<br/>[bbbb][bbbb][----][----]<br/>[bbbb][bbbb][----][----]</kbd> |
|
|
| mat4x3\<float> | <kbd>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
|
|
### STD430
|
|
| Name | Bytes |
|
|
|------|-------|
|
|
| mat2x2\<fp16> | <kbd>[bbbb]<br/>[bbbb]</kbd> |
|
|
| mat2x2\<float> | <kbd>[bbbb][bbbb]<br/>[bbbb][bbbb]</kbd> |
|
|
| mat2x3\<float> | <kbd>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
| mat2x4\<float> | <kbd>[bbbb][bbbb][bbbb][bbbb]<br/>[bbbb][bbbb][bbbb][bbbb]</kbd> |
|
|
| mat2x2\<int8> | <kbd>[bb]<br/>[bb]</kbd> |
|
|
| mat3x2\<float> | <kbd>[bbbb][bbbb]<br/>[bbbb][bbbb]<br/>[bbbb][bbbb]</kbd> |
|
|
| mat3x3\<float> | <kbd>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
| mat4x2\<float> | <kbd>[bbbb][bbbb][bbbb][bbbb]<br/>[bbbb][bbbb][bbbb][bbbb]</kbd> |
|
|
| mat4x3\<float> | <kbd>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
|
|
|
|
## Matrix Array (All matrices are column-major matrices).
|
|
|
|
In the examples shown the array stride is equal to the base alignment of the matrix
|
|
so no extra padding is added between elements.
|
|
|
|
### STD140
|
|
| Name | Bytes |
|
|
|------|-------|
|
|
| mat2x2\<int8>[] | <kbd>[bb--][----][----][----]<br/>[bb--][----][----][----]</kbd> |
|
|
| mat2x2\<fp16>[] | <kbd>[bbbb][----][----][----]<br/>[bbbb][----][----][----]</kbd> |
|
|
| mat2x2\<float>[] | <kbd>[bbbb][bbbb][----][----]<br/>[bbbb][bbbb][----][----]</kbd> |
|
|
| mat2x3\<float>[] | <kbd>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
| mat2x4\<float>[] | <kbd>[bbbb][bbbb][bbbb][bbbb]<br/>[bbbb][bbbb][bbbb][bbbb]</kbd> |
|
|
| mat3x2\<float>[] | <kbd>[bbbb][bbbb][----][----]<br/>[bbbb][bbbb][----][----]<br/>[bbbb][bbbb][----][----]</kbd> |
|
|
| mat4x2\<float>[] | <kbd>[bbbb][bbbb][----][----]<br/>[bbbb][bbbb][----][----]<br/>[bbbb][bbbb][----][----]<br/>[bbbb][bbbb][----][----]</kbd> |
|
|
| mat4x3\<float>[] | <kbd>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
|
|
### STD430
|
|
| Name | Bytes |
|
|
|------|-------|
|
|
| mat2x2\<fp16>[] | <kbd>[bbbb]<br/>[bbbb]</kbd> |
|
|
| mat2x2\<float>[] | <kbd>[bbbb][bbbb]<br/>[bbbb][bbbb]</kbd> |
|
|
| mat2x3\<float>[] | <kbd>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
| mat2x4\<float>[] | <kbd>[bbbb][bbbb][bbbb][bbbb]<br/>[bbbb][bbbb][bbbb][bbbb]</kbd> |
|
|
| mat2x2\<int8>[] | <kbd>[bb]<br/>[bb]</kbd> |
|
|
| mat3x2\<float>[] | <kbd>[bbbb][bbbb][bbbb][bbbb]<br/>[bbbb][bbbb]</kbd> |
|
|
| mat3x3\<float>[] | <kbd>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
| mat4x2\<float>[] | <kbd>[bbbb][bbbb][bbbb][bbbb]<br/>[bbbb][bbbb][bbbb][bbbb]</kbd> |
|
|
| mat4x3\<float>[] | <kbd>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]<br/>[bbbb][bbbb][bbbb][----]</kbd> |
|
|
|
|
## Structures
|
|
```
|
|
struct {
|
|
int32 w;
|
|
float x;
|
|
}
|
|
```
|
|
|
|
The STD140 pads 8 bytes at the end to become a multiple of 16 bytes.
|
|
|
|
| STD | Array Stride | Bytes |
|
|
|-----|:--------------------:|-------|
|
|
| 140 | 16 | <kbd>{w [bbbb]}<br/>{x [bbbb]}<br/> [----][----]</kbd> |
|
|
| 430 | 8 | <kbd>{w [bbbb]}<br/>{x [bbbb]}</kbd> |
|
|
|
|
<hr>
|
|
|
|
```
|
|
struct {
|
|
struct {
|
|
int32 a;
|
|
float b;
|
|
} x;
|
|
float y;
|
|
}
|
|
```
|
|
|
|
The STD140 pads 8 bytes at the end to become a multiple of 16 bytes.
|
|
|
|
| STD | Array Stride | Bytes |
|
|
|-----|:--------------------:|-------|
|
|
| 140 | 32 | <kbd>{x {a [bbbb]}<br/> {b [bbbb]}<br/> [----][----]<br/>{y [bbbb][----][----][----]}</kbd> |
|
|
| 430 | 12 | <kbd>{x {a [bbbb]}<br/> {b [bbbb]}<br/>{y [bbbb]}</kbd> |
|
|
|
|
|
|
<hr>
|
|
|
|
```
|
|
struct {
|
|
int32 w;
|
|
vec2<float> x;
|
|
float y;
|
|
}
|
|
```
|
|
|
|
For both cases, the `vec2` is the member with the largest base alignment
|
|
requirement, so giving a base alignment of 8 bytes. The STD140 cases pads 8
|
|
bytes at the end (in the array element case) to become a multiple of 16.
|
|
|
|
| STD | Array Stride | Bytes |
|
|
|-----|:---------------------:|-------|
|
|
| 140 | 32 | <kbd>{w [bbbb][----]}<br/>{x [bbbb][bbbb]}<br/>{y [bbbb][----]}<br/> [----][----]</kbd> |
|
|
| 430 | 24 | <kbd>{w [bbbb][----]}<br/>{x [bbbb][bbbb]}<br/>{y [bbbb][----]}</kbd> |
|
|
|
|
<hr>
|
|
|
|
|
|
```
|
|
struct {
|
|
int32 w;
|
|
vec3<float> x;
|
|
float y;
|
|
}
|
|
```
|
|
|
|
The `vec3` expands to a `vec4`. This gives a base alignment of 16 bytes. So
|
|
the `w` pads to 16 bytes. the `float y` is packed into the `vec3` as there is
|
|
space (effectively making it a vec4).
|
|
|
|
|
|
| STD | Array Stride | Bytes |
|
|
|-----|:--------------------:|-------|
|
|
| 140 | 32 | <kbd>{w [bbbb][----][----][----]}<br/>{x [bbbb][bbbb][bbbb]}<br/>{y [bbbb]}</kbd> |
|
|
| 430 | 32 | <kbd>{w [bbbb][----][----][----]}<br/>{x [bbbb][bbbb][bbbb]}<br/>{y [bbbb]}</kbd> |
|
|
|
|
<hr>
|
|
|
|
|
|
```
|
|
struct {
|
|
int32 w;
|
|
vec3<float> x;
|
|
vec2<float> y;
|
|
}
|
|
```
|
|
|
|
The `vec3` expands to a `vec4`. This gives a base alignment of 16 bytes. So
|
|
the `w` pads to 16 bytes.
|
|
|
|
|
|
| STD | Array Stride | Bytes |
|
|
|-----|:--------------------:|-------|
|
|
| 140 | 48 | <kbd>{w [bbbb][----][----][----]}<br/>{x [bbbb][bbbb][bbbb][----]}<br/>{y [bbbb][bbbb]}<br/>[----][----]</kbd> |
|
|
| 430 | 48 | <kbd>{w [bbbb][----][----][----]}<br/>{x [bbbb][bbbb][bbbb][----]}<br/>{y [bbbb][bbbb]}<br/>[----][----]</kbd> |
|
|
|
|
<hr>
|
|
|
|
|
|
```
|
|
struct {
|
|
int32 w;
|
|
mat2x2<float> x;
|
|
float y;
|
|
}
|
|
```
|
|
|
|
In STD140 the `mat2x2<float>` has a base alignment of 16 bytes (the mat2x2 is, effectively,
|
|
an array of vec2's The vec2's have a size of 8 bytes this size rounds up to a vec4, so 16 bytes).
|
|
|
|
In STD430, the round up doesn't happen, so the base alignment is 8 bytes.
|
|
|
|
| STD | Array Stride | Bytes |
|
|
|-----|:---------------------:|-------|
|
|
| 140 | 64 | <kbd>{w [bbbb][----][----][----]}<br/>{x [bbbb][bbbb][----][----]<br/> [bbbb][bbbb][----][----]}<br/>{y [bbbb][----][----][----]}</kbd> |
|
|
| 430 | 32 | <kbd>{w [bbbb][----]}<br/>{x [bbbb][bbbb][bbbb][bbbb]}<br/>{y [bbbb][----]}</kbd> |
|
|
|
|
<hr>
|
|
|
|
|
|
```
|
|
struct {
|
|
int32 w;
|
|
struct {
|
|
int32 a;
|
|
int32 b;
|
|
float c;
|
|
} x;
|
|
float y;
|
|
}
|
|
```
|
|
|
|
The base alignment of the largest item is 4 bytes. In STD140, this rounds up to
|
|
16 bytes because of the substructure.
|
|
|
|
| STD | Array Stride | Bytes |
|
|
|-----|:--------------------:|-------|
|
|
| 140 | 48 | <kbd>{w [bbbb][----][----][----]}<br/>{x a{[bbbb]}<br/> b{[bbbb]}<br/> c{[bbbb]}<br /> [----]<br/>{y [bbbb][----][----][----]}</kbd> |
|
|
| 430 | 20 | <kbd>{w [bbbb]}<br/>{x a{[bbbb]}<br/> b{[bbbb]}<br/> c{[bbbb]}<br/>{y [bbbb]}</kbd> |
|
|
|
|
<hr>
|
|
|
|
```
|
|
struct {
|
|
int32 w;
|
|
struct {
|
|
int32 a;
|
|
int32 b;
|
|
float c[3];
|
|
} x;
|
|
float y;
|
|
}
|
|
```
|
|
|
|
The `int a` and `int b` end up packing together so 16 bytes of padding are added (instead of 24 bytes).
|
|
The `float c[3]` has an array stride of 16 bytes in STD140 and 4 bytes in STD430.
|
|
|
|
| STD | Array Stride | Bytes |
|
|
|-----|:--------------------:|-------|
|
|
| 140 | 96 | <kbd>{w [bbbb][----][----][----]}<br/>{x {a [bbbb]}<br/> {b [bbbb]}<br/> [----][----]<br/> {c [bbbb][----][----][----]<br/> [bbbb][----][----][----]<br/> [bbbb][----][----][----]}}<br/>{y [bbbb][----][----][----]}</kbd> |
|
|
| 430 | 28 | <kbd>{w [bbbb]}<br/>{x a{[bbbb]}<br/> {b [bbbb]}<br/> {c [bbbb][bbbb][bbbb] }}<br/>{y [bbbb]}</kbd> |
|