vello/piet-gpu/shader/tilegroup.h
Raph Levien cb06b1bc3d Implement stroked polylines
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.
2020-04-28 18:45:59 -07:00

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;
}