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