mirror of
https://github.com/italicsjenga/vello.git
synced 2025-01-10 20:51:29 +11:00
55e35dd879
When the initial allocation is exceeded, do an atomic bump allocation. This is done for both tilegroup instances and per tile command lists.
102 lines
2.2 KiB
C
102 lines
2.2 KiB
C
// Code auto-generated by piet-gpu-derive
|
|
|
|
struct InstanceRef {
|
|
uint offset;
|
|
};
|
|
|
|
struct JumpRef {
|
|
uint offset;
|
|
};
|
|
|
|
struct TileGroupRef {
|
|
uint offset;
|
|
};
|
|
|
|
struct Instance {
|
|
uint item_ref;
|
|
vec2 offset;
|
|
};
|
|
|
|
#define Instance_size 12
|
|
|
|
InstanceRef Instance_index(InstanceRef ref, uint index) {
|
|
return InstanceRef(ref.offset + index * Instance_size);
|
|
}
|
|
|
|
struct Jump {
|
|
uint new_ref;
|
|
};
|
|
|
|
#define Jump_size 4
|
|
|
|
JumpRef Jump_index(JumpRef ref, uint index) {
|
|
return JumpRef(ref.offset + index * Jump_size);
|
|
}
|
|
|
|
#define TileGroup_Instance 0
|
|
#define TileGroup_Jump 1
|
|
#define TileGroup_End 2
|
|
#define TileGroup_size 16
|
|
|
|
TileGroupRef TileGroup_index(TileGroupRef ref, uint index) {
|
|
return TileGroupRef(ref.offset + index * TileGroup_size);
|
|
}
|
|
|
|
Instance Instance_read(InstanceRef ref) {
|
|
uint ix = ref.offset >> 2;
|
|
uint raw0 = tilegroup[ix + 0];
|
|
uint raw1 = tilegroup[ix + 1];
|
|
uint raw2 = tilegroup[ix + 2];
|
|
Instance s;
|
|
s.item_ref = raw0;
|
|
s.offset = vec2(uintBitsToFloat(raw1), uintBitsToFloat(raw2));
|
|
return s;
|
|
}
|
|
|
|
void Instance_write(InstanceRef ref, Instance s) {
|
|
uint ix = ref.offset >> 2;
|
|
tilegroup[ix + 0] = s.item_ref;
|
|
tilegroup[ix + 1] = floatBitsToUint(s.offset.x);
|
|
tilegroup[ix + 2] = floatBitsToUint(s.offset.y);
|
|
}
|
|
|
|
Jump Jump_read(JumpRef ref) {
|
|
uint ix = ref.offset >> 2;
|
|
uint raw0 = tilegroup[ix + 0];
|
|
Jump s;
|
|
s.new_ref = raw0;
|
|
return s;
|
|
}
|
|
|
|
void Jump_write(JumpRef ref, Jump s) {
|
|
uint ix = ref.offset >> 2;
|
|
tilegroup[ix + 0] = s.new_ref;
|
|
}
|
|
|
|
uint TileGroup_tag(TileGroupRef ref) {
|
|
return tilegroup[ref.offset >> 2];
|
|
}
|
|
|
|
Instance TileGroup_Instance_read(TileGroupRef ref) {
|
|
return Instance_read(InstanceRef(ref.offset + 4));
|
|
}
|
|
|
|
Jump TileGroup_Jump_read(TileGroupRef ref) {
|
|
return Jump_read(JumpRef(ref.offset + 4));
|
|
}
|
|
|
|
void TileGroup_Instance_write(TileGroupRef ref, Instance s) {
|
|
tilegroup[ref.offset >> 2] = TileGroup_Instance;
|
|
Instance_write(InstanceRef(ref.offset + 4), s);
|
|
}
|
|
|
|
void TileGroup_Jump_write(TileGroupRef ref, Jump s) {
|
|
tilegroup[ref.offset >> 2] = TileGroup_Jump;
|
|
Jump_write(JumpRef(ref.offset + 4), s);
|
|
}
|
|
|
|
void TileGroup_End_write(TileGroupRef ref) {
|
|
tilegroup[ref.offset >> 2] = TileGroup_End;
|
|
}
|
|
|