github.com/cybriq/giocore@v0.0.7-0.20210703034601-cfb9cb5f3900/gpu/shaders/tile.h (about) 1 // SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense 2 3 // Code auto-generated by piet-gpu-derive 4 5 struct PathRef { 6 uint offset; 7 }; 8 9 struct TileRef { 10 uint offset; 11 }; 12 13 struct TileSegRef { 14 uint offset; 15 }; 16 17 struct TransformSegRef { 18 uint offset; 19 }; 20 21 struct Path { 22 uvec4 bbox; 23 TileRef tiles; 24 }; 25 26 #define Path_size 12 27 28 PathRef Path_index(PathRef ref, uint index) { 29 return PathRef(ref.offset + index * Path_size); 30 } 31 32 struct Tile { 33 TileSegRef tile; 34 int backdrop; 35 }; 36 37 #define Tile_size 8 38 39 TileRef Tile_index(TileRef ref, uint index) { 40 return TileRef(ref.offset + index * Tile_size); 41 } 42 43 struct TileSeg { 44 vec2 origin; 45 vec2 vector; 46 float y_edge; 47 TileSegRef next; 48 }; 49 50 #define TileSeg_size 24 51 52 TileSegRef TileSeg_index(TileSegRef ref, uint index) { 53 return TileSegRef(ref.offset + index * TileSeg_size); 54 } 55 56 struct TransformSeg { 57 vec4 mat; 58 vec2 translate; 59 }; 60 61 #define TransformSeg_size 24 62 63 TransformSegRef TransformSeg_index(TransformSegRef ref, uint index) { 64 return TransformSegRef(ref.offset + index * TransformSeg_size); 65 } 66 67 Path Path_read(Alloc a, PathRef ref) { 68 uint ix = ref.offset >> 2; 69 uint raw0 = read_mem(a, ix + 0); 70 uint raw1 = read_mem(a, ix + 1); 71 uint raw2 = read_mem(a, ix + 2); 72 Path s; 73 s.bbox = uvec4(raw0 & 0xffff, raw0 >> 16, raw1 & 0xffff, raw1 >> 16); 74 s.tiles = TileRef(raw2); 75 return s; 76 } 77 78 void Path_write(Alloc a, PathRef ref, Path s) { 79 uint ix = ref.offset >> 2; 80 write_mem(a, ix + 0, s.bbox.x | (s.bbox.y << 16)); 81 write_mem(a, ix + 1, s.bbox.z | (s.bbox.w << 16)); 82 write_mem(a, ix + 2, s.tiles.offset); 83 } 84 85 Tile Tile_read(Alloc a, TileRef ref) { 86 uint ix = ref.offset >> 2; 87 uint raw0 = read_mem(a, ix + 0); 88 uint raw1 = read_mem(a, ix + 1); 89 Tile s; 90 s.tile = TileSegRef(raw0); 91 s.backdrop = int(raw1); 92 return s; 93 } 94 95 void Tile_write(Alloc a, TileRef ref, Tile s) { 96 uint ix = ref.offset >> 2; 97 write_mem(a, ix + 0, s.tile.offset); 98 write_mem(a, ix + 1, uint(s.backdrop)); 99 } 100 101 TileSeg TileSeg_read(Alloc a, TileSegRef ref) { 102 uint ix = ref.offset >> 2; 103 uint raw0 = read_mem(a, ix + 0); 104 uint raw1 = read_mem(a, ix + 1); 105 uint raw2 = read_mem(a, ix + 2); 106 uint raw3 = read_mem(a, ix + 3); 107 uint raw4 = read_mem(a, ix + 4); 108 uint raw5 = read_mem(a, ix + 5); 109 TileSeg s; 110 s.origin = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1)); 111 s.vector = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3)); 112 s.y_edge = uintBitsToFloat(raw4); 113 s.next = TileSegRef(raw5); 114 return s; 115 } 116 117 void TileSeg_write(Alloc a, TileSegRef ref, TileSeg s) { 118 uint ix = ref.offset >> 2; 119 write_mem(a, ix + 0, floatBitsToUint(s.origin.x)); 120 write_mem(a, ix + 1, floatBitsToUint(s.origin.y)); 121 write_mem(a, ix + 2, floatBitsToUint(s.vector.x)); 122 write_mem(a, ix + 3, floatBitsToUint(s.vector.y)); 123 write_mem(a, ix + 4, floatBitsToUint(s.y_edge)); 124 write_mem(a, ix + 5, s.next.offset); 125 } 126 127 TransformSeg TransformSeg_read(Alloc a, TransformSegRef ref) { 128 uint ix = ref.offset >> 2; 129 uint raw0 = read_mem(a, ix + 0); 130 uint raw1 = read_mem(a, ix + 1); 131 uint raw2 = read_mem(a, ix + 2); 132 uint raw3 = read_mem(a, ix + 3); 133 uint raw4 = read_mem(a, ix + 4); 134 uint raw5 = read_mem(a, ix + 5); 135 TransformSeg s; 136 s.mat = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3)); 137 s.translate = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5)); 138 return s; 139 } 140 141 void TransformSeg_write(Alloc a, TransformSegRef ref, TransformSeg s) { 142 uint ix = ref.offset >> 2; 143 write_mem(a, ix + 0, floatBitsToUint(s.mat.x)); 144 write_mem(a, ix + 1, floatBitsToUint(s.mat.y)); 145 write_mem(a, ix + 2, floatBitsToUint(s.mat.z)); 146 write_mem(a, ix + 3, floatBitsToUint(s.mat.w)); 147 write_mem(a, ix + 4, floatBitsToUint(s.translate.x)); 148 write_mem(a, ix + 5, floatBitsToUint(s.translate.y)); 149 } 150