mirror of
https://github.com/italicsjenga/vello.git
synced 2025-01-10 20:51:29 +11:00
cb06b1bc3d
This version seems to work but the allocation of segments has low utilization. Probably best to allocate in chunks rather than try to make them contiguous.
133 lines
2.8 KiB
C
133 lines
2.8 KiB
C
// Code auto-generated by piet-gpu-derive
|
|
|
|
struct InstanceRef {
|
|
uint offset;
|
|
};
|
|
|
|
struct JumpRef {
|
|
uint offset;
|
|
};
|
|
|
|
struct ChunkRef {
|
|
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 {
|
|
TileGroupRef new_ref;
|
|
};
|
|
|
|
#define Jump_size 4
|
|
|
|
JumpRef Jump_index(JumpRef ref, uint index) {
|
|
return JumpRef(ref.offset + index * Jump_size);
|
|
}
|
|
|
|
struct Chunk {
|
|
uint chunk_n;
|
|
ChunkRef next;
|
|
};
|
|
|
|
#define Chunk_size 8
|
|
|
|
ChunkRef Chunk_index(ChunkRef ref, uint index) {
|
|
return ChunkRef(ref.offset + index * Chunk_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 = TileGroupRef(raw0);
|
|
return s;
|
|
}
|
|
|
|
void Jump_write(JumpRef ref, Jump s) {
|
|
uint ix = ref.offset >> 2;
|
|
tilegroup[ix + 0] = s.new_ref.offset;
|
|
}
|
|
|
|
Chunk Chunk_read(ChunkRef ref) {
|
|
uint ix = ref.offset >> 2;
|
|
uint raw0 = tilegroup[ix + 0];
|
|
uint raw1 = tilegroup[ix + 1];
|
|
Chunk s;
|
|
s.chunk_n = raw0;
|
|
s.next = ChunkRef(raw1);
|
|
return s;
|
|
}
|
|
|
|
void Chunk_write(ChunkRef ref, Chunk s) {
|
|
uint ix = ref.offset >> 2;
|
|
tilegroup[ix + 0] = s.chunk_n;
|
|
tilegroup[ix + 1] = s.next.offset;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|