// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense // Code auto-generated by piet-gpu-derive struct PathRef { uint offset; }; struct TileRef { uint offset; }; struct TileSegRef { uint offset; }; struct TransformSegRef { uint offset; }; struct Path { uvec4 bbox; TileRef tiles; }; #define Path_size 12 PathRef Path_index(PathRef ref, uint index) { return PathRef(ref.offset + index * Path_size); } struct Tile { TileSegRef tile; int backdrop; }; #define Tile_size 8 TileRef Tile_index(TileRef ref, uint index) { return TileRef(ref.offset + index * Tile_size); } struct TileSeg { vec2 origin; vec2 vector; float y_edge; TileSegRef next; }; #define TileSeg_size 24 TileSegRef TileSeg_index(TileSegRef ref, uint index) { return TileSegRef(ref.offset + index * TileSeg_size); } struct TransformSeg { vec4 mat; vec2 translate; }; #define TransformSeg_size 24 TransformSegRef TransformSeg_index(TransformSegRef ref, uint index) { return TransformSegRef(ref.offset + index * TransformSeg_size); } Path Path_read(Alloc a, PathRef ref) { uint ix = ref.offset >> 2; uint raw0 = read_mem(a, ix + 0); uint raw1 = read_mem(a, ix + 1); uint raw2 = read_mem(a, ix + 2); Path s; s.bbox = uvec4(raw0 & 0xffff, raw0 >> 16, raw1 & 0xffff, raw1 >> 16); s.tiles = TileRef(raw2); return s; } void Path_write(Alloc a, PathRef ref, Path s) { uint ix = ref.offset >> 2; write_mem(a, ix + 0, s.bbox.x | (s.bbox.y << 16)); write_mem(a, ix + 1, s.bbox.z | (s.bbox.w << 16)); write_mem(a, ix + 2, s.tiles.offset); } Tile Tile_read(Alloc a, TileRef ref) { uint ix = ref.offset >> 2; uint raw0 = read_mem(a, ix + 0); uint raw1 = read_mem(a, ix + 1); Tile s; s.tile = TileSegRef(raw0); s.backdrop = int(raw1); return s; } void Tile_write(Alloc a, TileRef ref, Tile s) { uint ix = ref.offset >> 2; write_mem(a, ix + 0, s.tile.offset); write_mem(a, ix + 1, uint(s.backdrop)); } TileSeg TileSeg_read(Alloc a, TileSegRef ref) { uint ix = ref.offset >> 2; uint raw0 = read_mem(a, ix + 0); uint raw1 = read_mem(a, ix + 1); uint raw2 = read_mem(a, ix + 2); uint raw3 = read_mem(a, ix + 3); uint raw4 = read_mem(a, ix + 4); uint raw5 = read_mem(a, ix + 5); TileSeg s; s.origin = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1)); s.vector = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3)); s.y_edge = uintBitsToFloat(raw4); s.next = TileSegRef(raw5); return s; } void TileSeg_write(Alloc a, TileSegRef ref, TileSeg s) { uint ix = ref.offset >> 2; write_mem(a, ix + 0, floatBitsToUint(s.origin.x)); write_mem(a, ix + 1, floatBitsToUint(s.origin.y)); write_mem(a, ix + 2, floatBitsToUint(s.vector.x)); write_mem(a, ix + 3, floatBitsToUint(s.vector.y)); write_mem(a, ix + 4, floatBitsToUint(s.y_edge)); write_mem(a, ix + 5, s.next.offset); } TransformSeg TransformSeg_read(Alloc a, TransformSegRef ref) { uint ix = ref.offset >> 2; uint raw0 = read_mem(a, ix + 0); uint raw1 = read_mem(a, ix + 1); uint raw2 = read_mem(a, ix + 2); uint raw3 = read_mem(a, ix + 3); uint raw4 = read_mem(a, ix + 4); uint raw5 = read_mem(a, ix + 5); TransformSeg s; s.mat = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3)); s.translate = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5)); return s; } void TransformSeg_write(Alloc a, TransformSegRef ref, TransformSeg s) { uint ix = ref.offset >> 2; write_mem(a, ix + 0, floatBitsToUint(s.mat.x)); write_mem(a, ix + 1, floatBitsToUint(s.mat.y)); write_mem(a, ix + 2, floatBitsToUint(s.mat.z)); write_mem(a, ix + 3, floatBitsToUint(s.mat.w)); write_mem(a, ix + 4, floatBitsToUint(s.translate.x)); write_mem(a, ix + 5, floatBitsToUint(s.translate.y)); }