github.com/cybriq/giocore@v0.0.7-0.20210703034601-cfb9cb5f3900/gpu/shaders.go (about)

     1  // Code generated by build.go. DO NOT EDIT.
     2  
     3  package gpu
     4  
     5  import "github.com/cybriq/giocore/gpu/internal/driver"
     6  
     7  var (
     8  	shader_backdrop_comp = driver.ShaderSources{
     9  		Name: "backdrop.comp",
    10  		GLSL310ES: `#version 310 es
    11  layout(local_size_x = 128, local_size_y = 1, local_size_z = 1) in;
    12  
    13  struct Alloc
    14  {
    15      uint offset;
    16  };
    17  
    18  struct AnnotatedRef
    19  {
    20      uint offset;
    21  };
    22  
    23  struct AnnotatedTag
    24  {
    25      uint tag;
    26      uint flags;
    27  };
    28  
    29  struct PathRef
    30  {
    31      uint offset;
    32  };
    33  
    34  struct TileRef
    35  {
    36      uint offset;
    37  };
    38  
    39  struct Path
    40  {
    41      uvec4 bbox;
    42      TileRef tiles;
    43  };
    44  
    45  struct Config
    46  {
    47      uint n_elements;
    48      uint n_pathseg;
    49      uint width_in_tiles;
    50      uint height_in_tiles;
    51      Alloc tile_alloc;
    52      Alloc bin_alloc;
    53      Alloc ptcl_alloc;
    54      Alloc pathseg_alloc;
    55      Alloc anno_alloc;
    56      Alloc trans_alloc;
    57  };
    58  
    59  layout(binding = 0, std430) buffer Memory
    60  {
    61      uint mem_offset;
    62      uint mem_error;
    63      uint memory[];
    64  } _79;
    65  
    66  layout(binding = 1, std430) readonly buffer ConfigBuf
    67  {
    68      Config conf;
    69  } _187;
    70  
    71  shared uint sh_row_width[128];
    72  shared Alloc sh_row_alloc[128];
    73  shared uint sh_row_count[128];
    74  
    75  bool touch_mem(Alloc alloc, uint offset)
    76  {
    77      return true;
    78  }
    79  
    80  uint read_mem(Alloc alloc, uint offset)
    81  {
    82      Alloc param = alloc;
    83      uint param_1 = offset;
    84      if (!touch_mem(param, param_1))
    85      {
    86          return 0u;
    87      }
    88      uint v = _79.memory[offset];
    89      return v;
    90  }
    91  
    92  AnnotatedTag Annotated_tag(Alloc a, AnnotatedRef ref)
    93  {
    94      Alloc param = a;
    95      uint param_1 = ref.offset >> uint(2);
    96      uint tag_and_flags = read_mem(param, param_1);
    97      return AnnotatedTag(tag_and_flags & 65535u, tag_and_flags >> uint(16));
    98  }
    99  
   100  uint fill_mode_from_flags(uint flags)
   101  {
   102      return flags & 1u;
   103  }
   104  
   105  Path Path_read(Alloc a, PathRef ref)
   106  {
   107      uint ix = ref.offset >> uint(2);
   108      Alloc param = a;
   109      uint param_1 = ix + 0u;
   110      uint raw0 = read_mem(param, param_1);
   111      Alloc param_2 = a;
   112      uint param_3 = ix + 1u;
   113      uint raw1 = read_mem(param_2, param_3);
   114      Alloc param_4 = a;
   115      uint param_5 = ix + 2u;
   116      uint raw2 = read_mem(param_4, param_5);
   117      Path s;
   118      s.bbox = uvec4(raw0 & 65535u, raw0 >> uint(16), raw1 & 65535u, raw1 >> uint(16));
   119      s.tiles = TileRef(raw2);
   120      return s;
   121  }
   122  
   123  Alloc new_alloc(uint offset, uint size, bool mem_ok)
   124  {
   125      Alloc a;
   126      a.offset = offset;
   127      return a;
   128  }
   129  
   130  void write_mem(Alloc alloc, uint offset, uint val)
   131  {
   132      Alloc param = alloc;
   133      uint param_1 = offset;
   134      if (!touch_mem(param, param_1))
   135      {
   136          return;
   137      }
   138      _79.memory[offset] = val;
   139  }
   140  
   141  void main()
   142  {
   143      uint th_ix = gl_LocalInvocationID.x;
   144      uint element_ix = gl_GlobalInvocationID.x;
   145      AnnotatedRef ref = AnnotatedRef(_187.conf.anno_alloc.offset + (element_ix * 32u));
   146      uint row_count = 0u;
   147      bool mem_ok = _79.mem_error == 0u;
   148      if (element_ix < _187.conf.n_elements)
   149      {
   150          Alloc param;
   151          param.offset = _187.conf.anno_alloc.offset;
   152          AnnotatedRef param_1 = ref;
   153          AnnotatedTag tag = Annotated_tag(param, param_1);
   154          switch (tag.tag)
   155          {
   156              case 2u:
   157              case 3u:
   158              case 1u:
   159              {
   160                  uint param_2 = tag.flags;
   161                  if (fill_mode_from_flags(param_2) != 0u)
   162                  {
   163                      break;
   164                  }
   165                  PathRef path_ref = PathRef(_187.conf.tile_alloc.offset + (element_ix * 12u));
   166                  Alloc param_3;
   167                  param_3.offset = _187.conf.tile_alloc.offset;
   168                  PathRef param_4 = path_ref;
   169                  Path path = Path_read(param_3, param_4);
   170                  sh_row_width[th_ix] = path.bbox.z - path.bbox.x;
   171                  row_count = path.bbox.w - path.bbox.y;
   172                  bool _267 = row_count == 1u;
   173                  bool _273;
   174                  if (_267)
   175                  {
   176                      _273 = path.bbox.y > 0u;
   177                  }
   178                  else
   179                  {
   180                      _273 = _267;
   181                  }
   182                  if (_273)
   183                  {
   184                      row_count = 0u;
   185                  }
   186                  uint param_5 = path.tiles.offset;
   187                  uint param_6 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u;
   188                  bool param_7 = mem_ok;
   189                  Alloc path_alloc = new_alloc(param_5, param_6, param_7);
   190                  sh_row_alloc[th_ix] = path_alloc;
   191                  break;
   192              }
   193          }
   194      }
   195      sh_row_count[th_ix] = row_count;
   196      for (uint i = 0u; i < 7u; i++)
   197      {
   198          barrier();
   199          if (th_ix >= uint(1 << int(i)))
   200          {
   201              row_count += sh_row_count[th_ix - uint(1 << int(i))];
   202          }
   203          barrier();
   204          sh_row_count[th_ix] = row_count;
   205      }
   206      barrier();
   207      uint total_rows = sh_row_count[127];
   208      uint _399;
   209      for (uint row = th_ix; row < total_rows; row += 128u)
   210      {
   211          uint el_ix = 0u;
   212          for (uint i_1 = 0u; i_1 < 7u; i_1++)
   213          {
   214              uint probe = el_ix + uint(64 >> int(i_1));
   215              if (row >= sh_row_count[probe - 1u])
   216              {
   217                  el_ix = probe;
   218              }
   219          }
   220          uint width = sh_row_width[el_ix];
   221          if ((width > 0u) && mem_ok)
   222          {
   223              Alloc tiles_alloc = sh_row_alloc[el_ix];
   224              if (el_ix > 0u)
   225              {
   226                  _399 = sh_row_count[el_ix - 1u];
   227              }
   228              else
   229              {
   230                  _399 = 0u;
   231              }
   232              uint seq_ix = row - _399;
   233              uint tile_el_ix = ((tiles_alloc.offset >> uint(2)) + 1u) + ((seq_ix * 2u) * width);
   234              Alloc param_8 = tiles_alloc;
   235              uint param_9 = tile_el_ix;
   236              uint sum = read_mem(param_8, param_9);
   237              for (uint x = 1u; x < width; x++)
   238              {
   239                  tile_el_ix += 2u;
   240                  Alloc param_10 = tiles_alloc;
   241                  uint param_11 = tile_el_ix;
   242                  sum += read_mem(param_10, param_11);
   243                  Alloc param_12 = tiles_alloc;
   244                  uint param_13 = tile_el_ix;
   245                  uint param_14 = sum;
   246                  write_mem(param_12, param_13, param_14);
   247              }
   248          }
   249      }
   250  }
   251  
   252  `,
   253  	}
   254  	shader_binning_comp = driver.ShaderSources{
   255  		Name: "binning.comp",
   256  		GLSL310ES: `#version 310 es
   257  layout(local_size_x = 128, local_size_y = 1, local_size_z = 1) in;
   258  
   259  struct Alloc
   260  {
   261      uint offset;
   262  };
   263  
   264  struct MallocResult
   265  {
   266      Alloc alloc;
   267      bool failed;
   268  };
   269  
   270  struct AnnoEndClipRef
   271  {
   272      uint offset;
   273  };
   274  
   275  struct AnnoEndClip
   276  {
   277      vec4 bbox;
   278  };
   279  
   280  struct AnnotatedRef
   281  {
   282      uint offset;
   283  };
   284  
   285  struct AnnotatedTag
   286  {
   287      uint tag;
   288      uint flags;
   289  };
   290  
   291  struct BinInstanceRef
   292  {
   293      uint offset;
   294  };
   295  
   296  struct BinInstance
   297  {
   298      uint element_ix;
   299  };
   300  
   301  struct Config
   302  {
   303      uint n_elements;
   304      uint n_pathseg;
   305      uint width_in_tiles;
   306      uint height_in_tiles;
   307      Alloc tile_alloc;
   308      Alloc bin_alloc;
   309      Alloc ptcl_alloc;
   310      Alloc pathseg_alloc;
   311      Alloc anno_alloc;
   312      Alloc trans_alloc;
   313  };
   314  
   315  layout(binding = 0, std430) buffer Memory
   316  {
   317      uint mem_offset;
   318      uint mem_error;
   319      uint memory[];
   320  } _84;
   321  
   322  layout(binding = 1, std430) readonly buffer ConfigBuf
   323  {
   324      Config conf;
   325  } _253;
   326  
   327  shared uint bitmaps[4][128];
   328  shared bool sh_alloc_failed;
   329  shared uint count[4][128];
   330  shared Alloc sh_chunk_alloc[128];
   331  
   332  bool touch_mem(Alloc alloc, uint offset)
   333  {
   334      return true;
   335  }
   336  
   337  uint read_mem(Alloc alloc, uint offset)
   338  {
   339      Alloc param = alloc;
   340      uint param_1 = offset;
   341      if (!touch_mem(param, param_1))
   342      {
   343          return 0u;
   344      }
   345      uint v = _84.memory[offset];
   346      return v;
   347  }
   348  
   349  AnnotatedTag Annotated_tag(Alloc a, AnnotatedRef ref)
   350  {
   351      Alloc param = a;
   352      uint param_1 = ref.offset >> uint(2);
   353      uint tag_and_flags = read_mem(param, param_1);
   354      return AnnotatedTag(tag_and_flags & 65535u, tag_and_flags >> uint(16));
   355  }
   356  
   357  AnnoEndClip AnnoEndClip_read(Alloc a, AnnoEndClipRef ref)
   358  {
   359      uint ix = ref.offset >> uint(2);
   360      Alloc param = a;
   361      uint param_1 = ix + 0u;
   362      uint raw0 = read_mem(param, param_1);
   363      Alloc param_2 = a;
   364      uint param_3 = ix + 1u;
   365      uint raw1 = read_mem(param_2, param_3);
   366      Alloc param_4 = a;
   367      uint param_5 = ix + 2u;
   368      uint raw2 = read_mem(param_4, param_5);
   369      Alloc param_6 = a;
   370      uint param_7 = ix + 3u;
   371      uint raw3 = read_mem(param_6, param_7);
   372      AnnoEndClip s;
   373      s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
   374      return s;
   375  }
   376  
   377  AnnoEndClip Annotated_EndClip_read(Alloc a, AnnotatedRef ref)
   378  {
   379      Alloc param = a;
   380      AnnoEndClipRef param_1 = AnnoEndClipRef(ref.offset + 4u);
   381      return AnnoEndClip_read(param, param_1);
   382  }
   383  
   384  Alloc new_alloc(uint offset, uint size, bool mem_ok)
   385  {
   386      Alloc a;
   387      a.offset = offset;
   388      return a;
   389  }
   390  
   391  MallocResult malloc(uint size)
   392  {
   393      uint _90 = atomicAdd(_84.mem_offset, size);
   394      uint offset = _90;
   395      MallocResult r;
   396      r.failed = (offset + size) > uint(int(uint(_84.memory.length())) * 4);
   397      uint param = offset;
   398      uint param_1 = size;
   399      bool param_2 = !r.failed;
   400      r.alloc = new_alloc(param, param_1, param_2);
   401      if (r.failed)
   402      {
   403          uint _119 = atomicMax(_84.mem_error, 1u);
   404          return r;
   405      }
   406      return r;
   407  }
   408  
   409  void write_mem(Alloc alloc, uint offset, uint val)
   410  {
   411      Alloc param = alloc;
   412      uint param_1 = offset;
   413      if (!touch_mem(param, param_1))
   414      {
   415          return;
   416      }
   417      _84.memory[offset] = val;
   418  }
   419  
   420  void BinInstance_write(Alloc a, BinInstanceRef ref, BinInstance s)
   421  {
   422      uint ix = ref.offset >> uint(2);
   423      Alloc param = a;
   424      uint param_1 = ix + 0u;
   425      uint param_2 = s.element_ix;
   426      write_mem(param, param_1, param_2);
   427  }
   428  
   429  void main()
   430  {
   431      uint my_n_elements = _253.conf.n_elements;
   432      uint my_partition = gl_WorkGroupID.x;
   433      for (uint i = 0u; i < 4u; i++)
   434      {
   435          bitmaps[i][gl_LocalInvocationID.x] = 0u;
   436      }
   437      if (gl_LocalInvocationID.x == 0u)
   438      {
   439          sh_alloc_failed = false;
   440      }
   441      barrier();
   442      uint element_ix = (my_partition * 128u) + gl_LocalInvocationID.x;
   443      AnnotatedRef ref = AnnotatedRef(_253.conf.anno_alloc.offset + (element_ix * 32u));
   444      uint tag = 0u;
   445      if (element_ix < my_n_elements)
   446      {
   447          Alloc param;
   448          param.offset = _253.conf.anno_alloc.offset;
   449          AnnotatedRef param_1 = ref;
   450          tag = Annotated_tag(param, param_1).tag;
   451      }
   452      int x0 = 0;
   453      int y0 = 0;
   454      int x1 = 0;
   455      int y1 = 0;
   456      switch (tag)
   457      {
   458          case 1u:
   459          case 2u:
   460          case 3u:
   461          case 4u:
   462          {
   463              Alloc param_2;
   464              param_2.offset = _253.conf.anno_alloc.offset;
   465              AnnotatedRef param_3 = ref;
   466              AnnoEndClip clip = Annotated_EndClip_read(param_2, param_3);
   467              x0 = int(floor(clip.bbox.x * 0.001953125));
   468              y0 = int(floor(clip.bbox.y * 0.00390625));
   469              x1 = int(ceil(clip.bbox.z * 0.001953125));
   470              y1 = int(ceil(clip.bbox.w * 0.00390625));
   471              break;
   472          }
   473      }
   474      uint width_in_bins = ((_253.conf.width_in_tiles + 16u) - 1u) / 16u;
   475      uint height_in_bins = ((_253.conf.height_in_tiles + 8u) - 1u) / 8u;
   476      x0 = clamp(x0, 0, int(width_in_bins));
   477      x1 = clamp(x1, x0, int(width_in_bins));
   478      y0 = clamp(y0, 0, int(height_in_bins));
   479      y1 = clamp(y1, y0, int(height_in_bins));
   480      if (x0 == x1)
   481      {
   482          y1 = y0;
   483      }
   484      int x = x0;
   485      int y = y0;
   486      uint my_slice = gl_LocalInvocationID.x / 32u;
   487      uint my_mask = uint(1 << int(gl_LocalInvocationID.x & 31u));
   488      while (y < y1)
   489      {
   490          uint _438 = atomicOr(bitmaps[my_slice][(uint(y) * width_in_bins) + uint(x)], my_mask);
   491          x++;
   492          if (x == x1)
   493          {
   494              x = x0;
   495              y++;
   496          }
   497      }
   498      barrier();
   499      uint element_count = 0u;
   500      for (uint i_1 = 0u; i_1 < 4u; i_1++)
   501      {
   502          element_count += uint(bitCount(bitmaps[i_1][gl_LocalInvocationID.x]));
   503          count[i_1][gl_LocalInvocationID.x] = element_count;
   504      }
   505      uint param_4 = 0u;
   506      uint param_5 = 0u;
   507      bool param_6 = true;
   508      Alloc chunk_alloc = new_alloc(param_4, param_5, param_6);
   509      if (element_count != 0u)
   510      {
   511          uint param_7 = element_count * 4u;
   512          MallocResult _488 = malloc(param_7);
   513          MallocResult chunk = _488;
   514          chunk_alloc = chunk.alloc;
   515          sh_chunk_alloc[gl_LocalInvocationID.x] = chunk_alloc;
   516          if (chunk.failed)
   517          {
   518              sh_alloc_failed = true;
   519          }
   520      }
   521      uint out_ix = (_253.conf.bin_alloc.offset >> uint(2)) + (((my_partition * 128u) + gl_LocalInvocationID.x) * 2u);
   522      Alloc param_8;
   523      param_8.offset = _253.conf.bin_alloc.offset;
   524      uint param_9 = out_ix;
   525      uint param_10 = element_count;
   526      write_mem(param_8, param_9, param_10);
   527      Alloc param_11;
   528      param_11.offset = _253.conf.bin_alloc.offset;
   529      uint param_12 = out_ix + 1u;
   530      uint param_13 = chunk_alloc.offset;
   531      write_mem(param_11, param_12, param_13);
   532      barrier();
   533      bool _544;
   534      if (!sh_alloc_failed)
   535      {
   536          _544 = _84.mem_error != 0u;
   537      }
   538      else
   539      {
   540          _544 = sh_alloc_failed;
   541      }
   542      if (_544)
   543      {
   544          return;
   545      }
   546      x = x0;
   547      y = y0;
   548      while (y < y1)
   549      {
   550          uint bin_ix = (uint(y) * width_in_bins) + uint(x);
   551          uint out_mask = bitmaps[my_slice][bin_ix];
   552          if ((out_mask & my_mask) != 0u)
   553          {
   554              uint idx = uint(bitCount(out_mask & (my_mask - 1u)));
   555              if (my_slice > 0u)
   556              {
   557                  idx += count[my_slice - 1u][bin_ix];
   558              }
   559              Alloc out_alloc = sh_chunk_alloc[bin_ix];
   560              uint out_offset = out_alloc.offset + (idx * 4u);
   561              Alloc param_14 = out_alloc;
   562              BinInstanceRef param_15 = BinInstanceRef(out_offset);
   563              BinInstance param_16 = BinInstance(element_ix);
   564              BinInstance_write(param_14, param_15, param_16);
   565          }
   566          x++;
   567          if (x == x1)
   568          {
   569              x = x0;
   570              y++;
   571          }
   572      }
   573  }
   574  
   575  `,
   576  	}
   577  	shader_blit_frag = [...]driver.ShaderSources{
   578  		{
   579  			Name:   "blit.frag",
   580  			Inputs: []driver.InputLocation{{Name: "vUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}},
   581  			Uniforms: driver.UniformsReflection{
   582  				Blocks:    []driver.UniformBlock{{Name: "Color", Binding: 0}},
   583  				Locations: []driver.UniformLocation{{Name: "_color.color", Type: 0x0, Size: 4, Offset: 0}},
   584  				Size:      16,
   585  			},
   586  			GLSL100ES: `#version 100
   587  precision mediump float;
   588  precision highp int;
   589  
   590  struct Color
   591  {
   592      vec4 color;
   593  };
   594  
   595  uniform Color _color;
   596  
   597  varying vec2 vUV;
   598  
   599  void main()
   600  {
   601      gl_FragData[0] = _color.color;
   602  }
   603  
   604  `,
   605  			GLSL300ES: `#version 300 es
   606  precision mediump float;
   607  precision highp int;
   608  
   609  layout(std140) uniform Color
   610  {
   611      vec4 color;
   612  } _color;
   613  
   614  layout(location = 0) out vec4 fragColor;
   615  in vec2 vUV;
   616  
   617  void main()
   618  {
   619      fragColor = _color.color;
   620  }
   621  
   622  `,
   623  			GLSL130: `#version 130
   624  
   625  struct Color
   626  {
   627      vec4 color;
   628  };
   629  
   630  uniform Color _color;
   631  
   632  out vec4 fragColor;
   633  in vec2 vUV;
   634  
   635  void main()
   636  {
   637      fragColor = _color.color;
   638  }
   639  
   640  `,
   641  			GLSL150: `#version 150
   642  
   643  layout(std140) uniform Color
   644  {
   645      vec4 color;
   646  } _color;
   647  
   648  out vec4 fragColor;
   649  in vec2 vUV;
   650  
   651  void main()
   652  {
   653      fragColor = _color.color;
   654  }
   655  
   656  `,
   657  			HLSL: "DXBC,\xc1\x9c\x85P\xbc\xab\x8a.\x9e\b\xdd\xf7\xd2\x18\xa2\x01\x00\x00\x00t\x02\x00\x00\x06\x00\x00\x008\x00\x00\x00\x84\x00\x00\x00\xcc\x00\x00\x00H\x01\x00\x00\f\x02\x00\x00@\x02\x00\x00Aon9D\x00\x00\x00D\x00\x00\x00\x00\x02\xff\xff\x14\x00\x00\x000\x00\x00\x00\x01\x00$\x00\x00\x000\x00\x00\x000\x00\x00\x00$\x00\x00\x000\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x02\xff\xff\x01\x00\x00\x02\x00\b\x0f\x80\x00\x00\xe4\xa0\xff\xff\x00\x00SHDR@\x00\x00\x00@\x00\x00\x00\x10\x00\x00\x00Y\x00\x00\x04F\x8e \x00\x00\x00\x00\x00\x01\x00\x00\x00e\x00\x00\x03\xf2 \x10\x00\x00\x00\x00\x006\x00\x00\x06\xf2 \x10\x00\x00\x00\x00\x00F\x8e \x00\x00\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x01STATt\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEF\xbc\x00\x00\x00\x01\x00\x00\x00D\x00\x00\x00\x01\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xff\xff\x00\x01\x00\x00\x94\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00Color\x00\xab\xab<\x00\x00\x00\x01\x00\x00\x00\\\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00_color_color\x00\xab\xab\xab\x01\x00\x03\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00Microsoft (R) HLSL Shader Compiler 10.1\x00ISGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00TEXCOORD\x00\xab\xab\xabOSGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00SV_Target\x00\xab\xab",
   658  		},
   659  		{
   660  			Name:   "blit.frag",
   661  			Inputs: []driver.InputLocation{{Name: "vUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}},
   662  			Uniforms: driver.UniformsReflection{
   663  				Blocks:    []driver.UniformBlock{{Name: "Gradient", Binding: 0}},
   664  				Locations: []driver.UniformLocation{{Name: "_gradient.color1", Type: 0x0, Size: 4, Offset: 0}, {Name: "_gradient.color2", Type: 0x0, Size: 4, Offset: 16}},
   665  				Size:      32,
   666  			},
   667  			GLSL100ES: `#version 100
   668  precision mediump float;
   669  precision highp int;
   670  
   671  struct Gradient
   672  {
   673      vec4 color1;
   674      vec4 color2;
   675  };
   676  
   677  uniform Gradient _gradient;
   678  
   679  varying vec2 vUV;
   680  
   681  void main()
   682  {
   683      gl_FragData[0] = mix(_gradient.color1, _gradient.color2, vec4(clamp(vUV.x, 0.0, 1.0)));
   684  }
   685  
   686  `,
   687  			GLSL300ES: `#version 300 es
   688  precision mediump float;
   689  precision highp int;
   690  
   691  layout(std140) uniform Gradient
   692  {
   693      vec4 color1;
   694      vec4 color2;
   695  } _gradient;
   696  
   697  layout(location = 0) out vec4 fragColor;
   698  in vec2 vUV;
   699  
   700  void main()
   701  {
   702      fragColor = mix(_gradient.color1, _gradient.color2, vec4(clamp(vUV.x, 0.0, 1.0)));
   703  }
   704  
   705  `,
   706  			GLSL130: `#version 130
   707  
   708  struct Gradient
   709  {
   710      vec4 color1;
   711      vec4 color2;
   712  };
   713  
   714  uniform Gradient _gradient;
   715  
   716  out vec4 fragColor;
   717  in vec2 vUV;
   718  
   719  void main()
   720  {
   721      fragColor = mix(_gradient.color1, _gradient.color2, vec4(clamp(vUV.x, 0.0, 1.0)));
   722  }
   723  
   724  `,
   725  			GLSL150: `#version 150
   726  
   727  layout(std140) uniform Gradient
   728  {
   729      vec4 color1;
   730      vec4 color2;
   731  } _gradient;
   732  
   733  out vec4 fragColor;
   734  in vec2 vUV;
   735  
   736  void main()
   737  {
   738      fragColor = mix(_gradient.color1, _gradient.color2, vec4(clamp(vUV.x, 0.0, 1.0)));
   739  }
   740  
   741  `,
   742  			HLSL: "DXBCdZ\xb9AA\xb2\xa5-Σc\xb9\xdc\xfd]\xae\x01\x00\x00\x00P\x03\x00\x00\x06\x00\x00\x008\x00\x00\x00\xcc\x00\x00\x00t\x01\x00\x00\xf0\x01\x00\x00\xe8\x02\x00\x00\x1c\x03\x00\x00Aon9\x8c\x00\x00\x00\x8c\x00\x00\x00\x00\x02\xff\xff\\\x00\x00\x000\x00\x00\x00\x01\x00$\x00\x00\x000\x00\x00\x000\x00\x00\x00$\x00\x00\x000\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x02\xff\xff\x1f\x00\x00\x02\x00\x00\x00\x80\x00\x00\x03\xb0\x01\x00\x00\x02\x00\x00\x18\x80\x00\x00\x00\xb0\x01\x00\x00\x02\x01\x00\x0f\x80\x00\x00\xe4\xa0\x02\x00\x00\x03\x01\x00\x0f\x80\x01\x00\xe4\x81\x01\x00\xe4\xa0\x04\x00\x00\x04\x00\x00\x0f\x80\x00\x00\xff\x80\x01\x00\xe4\x80\x00\x00\xe4\xa0\x01\x00\x00\x02\x00\b\x0f\x80\x00\x00\xe4\x80\xff\xff\x00\x00SHDR\xa0\x00\x00\x00@\x00\x00\x00(\x00\x00\x00Y\x00\x00\x04F\x8e \x00\x00\x00\x00\x00\x02\x00\x00\x00b\x10\x00\x03\x12\x10\x10\x00\x00\x00\x00\x00e\x00\x00\x03\xf2 \x10\x00\x00\x00\x00\x00h\x00\x00\x02\x02\x00\x00\x006 \x00\x05\x12\x00\x10\x00\x00\x00\x00\x00\n\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\n\xf2\x00\x10\x00\x01\x00\x00\x00F\x8e \x80A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00F\x8e \x00\x00\x00\x00\x00\x01\x00\x00\x002\x00\x00\n\xf2 \x10\x00\x00\x00\x00\x00\x06\x00\x10\x00\x00\x00\x00\x00F\x0e\x10\x00\x01\x00\x00\x00F\x8e \x00\x00\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x01STATt\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEF\xf0\x00\x00\x00\x01\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xff\xff\x00\x01\x00\x00\xc5\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00Gradient\x00\xab\xab\xab<\x00\x00\x00\x02\x00\x00\x00`\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00_gradient_color1\x00\xab\xab\xab\x01\x00\x03\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00_gradient_color2\x00Microsoft (R) HLSL Shader Compiler 10.1\x00\xab\xab\xabISGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00TEXCOORD\x00\xab\xab\xabOSGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00SV_Target\x00\xab\xab",
   743  		},
   744  		{
   745  			Name:     "blit.frag",
   746  			Inputs:   []driver.InputLocation{{Name: "vUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}},
   747  			Textures: []driver.TextureBinding{{Name: "tex", Binding: 0}},
   748  			GLSL100ES: `#version 100
   749  precision mediump float;
   750  precision highp int;
   751  
   752  uniform mediump sampler2D tex;
   753  
   754  varying vec2 vUV;
   755  
   756  void main()
   757  {
   758      gl_FragData[0] = texture2D(tex, vUV);
   759  }
   760  
   761  `,
   762  			GLSL300ES: `#version 300 es
   763  precision mediump float;
   764  precision highp int;
   765  
   766  uniform mediump sampler2D tex;
   767  
   768  layout(location = 0) out vec4 fragColor;
   769  in vec2 vUV;
   770  
   771  void main()
   772  {
   773      fragColor = texture(tex, vUV);
   774  }
   775  
   776  `,
   777  			GLSL130: `#version 130
   778  
   779  uniform sampler2D tex;
   780  
   781  out vec4 fragColor;
   782  in vec2 vUV;
   783  
   784  void main()
   785  {
   786      fragColor = texture(tex, vUV);
   787  }
   788  
   789  `,
   790  			GLSL150: `#version 150
   791  
   792  uniform sampler2D tex;
   793  
   794  out vec4 fragColor;
   795  in vec2 vUV;
   796  
   797  void main()
   798  {
   799      fragColor = texture(tex, vUV);
   800  }
   801  
   802  `,
   803  			HLSL: "DXBC\xb7?\x1d\xb1\x80̀\xa3W\t\xfbZ\x9fV\xd6\xda\x01\x00\x00\x00\x94\x02\x00\x00\x06\x00\x00\x008\x00\x00\x00\xa4\x00\x00\x00\x10\x01\x00\x00\x8c\x01\x00\x00,\x02\x00\x00`\x02\x00\x00Aon9d\x00\x00\x00d\x00\x00\x00\x00\x02\xff\xff<\x00\x00\x00(\x00\x00\x00\x00\x00(\x00\x00\x00(\x00\x00\x00(\x00\x01\x00$\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x02\xff\xff\x1f\x00\x00\x02\x00\x00\x00\x80\x00\x00\x03\xb0\x1f\x00\x00\x02\x00\x00\x00\x90\x00\b\x0f\xa0B\x00\x00\x03\x00\x00\x0f\x80\x00\x00\xe4\xb0\x00\b\xe4\xa0\x01\x00\x00\x02\x00\b\x0f\x80\x00\x00\xe4\x80\xff\xff\x00\x00SHDRd\x00\x00\x00@\x00\x00\x00\x19\x00\x00\x00Z\x00\x00\x03\x00`\x10\x00\x00\x00\x00\x00X\x18\x00\x04\x00p\x10\x00\x00\x00\x00\x00UU\x00\x00b\x10\x00\x032\x10\x10\x00\x00\x00\x00\x00e\x00\x00\x03\xf2 \x10\x00\x00\x00\x00\x00E\x00\x00\t\xf2 \x10\x00\x00\x00\x00\x00F\x10\x10\x00\x00\x00\x00\x00F~\x10\x00\x00\x00\x00\x00\x00`\x10\x00\x00\x00\x00\x00>\x00\x00\x01STATt\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEF\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xff\xff\x00\x01\x00\x00m\x00\x00\x00\\\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00i\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x01\x00\x00\x00\r\x00\x00\x00_tex_sampler\x00tex\x00Microsoft (R) HLSL Shader Compiler 10.1\x00\xab\xab\xabISGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00TEXCOORD\x00\xab\xab\xabOSGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00SV_Target\x00\xab\xab",
   804  		},
   805  	}
   806  	shader_blit_vert = driver.ShaderSources{
   807  		Name:   "blit.vert",
   808  		Inputs: []driver.InputLocation{{Name: "pos", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "uv", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}},
   809  		Uniforms: driver.UniformsReflection{
   810  			Blocks:    []driver.UniformBlock{{Name: "Block", Binding: 0}},
   811  			Locations: []driver.UniformLocation{{Name: "_block.transform", Type: 0x0, Size: 4, Offset: 0}, {Name: "_block.uvTransformR1", Type: 0x0, Size: 4, Offset: 16}, {Name: "_block.uvTransformR2", Type: 0x0, Size: 4, Offset: 32}, {Name: "_block.z", Type: 0x0, Size: 1, Offset: 48}},
   812  			Size:      52,
   813  		},
   814  		GLSL100ES: `#version 100
   815  
   816  struct m3x2
   817  {
   818      vec3 r0;
   819      vec3 r1;
   820  };
   821  
   822  struct Block
   823  {
   824      vec4 transform;
   825      vec4 uvTransformR1;
   826      vec4 uvTransformR2;
   827      float z;
   828  };
   829  
   830  uniform Block _block;
   831  
   832  attribute vec2 pos;
   833  varying vec2 vUV;
   834  attribute vec2 uv;
   835  
   836  vec4 toClipSpace(vec4 pos_1)
   837  {
   838      return pos_1;
   839  }
   840  
   841  vec3 transform3x2(m3x2 t, vec3 v)
   842  {
   843      return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v));
   844  }
   845  
   846  void main()
   847  {
   848      vec2 p = (pos * _block.transform.xy) + _block.transform.zw;
   849      vec4 param = vec4(p, _block.z, 1.0);
   850      gl_Position = toClipSpace(param);
   851      m3x2 param_1 = m3x2(_block.uvTransformR1.xyz, _block.uvTransformR2.xyz);
   852      vec3 param_2 = vec3(uv, 1.0);
   853      vUV = transform3x2(param_1, param_2).xy;
   854  }
   855  
   856  `,
   857  		GLSL300ES: `#version 300 es
   858  
   859  struct m3x2
   860  {
   861      vec3 r0;
   862      vec3 r1;
   863  };
   864  
   865  layout(std140) uniform Block
   866  {
   867      vec4 transform;
   868      vec4 uvTransformR1;
   869      vec4 uvTransformR2;
   870      float z;
   871  } _block;
   872  
   873  layout(location = 0) in vec2 pos;
   874  out vec2 vUV;
   875  layout(location = 1) in vec2 uv;
   876  
   877  vec4 toClipSpace(vec4 pos_1)
   878  {
   879      return pos_1;
   880  }
   881  
   882  vec3 transform3x2(m3x2 t, vec3 v)
   883  {
   884      return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v));
   885  }
   886  
   887  void main()
   888  {
   889      vec2 p = (pos * _block.transform.xy) + _block.transform.zw;
   890      vec4 param = vec4(p, _block.z, 1.0);
   891      gl_Position = toClipSpace(param);
   892      m3x2 param_1 = m3x2(_block.uvTransformR1.xyz, _block.uvTransformR2.xyz);
   893      vec3 param_2 = vec3(uv, 1.0);
   894      vUV = transform3x2(param_1, param_2).xy;
   895  }
   896  
   897  `,
   898  		GLSL130: `#version 130
   899  
   900  struct m3x2
   901  {
   902      vec3 r0;
   903      vec3 r1;
   904  };
   905  
   906  struct Block
   907  {
   908      vec4 transform;
   909      vec4 uvTransformR1;
   910      vec4 uvTransformR2;
   911      float z;
   912  };
   913  
   914  uniform Block _block;
   915  
   916  in vec2 pos;
   917  out vec2 vUV;
   918  in vec2 uv;
   919  
   920  vec4 toClipSpace(vec4 pos_1)
   921  {
   922      return pos_1;
   923  }
   924  
   925  vec3 transform3x2(m3x2 t, vec3 v)
   926  {
   927      return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v));
   928  }
   929  
   930  void main()
   931  {
   932      vec2 p = (pos * _block.transform.xy) + _block.transform.zw;
   933      vec4 param = vec4(p, _block.z, 1.0);
   934      gl_Position = toClipSpace(param);
   935      m3x2 param_1 = m3x2(_block.uvTransformR1.xyz, _block.uvTransformR2.xyz);
   936      vec3 param_2 = vec3(uv, 1.0);
   937      vUV = transform3x2(param_1, param_2).xy;
   938  }
   939  
   940  `,
   941  		GLSL150: `#version 150
   942  
   943  struct m3x2
   944  {
   945      vec3 r0;
   946      vec3 r1;
   947  };
   948  
   949  layout(std140) uniform Block
   950  {
   951      vec4 transform;
   952      vec4 uvTransformR1;
   953      vec4 uvTransformR2;
   954      float z;
   955  } _block;
   956  
   957  in vec2 pos;
   958  out vec2 vUV;
   959  in vec2 uv;
   960  
   961  vec4 toClipSpace(vec4 pos_1)
   962  {
   963      return pos_1;
   964  }
   965  
   966  vec3 transform3x2(m3x2 t, vec3 v)
   967  {
   968      return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v));
   969  }
   970  
   971  void main()
   972  {
   973      vec2 p = (pos * _block.transform.xy) + _block.transform.zw;
   974      vec4 param = vec4(p, _block.z, 1.0);
   975      gl_Position = toClipSpace(param);
   976      m3x2 param_1 = m3x2(_block.uvTransformR1.xyz, _block.uvTransformR2.xyz);
   977      vec3 param_2 = vec3(uv, 1.0);
   978      vUV = transform3x2(param_1, param_2).xy;
   979  }
   980  
   981  `,
   982  		HLSL: "DXBC\x80\xa7\xa0\x9e\xbb\xa1\xa3\x1b\x85\xac\xb6\xe9\xfb\xe6W\x03\x01\x00\x00\x00\xc8\x04\x00\x00\x06\x00\x00\x008\x00\x00\x00$\x01\x00\x00T\x02\x00\x00\xd0\x02\x00\x00$\x04\x00\x00p\x04\x00\x00Aon9\xe4\x00\x00\x00\xe4\x00\x00\x00\x00\x02\xfe\xff\xb0\x00\x00\x004\x00\x00\x00\x01\x00$\x00\x00\x000\x00\x00\x000\x00\x00\x00$\x00\x01\x000\x00\x00\x00\x00\x00\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xfe\xffQ\x00\x00\x05\x05\x00\x0f\xa0\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x1f\x00\x00\x02\x05\x00\x00\x80\x00\x00\x0f\x90\x1f\x00\x00\x02\x05\x00\x01\x80\x01\x00\x0f\x90\x04\x00\x00\x04\x00\x00\a\x80\x01\x00Đ\x05\x00Р\x05\x00Š\b\x00\x00\x03\x00\x00\x01\xe0\x02\x00\xe4\xa0\x00\x00\xe4\x80\b\x00\x00\x03\x00\x00\x02\xe0\x03\x00\xe4\xa0\x00\x00\xe4\x80\x04\x00\x00\x04\x00\x00\x03\x80\x00\x00\xe4\x90\x01\x00\xe4\xa0\x01\x00\xee\xa0\x02\x00\x00\x03\x00\x00\x03\xc0\x00\x00\xe4\x80\x00\x00\xe4\xa0\x01\x00\x00\x02\x00\x00\a\x80\x05\x00\xe4\xa0\x04\x00\x00\x04\x00\x00\f\xc0\x04\x00\x00\xa0\x00\x00d\x80\x00\x00$\x80\xff\xff\x00\x00SHDR(\x01\x00\x00@\x00\x01\x00J\x00\x00\x00Y\x00\x00\x04F\x8e \x00\x00\x00\x00\x00\x04\x00\x00\x00_\x00\x00\x032\x10\x10\x00\x00\x00\x00\x00_\x00\x00\x032\x10\x10\x00\x01\x00\x00\x00e\x00\x00\x032 \x10\x00\x00\x00\x00\x00g\x00\x00\x04\xf2 \x10\x00\x01\x00\x00\x00\x01\x00\x00\x00h\x00\x00\x02\x01\x00\x00\x006\x00\x00\x052\x00\x10\x00\x00\x00\x00\x00F\x10\x10\x00\x01\x00\x00\x006\x00\x00\x05B\x00\x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x80?\x10\x00\x00\b\x12 \x10\x00\x00\x00\x00\x00F\x82 \x00\x00\x00\x00\x00\x01\x00\x00\x00F\x02\x10\x00\x00\x00\x00\x00\x10\x00\x00\b\" \x10\x00\x00\x00\x00\x00F\x82 \x00\x00\x00\x00\x00\x02\x00\x00\x00F\x02\x10\x00\x00\x00\x00\x002\x00\x00\v2 \x10\x00\x01\x00\x00\x00F\x10\x10\x00\x00\x00\x00\x00F\x80 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x8a \x00\x00\x00\x00\x00\x00\x00\x00\x002\x00\x00\nB \x10\x00\x01\x00\x00\x00\n\x80 \x00\x00\x00\x00\x00\x03\x00\x00\x00\x01@\x00\x00\x00\x00\x00?\x01@\x00\x00\x00\x00\x00?6\x00\x00\x05\x82 \x10\x00\x01\x00\x00\x00\x01@\x00\x00\x00\x00\x80?>\x00\x00\x01STATt\x00\x00\x00\b\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEFL\x01\x00\x00\x01\x00\x00\x00D\x00\x00\x00\x01\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xfe\xff\x00\x01\x00\x00$\x01\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00Block\x00\xab\xab<\x00\x00\x00\x04\x00\x00\x00\\\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00 \x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\n\x01\x00\x000\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x14\x01\x00\x00\x00\x00\x00\x00_block_transform\x00\xab\xab\xab\x01\x00\x03\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00_block_uvTransformR1\x00_block_uvTransformR2\x00_block_z\x00\xab\x00\x00\x03\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00Microsoft (R) HLSL Shader Compiler 10.1\x00ISGND\x00\x00\x00\x02\x00\x00\x00\b\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x008\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x03\x03\x00\x00TEXCOORD\x00\xab\xab\xabOSGNP\x00\x00\x00\x02\x00\x00\x00\b\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\f\x00\x00A\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x0f\x00\x00\x00TEXCOORD\x00SV_Position\x00\xab\xab\xab",
   983  	}
   984  	shader_coarse_comp = driver.ShaderSources{
   985  		Name: "coarse.comp",
   986  		GLSL310ES: `#version 310 es
   987  layout(local_size_x = 128, local_size_y = 1, local_size_z = 1) in;
   988  
   989  struct Alloc
   990  {
   991      uint offset;
   992  };
   993  
   994  struct MallocResult
   995  {
   996      Alloc alloc;
   997      bool failed;
   998  };
   999  
  1000  struct AnnoImageRef
  1001  {
  1002      uint offset;
  1003  };
  1004  
  1005  struct AnnoImage
  1006  {
  1007      vec4 bbox;
  1008      float linewidth;
  1009      uint index;
  1010      ivec2 offset;
  1011  };
  1012  
  1013  struct AnnoColorRef
  1014  {
  1015      uint offset;
  1016  };
  1017  
  1018  struct AnnoColor
  1019  {
  1020      vec4 bbox;
  1021      float linewidth;
  1022      uint rgba_color;
  1023  };
  1024  
  1025  struct AnnoBeginClipRef
  1026  {
  1027      uint offset;
  1028  };
  1029  
  1030  struct AnnoBeginClip
  1031  {
  1032      vec4 bbox;
  1033      float linewidth;
  1034  };
  1035  
  1036  struct AnnotatedRef
  1037  {
  1038      uint offset;
  1039  };
  1040  
  1041  struct AnnotatedTag
  1042  {
  1043      uint tag;
  1044      uint flags;
  1045  };
  1046  
  1047  struct BinInstanceRef
  1048  {
  1049      uint offset;
  1050  };
  1051  
  1052  struct BinInstance
  1053  {
  1054      uint element_ix;
  1055  };
  1056  
  1057  struct PathRef
  1058  {
  1059      uint offset;
  1060  };
  1061  
  1062  struct TileRef
  1063  {
  1064      uint offset;
  1065  };
  1066  
  1067  struct Path
  1068  {
  1069      uvec4 bbox;
  1070      TileRef tiles;
  1071  };
  1072  
  1073  struct TileSegRef
  1074  {
  1075      uint offset;
  1076  };
  1077  
  1078  struct Tile
  1079  {
  1080      TileSegRef tile;
  1081      int backdrop;
  1082  };
  1083  
  1084  struct CmdStrokeRef
  1085  {
  1086      uint offset;
  1087  };
  1088  
  1089  struct CmdStroke
  1090  {
  1091      uint tile_ref;
  1092      float half_width;
  1093  };
  1094  
  1095  struct CmdFillRef
  1096  {
  1097      uint offset;
  1098  };
  1099  
  1100  struct CmdFill
  1101  {
  1102      uint tile_ref;
  1103      int backdrop;
  1104  };
  1105  
  1106  struct CmdColorRef
  1107  {
  1108      uint offset;
  1109  };
  1110  
  1111  struct CmdColor
  1112  {
  1113      uint rgba_color;
  1114  };
  1115  
  1116  struct CmdImageRef
  1117  {
  1118      uint offset;
  1119  };
  1120  
  1121  struct CmdImage
  1122  {
  1123      uint index;
  1124      ivec2 offset;
  1125  };
  1126  
  1127  struct CmdJumpRef
  1128  {
  1129      uint offset;
  1130  };
  1131  
  1132  struct CmdJump
  1133  {
  1134      uint new_ref;
  1135  };
  1136  
  1137  struct CmdRef
  1138  {
  1139      uint offset;
  1140  };
  1141  
  1142  struct Config
  1143  {
  1144      uint n_elements;
  1145      uint n_pathseg;
  1146      uint width_in_tiles;
  1147      uint height_in_tiles;
  1148      Alloc tile_alloc;
  1149      Alloc bin_alloc;
  1150      Alloc ptcl_alloc;
  1151      Alloc pathseg_alloc;
  1152      Alloc anno_alloc;
  1153      Alloc trans_alloc;
  1154  };
  1155  
  1156  layout(binding = 0, std430) buffer Memory
  1157  {
  1158      uint mem_offset;
  1159      uint mem_error;
  1160      uint memory[];
  1161  } _273;
  1162  
  1163  layout(binding = 1, std430) readonly buffer ConfigBuf
  1164  {
  1165      Config conf;
  1166  } _1066;
  1167  
  1168  shared uint sh_bitmaps[4][128];
  1169  shared Alloc sh_part_elements[128];
  1170  shared uint sh_part_count[128];
  1171  shared uint sh_elements[128];
  1172  shared uint sh_tile_stride[128];
  1173  shared uint sh_tile_width[128];
  1174  shared uint sh_tile_x0[128];
  1175  shared uint sh_tile_y0[128];
  1176  shared uint sh_tile_base[128];
  1177  shared uint sh_tile_count[128];
  1178  
  1179  Alloc slice_mem(Alloc a, uint offset, uint size)
  1180  {
  1181      return Alloc(a.offset + offset);
  1182  }
  1183  
  1184  bool touch_mem(Alloc alloc, uint offset)
  1185  {
  1186      return true;
  1187  }
  1188  
  1189  uint read_mem(Alloc alloc, uint offset)
  1190  {
  1191      Alloc param = alloc;
  1192      uint param_1 = offset;
  1193      if (!touch_mem(param, param_1))
  1194      {
  1195          return 0u;
  1196      }
  1197      uint v = _273.memory[offset];
  1198      return v;
  1199  }
  1200  
  1201  Alloc new_alloc(uint offset, uint size, bool mem_ok)
  1202  {
  1203      Alloc a;
  1204      a.offset = offset;
  1205      return a;
  1206  }
  1207  
  1208  BinInstanceRef BinInstance_index(BinInstanceRef ref, uint index)
  1209  {
  1210      return BinInstanceRef(ref.offset + (index * 4u));
  1211  }
  1212  
  1213  BinInstance BinInstance_read(Alloc a, BinInstanceRef ref)
  1214  {
  1215      uint ix = ref.offset >> uint(2);
  1216      Alloc param = a;
  1217      uint param_1 = ix + 0u;
  1218      uint raw0 = read_mem(param, param_1);
  1219      BinInstance s;
  1220      s.element_ix = raw0;
  1221      return s;
  1222  }
  1223  
  1224  AnnotatedTag Annotated_tag(Alloc a, AnnotatedRef ref)
  1225  {
  1226      Alloc param = a;
  1227      uint param_1 = ref.offset >> uint(2);
  1228      uint tag_and_flags = read_mem(param, param_1);
  1229      return AnnotatedTag(tag_and_flags & 65535u, tag_and_flags >> uint(16));
  1230  }
  1231  
  1232  Path Path_read(Alloc a, PathRef ref)
  1233  {
  1234      uint ix = ref.offset >> uint(2);
  1235      Alloc param = a;
  1236      uint param_1 = ix + 0u;
  1237      uint raw0 = read_mem(param, param_1);
  1238      Alloc param_2 = a;
  1239      uint param_3 = ix + 1u;
  1240      uint raw1 = read_mem(param_2, param_3);
  1241      Alloc param_4 = a;
  1242      uint param_5 = ix + 2u;
  1243      uint raw2 = read_mem(param_4, param_5);
  1244      Path s;
  1245      s.bbox = uvec4(raw0 & 65535u, raw0 >> uint(16), raw1 & 65535u, raw1 >> uint(16));
  1246      s.tiles = TileRef(raw2);
  1247      return s;
  1248  }
  1249  
  1250  void write_tile_alloc(uint el_ix, Alloc a)
  1251  {
  1252  }
  1253  
  1254  Alloc read_tile_alloc(uint el_ix, bool mem_ok)
  1255  {
  1256      uint param = 0u;
  1257      uint param_1 = uint(int(uint(_273.memory.length())) * 4);
  1258      bool param_2 = mem_ok;
  1259      return new_alloc(param, param_1, param_2);
  1260  }
  1261  
  1262  Tile Tile_read(Alloc a, TileRef ref)
  1263  {
  1264      uint ix = ref.offset >> uint(2);
  1265      Alloc param = a;
  1266      uint param_1 = ix + 0u;
  1267      uint raw0 = read_mem(param, param_1);
  1268      Alloc param_2 = a;
  1269      uint param_3 = ix + 1u;
  1270      uint raw1 = read_mem(param_2, param_3);
  1271      Tile s;
  1272      s.tile = TileSegRef(raw0);
  1273      s.backdrop = int(raw1);
  1274      return s;
  1275  }
  1276  
  1277  AnnoColor AnnoColor_read(Alloc a, AnnoColorRef ref)
  1278  {
  1279      uint ix = ref.offset >> uint(2);
  1280      Alloc param = a;
  1281      uint param_1 = ix + 0u;
  1282      uint raw0 = read_mem(param, param_1);
  1283      Alloc param_2 = a;
  1284      uint param_3 = ix + 1u;
  1285      uint raw1 = read_mem(param_2, param_3);
  1286      Alloc param_4 = a;
  1287      uint param_5 = ix + 2u;
  1288      uint raw2 = read_mem(param_4, param_5);
  1289      Alloc param_6 = a;
  1290      uint param_7 = ix + 3u;
  1291      uint raw3 = read_mem(param_6, param_7);
  1292      Alloc param_8 = a;
  1293      uint param_9 = ix + 4u;
  1294      uint raw4 = read_mem(param_8, param_9);
  1295      Alloc param_10 = a;
  1296      uint param_11 = ix + 5u;
  1297      uint raw5 = read_mem(param_10, param_11);
  1298      AnnoColor s;
  1299      s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
  1300      s.linewidth = uintBitsToFloat(raw4);
  1301      s.rgba_color = raw5;
  1302      return s;
  1303  }
  1304  
  1305  AnnoColor Annotated_Color_read(Alloc a, AnnotatedRef ref)
  1306  {
  1307      Alloc param = a;
  1308      AnnoColorRef param_1 = AnnoColorRef(ref.offset + 4u);
  1309      return AnnoColor_read(param, param_1);
  1310  }
  1311  
  1312  MallocResult malloc(uint size)
  1313  {
  1314      uint _279 = atomicAdd(_273.mem_offset, size);
  1315      uint offset = _279;
  1316      MallocResult r;
  1317      r.failed = (offset + size) > uint(int(uint(_273.memory.length())) * 4);
  1318      uint param = offset;
  1319      uint param_1 = size;
  1320      bool param_2 = !r.failed;
  1321      r.alloc = new_alloc(param, param_1, param_2);
  1322      if (r.failed)
  1323      {
  1324          uint _308 = atomicMax(_273.mem_error, 1u);
  1325          return r;
  1326      }
  1327      return r;
  1328  }
  1329  
  1330  void write_mem(Alloc alloc, uint offset, uint val)
  1331  {
  1332      Alloc param = alloc;
  1333      uint param_1 = offset;
  1334      if (!touch_mem(param, param_1))
  1335      {
  1336          return;
  1337      }
  1338      _273.memory[offset] = val;
  1339  }
  1340  
  1341  void CmdJump_write(Alloc a, CmdJumpRef ref, CmdJump s)
  1342  {
  1343      uint ix = ref.offset >> uint(2);
  1344      Alloc param = a;
  1345      uint param_1 = ix + 0u;
  1346      uint param_2 = s.new_ref;
  1347      write_mem(param, param_1, param_2);
  1348  }
  1349  
  1350  void Cmd_Jump_write(Alloc a, CmdRef ref, CmdJump s)
  1351  {
  1352      Alloc param = a;
  1353      uint param_1 = ref.offset >> uint(2);
  1354      uint param_2 = 9u;
  1355      write_mem(param, param_1, param_2);
  1356      Alloc param_3 = a;
  1357      CmdJumpRef param_4 = CmdJumpRef(ref.offset + 4u);
  1358      CmdJump param_5 = s;
  1359      CmdJump_write(param_3, param_4, param_5);
  1360  }
  1361  
  1362  bool alloc_cmd(inout Alloc cmd_alloc, inout CmdRef cmd_ref, inout uint cmd_limit)
  1363  {
  1364      if (cmd_ref.offset < cmd_limit)
  1365      {
  1366          return true;
  1367      }
  1368      uint param = 1024u;
  1369      MallocResult _973 = malloc(param);
  1370      MallocResult new_cmd = _973;
  1371      if (new_cmd.failed)
  1372      {
  1373          return false;
  1374      }
  1375      CmdJump jump = CmdJump(new_cmd.alloc.offset);
  1376      Alloc param_1 = cmd_alloc;
  1377      CmdRef param_2 = cmd_ref;
  1378      CmdJump param_3 = jump;
  1379      Cmd_Jump_write(param_1, param_2, param_3);
  1380      cmd_alloc = new_cmd.alloc;
  1381      cmd_ref = CmdRef(cmd_alloc.offset);
  1382      cmd_limit = (cmd_alloc.offset + 1024u) - 36u;
  1383      return true;
  1384  }
  1385  
  1386  uint fill_mode_from_flags(uint flags)
  1387  {
  1388      return flags & 1u;
  1389  }
  1390  
  1391  void CmdFill_write(Alloc a, CmdFillRef ref, CmdFill s)
  1392  {
  1393      uint ix = ref.offset >> uint(2);
  1394      Alloc param = a;
  1395      uint param_1 = ix + 0u;
  1396      uint param_2 = s.tile_ref;
  1397      write_mem(param, param_1, param_2);
  1398      Alloc param_3 = a;
  1399      uint param_4 = ix + 1u;
  1400      uint param_5 = uint(s.backdrop);
  1401      write_mem(param_3, param_4, param_5);
  1402  }
  1403  
  1404  void Cmd_Fill_write(Alloc a, CmdRef ref, CmdFill s)
  1405  {
  1406      Alloc param = a;
  1407      uint param_1 = ref.offset >> uint(2);
  1408      uint param_2 = 1u;
  1409      write_mem(param, param_1, param_2);
  1410      Alloc param_3 = a;
  1411      CmdFillRef param_4 = CmdFillRef(ref.offset + 4u);
  1412      CmdFill param_5 = s;
  1413      CmdFill_write(param_3, param_4, param_5);
  1414  }
  1415  
  1416  void Cmd_Solid_write(Alloc a, CmdRef ref)
  1417  {
  1418      Alloc param = a;
  1419      uint param_1 = ref.offset >> uint(2);
  1420      uint param_2 = 3u;
  1421      write_mem(param, param_1, param_2);
  1422  }
  1423  
  1424  void CmdStroke_write(Alloc a, CmdStrokeRef ref, CmdStroke s)
  1425  {
  1426      uint ix = ref.offset >> uint(2);
  1427      Alloc param = a;
  1428      uint param_1 = ix + 0u;
  1429      uint param_2 = s.tile_ref;
  1430      write_mem(param, param_1, param_2);
  1431      Alloc param_3 = a;
  1432      uint param_4 = ix + 1u;
  1433      uint param_5 = floatBitsToUint(s.half_width);
  1434      write_mem(param_3, param_4, param_5);
  1435  }
  1436  
  1437  void Cmd_Stroke_write(Alloc a, CmdRef ref, CmdStroke s)
  1438  {
  1439      Alloc param = a;
  1440      uint param_1 = ref.offset >> uint(2);
  1441      uint param_2 = 2u;
  1442      write_mem(param, param_1, param_2);
  1443      Alloc param_3 = a;
  1444      CmdStrokeRef param_4 = CmdStrokeRef(ref.offset + 4u);
  1445      CmdStroke param_5 = s;
  1446      CmdStroke_write(param_3, param_4, param_5);
  1447  }
  1448  
  1449  void write_fill(Alloc alloc, inout CmdRef cmd_ref, uint flags, Tile tile, float linewidth)
  1450  {
  1451      uint param = flags;
  1452      if (fill_mode_from_flags(param) == 0u)
  1453      {
  1454          if (tile.tile.offset != 0u)
  1455          {
  1456              CmdFill cmd_fill = CmdFill(tile.tile.offset, tile.backdrop);
  1457              Alloc param_1 = alloc;
  1458              CmdRef param_2 = cmd_ref;
  1459              CmdFill param_3 = cmd_fill;
  1460              Cmd_Fill_write(param_1, param_2, param_3);
  1461              cmd_ref.offset += 12u;
  1462          }
  1463          else
  1464          {
  1465              Alloc param_4 = alloc;
  1466              CmdRef param_5 = cmd_ref;
  1467              Cmd_Solid_write(param_4, param_5);
  1468              cmd_ref.offset += 4u;
  1469          }
  1470      }
  1471      else
  1472      {
  1473          CmdStroke cmd_stroke = CmdStroke(tile.tile.offset, 0.5 * linewidth);
  1474          Alloc param_6 = alloc;
  1475          CmdRef param_7 = cmd_ref;
  1476          CmdStroke param_8 = cmd_stroke;
  1477          Cmd_Stroke_write(param_6, param_7, param_8);
  1478          cmd_ref.offset += 12u;
  1479      }
  1480  }
  1481  
  1482  void CmdColor_write(Alloc a, CmdColorRef ref, CmdColor s)
  1483  {
  1484      uint ix = ref.offset >> uint(2);
  1485      Alloc param = a;
  1486      uint param_1 = ix + 0u;
  1487      uint param_2 = s.rgba_color;
  1488      write_mem(param, param_1, param_2);
  1489  }
  1490  
  1491  void Cmd_Color_write(Alloc a, CmdRef ref, CmdColor s)
  1492  {
  1493      Alloc param = a;
  1494      uint param_1 = ref.offset >> uint(2);
  1495      uint param_2 = 5u;
  1496      write_mem(param, param_1, param_2);
  1497      Alloc param_3 = a;
  1498      CmdColorRef param_4 = CmdColorRef(ref.offset + 4u);
  1499      CmdColor param_5 = s;
  1500      CmdColor_write(param_3, param_4, param_5);
  1501  }
  1502  
  1503  AnnoImage AnnoImage_read(Alloc a, AnnoImageRef ref)
  1504  {
  1505      uint ix = ref.offset >> uint(2);
  1506      Alloc param = a;
  1507      uint param_1 = ix + 0u;
  1508      uint raw0 = read_mem(param, param_1);
  1509      Alloc param_2 = a;
  1510      uint param_3 = ix + 1u;
  1511      uint raw1 = read_mem(param_2, param_3);
  1512      Alloc param_4 = a;
  1513      uint param_5 = ix + 2u;
  1514      uint raw2 = read_mem(param_4, param_5);
  1515      Alloc param_6 = a;
  1516      uint param_7 = ix + 3u;
  1517      uint raw3 = read_mem(param_6, param_7);
  1518      Alloc param_8 = a;
  1519      uint param_9 = ix + 4u;
  1520      uint raw4 = read_mem(param_8, param_9);
  1521      Alloc param_10 = a;
  1522      uint param_11 = ix + 5u;
  1523      uint raw5 = read_mem(param_10, param_11);
  1524      Alloc param_12 = a;
  1525      uint param_13 = ix + 6u;
  1526      uint raw6 = read_mem(param_12, param_13);
  1527      AnnoImage s;
  1528      s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
  1529      s.linewidth = uintBitsToFloat(raw4);
  1530      s.index = raw5;
  1531      s.offset = ivec2(int(raw6 << uint(16)) >> 16, int(raw6) >> 16);
  1532      return s;
  1533  }
  1534  
  1535  AnnoImage Annotated_Image_read(Alloc a, AnnotatedRef ref)
  1536  {
  1537      Alloc param = a;
  1538      AnnoImageRef param_1 = AnnoImageRef(ref.offset + 4u);
  1539      return AnnoImage_read(param, param_1);
  1540  }
  1541  
  1542  void CmdImage_write(Alloc a, CmdImageRef ref, CmdImage s)
  1543  {
  1544      uint ix = ref.offset >> uint(2);
  1545      Alloc param = a;
  1546      uint param_1 = ix + 0u;
  1547      uint param_2 = s.index;
  1548      write_mem(param, param_1, param_2);
  1549      Alloc param_3 = a;
  1550      uint param_4 = ix + 1u;
  1551      uint param_5 = (uint(s.offset.x) & 65535u) | (uint(s.offset.y) << uint(16));
  1552      write_mem(param_3, param_4, param_5);
  1553  }
  1554  
  1555  void Cmd_Image_write(Alloc a, CmdRef ref, CmdImage s)
  1556  {
  1557      Alloc param = a;
  1558      uint param_1 = ref.offset >> uint(2);
  1559      uint param_2 = 6u;
  1560      write_mem(param, param_1, param_2);
  1561      Alloc param_3 = a;
  1562      CmdImageRef param_4 = CmdImageRef(ref.offset + 4u);
  1563      CmdImage param_5 = s;
  1564      CmdImage_write(param_3, param_4, param_5);
  1565  }
  1566  
  1567  AnnoBeginClip AnnoBeginClip_read(Alloc a, AnnoBeginClipRef ref)
  1568  {
  1569      uint ix = ref.offset >> uint(2);
  1570      Alloc param = a;
  1571      uint param_1 = ix + 0u;
  1572      uint raw0 = read_mem(param, param_1);
  1573      Alloc param_2 = a;
  1574      uint param_3 = ix + 1u;
  1575      uint raw1 = read_mem(param_2, param_3);
  1576      Alloc param_4 = a;
  1577      uint param_5 = ix + 2u;
  1578      uint raw2 = read_mem(param_4, param_5);
  1579      Alloc param_6 = a;
  1580      uint param_7 = ix + 3u;
  1581      uint raw3 = read_mem(param_6, param_7);
  1582      Alloc param_8 = a;
  1583      uint param_9 = ix + 4u;
  1584      uint raw4 = read_mem(param_8, param_9);
  1585      AnnoBeginClip s;
  1586      s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
  1587      s.linewidth = uintBitsToFloat(raw4);
  1588      return s;
  1589  }
  1590  
  1591  AnnoBeginClip Annotated_BeginClip_read(Alloc a, AnnotatedRef ref)
  1592  {
  1593      Alloc param = a;
  1594      AnnoBeginClipRef param_1 = AnnoBeginClipRef(ref.offset + 4u);
  1595      return AnnoBeginClip_read(param, param_1);
  1596  }
  1597  
  1598  void Cmd_BeginClip_write(Alloc a, CmdRef ref)
  1599  {
  1600      Alloc param = a;
  1601      uint param_1 = ref.offset >> uint(2);
  1602      uint param_2 = 7u;
  1603      write_mem(param, param_1, param_2);
  1604  }
  1605  
  1606  void Cmd_EndClip_write(Alloc a, CmdRef ref)
  1607  {
  1608      Alloc param = a;
  1609      uint param_1 = ref.offset >> uint(2);
  1610      uint param_2 = 8u;
  1611      write_mem(param, param_1, param_2);
  1612  }
  1613  
  1614  void Cmd_End_write(Alloc a, CmdRef ref)
  1615  {
  1616      Alloc param = a;
  1617      uint param_1 = ref.offset >> uint(2);
  1618      uint param_2 = 0u;
  1619      write_mem(param, param_1, param_2);
  1620  }
  1621  
  1622  void alloc_write(Alloc a, uint offset, Alloc alloc)
  1623  {
  1624      Alloc param = a;
  1625      uint param_1 = offset >> uint(2);
  1626      uint param_2 = alloc.offset;
  1627      write_mem(param, param_1, param_2);
  1628  }
  1629  
  1630  void main()
  1631  {
  1632      uint width_in_bins = ((_1066.conf.width_in_tiles + 16u) - 1u) / 16u;
  1633      uint bin_ix = (width_in_bins * gl_WorkGroupID.y) + gl_WorkGroupID.x;
  1634      uint partition_ix = 0u;
  1635      uint n_partitions = ((_1066.conf.n_elements + 128u) - 1u) / 128u;
  1636      uint th_ix = gl_LocalInvocationID.x;
  1637      uint bin_tile_x = 16u * gl_WorkGroupID.x;
  1638      uint bin_tile_y = 8u * gl_WorkGroupID.y;
  1639      uint tile_x = gl_LocalInvocationID.x % 16u;
  1640      uint tile_y = gl_LocalInvocationID.x / 16u;
  1641      uint this_tile_ix = (((bin_tile_y + tile_y) * _1066.conf.width_in_tiles) + bin_tile_x) + tile_x;
  1642      Alloc param;
  1643      param.offset = _1066.conf.ptcl_alloc.offset;
  1644      uint param_1 = this_tile_ix * 1024u;
  1645      uint param_2 = 1024u;
  1646      Alloc cmd_alloc = slice_mem(param, param_1, param_2);
  1647      CmdRef cmd_ref = CmdRef(cmd_alloc.offset);
  1648      uint cmd_limit = (cmd_ref.offset + 1024u) - 36u;
  1649      uint clip_depth = 0u;
  1650      uint clip_zero_depth = 0u;
  1651      uint clip_one_mask = 0u;
  1652      uint rd_ix = 0u;
  1653      uint wr_ix = 0u;
  1654      uint part_start_ix = 0u;
  1655      uint ready_ix = 0u;
  1656      Alloc param_3 = cmd_alloc;
  1657      uint param_4 = 0u;
  1658      uint param_5 = 8u;
  1659      Alloc scratch_alloc = slice_mem(param_3, param_4, param_5);
  1660      cmd_ref.offset += 8u;
  1661      uint num_begin_slots = 0u;
  1662      uint begin_slot = 0u;
  1663      bool mem_ok = _273.mem_error == 0u;
  1664      Alloc param_6;
  1665      Alloc param_8;
  1666      uint _1362;
  1667      uint element_ix;
  1668      AnnotatedRef ref;
  1669      Alloc param_17;
  1670      Alloc param_19;
  1671      uint tile_count;
  1672      Alloc param_26;
  1673      uint _1677;
  1674      Alloc param_32;
  1675      Tile tile_1;
  1676      Alloc param_38;
  1677      Alloc param_55;
  1678      Alloc param_72;
  1679      while (true)
  1680      {
  1681          for (uint i = 0u; i < 4u; i++)
  1682          {
  1683              sh_bitmaps[i][th_ix] = 0u;
  1684          }
  1685          bool _1414;
  1686          for (;;)
  1687          {
  1688              if ((ready_ix == wr_ix) && (partition_ix < n_partitions))
  1689              {
  1690                  part_start_ix = ready_ix;
  1691                  uint count = 0u;
  1692                  bool _1208 = th_ix < 128u;
  1693                  bool _1216;
  1694                  if (_1208)
  1695                  {
  1696                      _1216 = (partition_ix + th_ix) < n_partitions;
  1697                  }
  1698                  else
  1699                  {
  1700                      _1216 = _1208;
  1701                  }
  1702                  if (_1216)
  1703                  {
  1704                      uint in_ix = (_1066.conf.bin_alloc.offset >> uint(2)) + ((((partition_ix + th_ix) * 128u) + bin_ix) * 2u);
  1705                      param_6.offset = _1066.conf.bin_alloc.offset;
  1706                      uint param_7 = in_ix;
  1707                      count = read_mem(param_6, param_7);
  1708                      param_8.offset = _1066.conf.bin_alloc.offset;
  1709                      uint param_9 = in_ix + 1u;
  1710                      uint offset = read_mem(param_8, param_9);
  1711                      uint param_10 = offset;
  1712                      uint param_11 = count * 4u;
  1713                      bool param_12 = mem_ok;
  1714                      sh_part_elements[th_ix] = new_alloc(param_10, param_11, param_12);
  1715                  }
  1716                  for (uint i_1 = 0u; i_1 < 7u; i_1++)
  1717                  {
  1718                      if (th_ix < 128u)
  1719                      {
  1720                          sh_part_count[th_ix] = count;
  1721                      }
  1722                      barrier();
  1723                      if (th_ix < 128u)
  1724                      {
  1725                          if (th_ix >= uint(1 << int(i_1)))
  1726                          {
  1727                              count += sh_part_count[th_ix - uint(1 << int(i_1))];
  1728                          }
  1729                      }
  1730                      barrier();
  1731                  }
  1732                  if (th_ix < 128u)
  1733                  {
  1734                      sh_part_count[th_ix] = part_start_ix + count;
  1735                  }
  1736                  barrier();
  1737                  ready_ix = sh_part_count[127];
  1738                  partition_ix += 128u;
  1739              }
  1740              uint ix = rd_ix + th_ix;
  1741              if (((ix >= wr_ix) && (ix < ready_ix)) && mem_ok)
  1742              {
  1743                  uint part_ix = 0u;
  1744                  for (uint i_2 = 0u; i_2 < 7u; i_2++)
  1745                  {
  1746                      uint probe = part_ix + uint(64 >> int(i_2));
  1747                      if (ix >= sh_part_count[probe - 1u])
  1748                      {
  1749                          part_ix = probe;
  1750                      }
  1751                  }
  1752                  if (part_ix > 0u)
  1753                  {
  1754                      _1362 = sh_part_count[part_ix - 1u];
  1755                  }
  1756                  else
  1757                  {
  1758                      _1362 = part_start_ix;
  1759                  }
  1760                  ix -= _1362;
  1761                  Alloc bin_alloc = sh_part_elements[part_ix];
  1762                  BinInstanceRef inst_ref = BinInstanceRef(bin_alloc.offset);
  1763                  BinInstanceRef param_13 = inst_ref;
  1764                  uint param_14 = ix;
  1765                  Alloc param_15 = bin_alloc;
  1766                  BinInstanceRef param_16 = BinInstance_index(param_13, param_14);
  1767                  BinInstance inst = BinInstance_read(param_15, param_16);
  1768                  sh_elements[th_ix] = inst.element_ix;
  1769              }
  1770              barrier();
  1771              wr_ix = min((rd_ix + 128u), ready_ix);
  1772              bool _1404 = (wr_ix - rd_ix) < 128u;
  1773              if (_1404)
  1774              {
  1775                  _1414 = (wr_ix < ready_ix) || (partition_ix < n_partitions);
  1776              }
  1777              else
  1778              {
  1779                  _1414 = _1404;
  1780              }
  1781              if (_1414)
  1782              {
  1783                  continue;
  1784              }
  1785              else
  1786              {
  1787                  break;
  1788              }
  1789          }
  1790          uint tag = 0u;
  1791          if ((th_ix + rd_ix) < wr_ix)
  1792          {
  1793              element_ix = sh_elements[th_ix];
  1794              ref = AnnotatedRef(_1066.conf.anno_alloc.offset + (element_ix * 32u));
  1795              param_17.offset = _1066.conf.anno_alloc.offset;
  1796              AnnotatedRef param_18 = ref;
  1797              tag = Annotated_tag(param_17, param_18).tag;
  1798          }
  1799          switch (tag)
  1800          {
  1801              case 1u:
  1802              case 2u:
  1803              case 3u:
  1804              case 4u:
  1805              {
  1806                  uint path_ix = element_ix;
  1807                  param_19.offset = _1066.conf.tile_alloc.offset;
  1808                  PathRef param_20 = PathRef(_1066.conf.tile_alloc.offset + (path_ix * 12u));
  1809                  Path path = Path_read(param_19, param_20);
  1810                  uint stride = path.bbox.z - path.bbox.x;
  1811                  sh_tile_stride[th_ix] = stride;
  1812                  int dx = int(path.bbox.x) - int(bin_tile_x);
  1813                  int dy = int(path.bbox.y) - int(bin_tile_y);
  1814                  int x0 = clamp(dx, 0, 16);
  1815                  int y0 = clamp(dy, 0, 8);
  1816                  int x1 = clamp(int(path.bbox.z) - int(bin_tile_x), 0, 16);
  1817                  int y1 = clamp(int(path.bbox.w) - int(bin_tile_y), 0, 8);
  1818                  sh_tile_width[th_ix] = uint(x1 - x0);
  1819                  sh_tile_x0[th_ix] = uint(x0);
  1820                  sh_tile_y0[th_ix] = uint(y0);
  1821                  tile_count = uint(x1 - x0) * uint(y1 - y0);
  1822                  uint base = path.tiles.offset - (((uint(dy) * stride) + uint(dx)) * 8u);
  1823                  sh_tile_base[th_ix] = base;
  1824                  uint param_21 = path.tiles.offset;
  1825                  uint param_22 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u;
  1826                  bool param_23 = mem_ok;
  1827                  Alloc path_alloc = new_alloc(param_21, param_22, param_23);
  1828                  uint param_24 = th_ix;
  1829                  Alloc param_25 = path_alloc;
  1830                  write_tile_alloc(param_24, param_25);
  1831                  break;
  1832              }
  1833              default:
  1834              {
  1835                  tile_count = 0u;
  1836                  break;
  1837              }
  1838          }
  1839          sh_tile_count[th_ix] = tile_count;
  1840          for (uint i_3 = 0u; i_3 < 7u; i_3++)
  1841          {
  1842              barrier();
  1843              if (th_ix >= uint(1 << int(i_3)))
  1844              {
  1845                  tile_count += sh_tile_count[th_ix - uint(1 << int(i_3))];
  1846              }
  1847              barrier();
  1848              sh_tile_count[th_ix] = tile_count;
  1849          }
  1850          barrier();
  1851          uint total_tile_count = sh_tile_count[127];
  1852          for (uint ix_1 = th_ix; ix_1 < total_tile_count; ix_1 += 128u)
  1853          {
  1854              uint el_ix = 0u;
  1855              for (uint i_4 = 0u; i_4 < 7u; i_4++)
  1856              {
  1857                  uint probe_1 = el_ix + uint(64 >> int(i_4));
  1858                  if (ix_1 >= sh_tile_count[probe_1 - 1u])
  1859                  {
  1860                      el_ix = probe_1;
  1861                  }
  1862              }
  1863              AnnotatedRef ref_1 = AnnotatedRef(_1066.conf.anno_alloc.offset + (sh_elements[el_ix] * 32u));
  1864              param_26.offset = _1066.conf.anno_alloc.offset;
  1865              AnnotatedRef param_27 = ref_1;
  1866              uint tag_1 = Annotated_tag(param_26, param_27).tag;
  1867              if (el_ix > 0u)
  1868              {
  1869                  _1677 = sh_tile_count[el_ix - 1u];
  1870              }
  1871              else
  1872              {
  1873                  _1677 = 0u;
  1874              }
  1875              uint seq_ix = ix_1 - _1677;
  1876              uint width = sh_tile_width[el_ix];
  1877              uint x = sh_tile_x0[el_ix] + (seq_ix % width);
  1878              uint y = sh_tile_y0[el_ix] + (seq_ix / width);
  1879              bool include_tile = false;
  1880              if ((tag_1 == 3u) || (tag_1 == 4u))
  1881              {
  1882                  include_tile = true;
  1883              }
  1884              else
  1885              {
  1886                  if (mem_ok)
  1887                  {
  1888                      uint param_28 = el_ix;
  1889                      bool param_29 = mem_ok;
  1890                      Alloc param_30 = read_tile_alloc(param_28, param_29);
  1891                      TileRef param_31 = TileRef(sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u));
  1892                      Tile tile = Tile_read(param_30, param_31);
  1893                      bool _1743 = tile.tile.offset != 0u;
  1894                      bool _1750;
  1895                      if (!_1743)
  1896                      {
  1897                          _1750 = tile.backdrop != 0;
  1898                      }
  1899                      else
  1900                      {
  1901                          _1750 = _1743;
  1902                      }
  1903                      include_tile = _1750;
  1904                  }
  1905              }
  1906              if (include_tile)
  1907              {
  1908                  uint el_slice = el_ix / 32u;
  1909                  uint el_mask = uint(1 << int(el_ix & 31u));
  1910                  uint _1770 = atomicOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask);
  1911              }
  1912          }
  1913          barrier();
  1914          uint slice_ix = 0u;
  1915          uint bitmap = sh_bitmaps[0][th_ix];
  1916          while (mem_ok)
  1917          {
  1918              if (bitmap == 0u)
  1919              {
  1920                  slice_ix++;
  1921                  if (slice_ix == 4u)
  1922                  {
  1923                      break;
  1924                  }
  1925                  bitmap = sh_bitmaps[slice_ix][th_ix];
  1926                  if (bitmap == 0u)
  1927                  {
  1928                      continue;
  1929                  }
  1930              }
  1931              uint element_ref_ix = (slice_ix * 32u) + uint(findLSB(bitmap));
  1932              uint element_ix_1 = sh_elements[element_ref_ix];
  1933              bitmap &= (bitmap - 1u);
  1934              ref = AnnotatedRef(_1066.conf.anno_alloc.offset + (element_ix_1 * 32u));
  1935              param_32.offset = _1066.conf.anno_alloc.offset;
  1936              AnnotatedRef param_33 = ref;
  1937              AnnotatedTag tag_2 = Annotated_tag(param_32, param_33);
  1938              if (clip_zero_depth == 0u)
  1939              {
  1940                  switch (tag_2.tag)
  1941                  {
  1942                      case 1u:
  1943                      {
  1944                          uint param_34 = element_ref_ix;
  1945                          bool param_35 = mem_ok;
  1946                          Alloc param_36 = read_tile_alloc(param_34, param_35);
  1947                          TileRef param_37 = TileRef(sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u));
  1948                          tile_1 = Tile_read(param_36, param_37);
  1949                          param_38.offset = _1066.conf.anno_alloc.offset;
  1950                          AnnotatedRef param_39 = ref;
  1951                          AnnoColor fill = Annotated_Color_read(param_38, param_39);
  1952                          Alloc param_40 = cmd_alloc;
  1953                          CmdRef param_41 = cmd_ref;
  1954                          uint param_42 = cmd_limit;
  1955                          bool _1883 = alloc_cmd(param_40, param_41, param_42);
  1956                          cmd_alloc = param_40;
  1957                          cmd_ref = param_41;
  1958                          cmd_limit = param_42;
  1959                          if (!_1883)
  1960                          {
  1961                              break;
  1962                          }
  1963                          Alloc param_43 = cmd_alloc;
  1964                          CmdRef param_44 = cmd_ref;
  1965                          uint param_45 = tag_2.flags;
  1966                          Tile param_46 = tile_1;
  1967                          float param_47 = fill.linewidth;
  1968                          write_fill(param_43, param_44, param_45, param_46, param_47);
  1969                          cmd_ref = param_44;
  1970                          Alloc param_48 = cmd_alloc;
  1971                          CmdRef param_49 = cmd_ref;
  1972                          CmdColor param_50 = CmdColor(fill.rgba_color);
  1973                          Cmd_Color_write(param_48, param_49, param_50);
  1974                          cmd_ref.offset += 8u;
  1975                          break;
  1976                      }
  1977                      case 2u:
  1978                      {
  1979                          uint param_51 = element_ref_ix;
  1980                          bool param_52 = mem_ok;
  1981                          Alloc param_53 = read_tile_alloc(param_51, param_52);
  1982                          TileRef param_54 = TileRef(sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u));
  1983                          tile_1 = Tile_read(param_53, param_54);
  1984                          param_55.offset = _1066.conf.anno_alloc.offset;
  1985                          AnnotatedRef param_56 = ref;
  1986                          AnnoImage fill_img = Annotated_Image_read(param_55, param_56);
  1987                          Alloc param_57 = cmd_alloc;
  1988                          CmdRef param_58 = cmd_ref;
  1989                          uint param_59 = cmd_limit;
  1990                          bool _1955 = alloc_cmd(param_57, param_58, param_59);
  1991                          cmd_alloc = param_57;
  1992                          cmd_ref = param_58;
  1993                          cmd_limit = param_59;
  1994                          if (!_1955)
  1995                          {
  1996                              break;
  1997                          }
  1998                          Alloc param_60 = cmd_alloc;
  1999                          CmdRef param_61 = cmd_ref;
  2000                          uint param_62 = tag_2.flags;
  2001                          Tile param_63 = tile_1;
  2002                          float param_64 = fill_img.linewidth;
  2003                          write_fill(param_60, param_61, param_62, param_63, param_64);
  2004                          cmd_ref = param_61;
  2005                          Alloc param_65 = cmd_alloc;
  2006                          CmdRef param_66 = cmd_ref;
  2007                          CmdImage param_67 = CmdImage(fill_img.index, fill_img.offset);
  2008                          Cmd_Image_write(param_65, param_66, param_67);
  2009                          cmd_ref.offset += 12u;
  2010                          break;
  2011                      }
  2012                      case 3u:
  2013                      {
  2014                          uint param_68 = element_ref_ix;
  2015                          bool param_69 = mem_ok;
  2016                          Alloc param_70 = read_tile_alloc(param_68, param_69);
  2017                          TileRef param_71 = TileRef(sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u));
  2018                          tile_1 = Tile_read(param_70, param_71);
  2019                          bool _2016 = tile_1.tile.offset == 0u;
  2020                          bool _2022;
  2021                          if (_2016)
  2022                          {
  2023                              _2022 = tile_1.backdrop == 0;
  2024                          }
  2025                          else
  2026                          {
  2027                              _2022 = _2016;
  2028                          }
  2029                          if (_2022)
  2030                          {
  2031                              clip_zero_depth = clip_depth + 1u;
  2032                          }
  2033                          else
  2034                          {
  2035                              if ((tile_1.tile.offset == 0u) && (clip_depth < 32u))
  2036                              {
  2037                                  clip_one_mask |= uint(1 << int(clip_depth));
  2038                              }
  2039                              else
  2040                              {
  2041                                  param_72.offset = _1066.conf.anno_alloc.offset;
  2042                                  AnnotatedRef param_73 = ref;
  2043                                  AnnoBeginClip begin_clip = Annotated_BeginClip_read(param_72, param_73);
  2044                                  Alloc param_74 = cmd_alloc;
  2045                                  CmdRef param_75 = cmd_ref;
  2046                                  uint param_76 = cmd_limit;
  2047                                  bool _2057 = alloc_cmd(param_74, param_75, param_76);
  2048                                  cmd_alloc = param_74;
  2049                                  cmd_ref = param_75;
  2050                                  cmd_limit = param_76;
  2051                                  if (!_2057)
  2052                                  {
  2053                                      break;
  2054                                  }
  2055                                  Alloc param_77 = cmd_alloc;
  2056                                  CmdRef param_78 = cmd_ref;
  2057                                  uint param_79 = tag_2.flags;
  2058                                  Tile param_80 = tile_1;
  2059                                  float param_81 = begin_clip.linewidth;
  2060                                  write_fill(param_77, param_78, param_79, param_80, param_81);
  2061                                  cmd_ref = param_78;
  2062                                  Alloc param_82 = cmd_alloc;
  2063                                  CmdRef param_83 = cmd_ref;
  2064                                  Cmd_BeginClip_write(param_82, param_83);
  2065                                  cmd_ref.offset += 4u;
  2066                                  if (clip_depth < 32u)
  2067                                  {
  2068                                      clip_one_mask &= uint(~(1 << int(clip_depth)));
  2069                                  }
  2070                                  begin_slot++;
  2071                                  num_begin_slots = max(num_begin_slots, begin_slot);
  2072                              }
  2073                          }
  2074                          clip_depth++;
  2075                          break;
  2076                      }
  2077                      case 4u:
  2078                      {
  2079                          clip_depth--;
  2080                          bool _2109 = clip_depth >= 32u;
  2081                          bool _2119;
  2082                          if (!_2109)
  2083                          {
  2084                              _2119 = (clip_one_mask & uint(1 << int(clip_depth))) == 0u;
  2085                          }
  2086                          else
  2087                          {
  2088                              _2119 = _2109;
  2089                          }
  2090                          if (_2119)
  2091                          {
  2092                              Alloc param_84 = cmd_alloc;
  2093                              CmdRef param_85 = cmd_ref;
  2094                              uint param_86 = cmd_limit;
  2095                              bool _2128 = alloc_cmd(param_84, param_85, param_86);
  2096                              cmd_alloc = param_84;
  2097                              cmd_ref = param_85;
  2098                              cmd_limit = param_86;
  2099                              if (!_2128)
  2100                              {
  2101                                  break;
  2102                              }
  2103                              Alloc param_87 = cmd_alloc;
  2104                              CmdRef param_88 = cmd_ref;
  2105                              Cmd_Solid_write(param_87, param_88);
  2106                              cmd_ref.offset += 4u;
  2107                              begin_slot--;
  2108                              Alloc param_89 = cmd_alloc;
  2109                              CmdRef param_90 = cmd_ref;
  2110                              Cmd_EndClip_write(param_89, param_90);
  2111                              cmd_ref.offset += 4u;
  2112                          }
  2113                          break;
  2114                      }
  2115                  }
  2116              }
  2117              else
  2118              {
  2119                  switch (tag_2.tag)
  2120                  {
  2121                      case 3u:
  2122                      {
  2123                          clip_depth++;
  2124                          break;
  2125                      }
  2126                      case 4u:
  2127                      {
  2128                          if (clip_depth == clip_zero_depth)
  2129                          {
  2130                              clip_zero_depth = 0u;
  2131                          }
  2132                          clip_depth--;
  2133                          break;
  2134                      }
  2135                  }
  2136              }
  2137          }
  2138          barrier();
  2139          rd_ix += 128u;
  2140          if ((rd_ix >= ready_ix) && (partition_ix >= n_partitions))
  2141          {
  2142              break;
  2143          }
  2144      }
  2145      bool _2193 = (bin_tile_x + tile_x) < _1066.conf.width_in_tiles;
  2146      bool _2202;
  2147      if (_2193)
  2148      {
  2149          _2202 = (bin_tile_y + tile_y) < _1066.conf.height_in_tiles;
  2150      }
  2151      else
  2152      {
  2153          _2202 = _2193;
  2154      }
  2155      if (_2202)
  2156      {
  2157          Alloc param_91 = cmd_alloc;
  2158          CmdRef param_92 = cmd_ref;
  2159          Cmd_End_write(param_91, param_92);
  2160          if (num_begin_slots > 0u)
  2161          {
  2162              uint scratch_size = (((num_begin_slots * 32u) * 32u) * 2u) * 4u;
  2163              uint param_93 = scratch_size;
  2164              MallocResult _2223 = malloc(param_93);
  2165              MallocResult scratch = _2223;
  2166              Alloc param_94 = scratch_alloc;
  2167              uint param_95 = scratch_alloc.offset;
  2168              Alloc param_96 = scratch.alloc;
  2169              alloc_write(param_94, param_95, param_96);
  2170          }
  2171      }
  2172  }
  2173  
  2174  `,
  2175  	}
  2176  	shader_copy_frag = driver.ShaderSources{
  2177  		Name:     "copy.frag",
  2178  		Textures: []driver.TextureBinding{{Name: "tex", Binding: 0}},
  2179  		GLSL300ES: `#version 300 es
  2180  precision mediump float;
  2181  precision highp int;
  2182  
  2183  uniform mediump sampler2D tex;
  2184  
  2185  layout(location = 0) out highp vec4 fragColor;
  2186  
  2187  vec3 sRGBtoRGB(vec3 rgb)
  2188  {
  2189      bvec3 cutoff = greaterThanEqual(rgb, vec3(0.040449999272823333740234375));
  2190      vec3 below = rgb / vec3(12.9200000762939453125);
  2191      vec3 above = pow((rgb + vec3(0.054999999701976776123046875)) / vec3(1.05499994754791259765625), vec3(2.400000095367431640625));
  2192      return vec3(cutoff.x ? above.x : below.x, cutoff.y ? above.y : below.y, cutoff.z ? above.z : below.z);
  2193  }
  2194  
  2195  void main()
  2196  {
  2197      vec4 texel = texelFetch(tex, ivec2(gl_FragCoord.xy), 0);
  2198      vec3 param = texel.xyz;
  2199      vec3 rgb = sRGBtoRGB(param);
  2200      fragColor = vec4(rgb, texel.w);
  2201  }
  2202  
  2203  `,
  2204  		GLSL130: `#version 130
  2205  
  2206  uniform sampler2D tex;
  2207  
  2208  out vec4 fragColor;
  2209  
  2210  vec3 sRGBtoRGB(vec3 rgb)
  2211  {
  2212      bvec3 cutoff = greaterThanEqual(rgb, vec3(0.040449999272823333740234375));
  2213      vec3 below = rgb / vec3(12.9200000762939453125);
  2214      vec3 above = pow((rgb + vec3(0.054999999701976776123046875)) / vec3(1.05499994754791259765625), vec3(2.400000095367431640625));
  2215      return vec3(cutoff.x ? above.x : below.x, cutoff.y ? above.y : below.y, cutoff.z ? above.z : below.z);
  2216  }
  2217  
  2218  void main()
  2219  {
  2220      vec4 texel = texelFetch(tex, ivec2(gl_FragCoord.xy), 0);
  2221      vec3 param = texel.xyz;
  2222      vec3 rgb = sRGBtoRGB(param);
  2223      fragColor = vec4(rgb, texel.w);
  2224  }
  2225  
  2226  `,
  2227  		GLSL150: `#version 150
  2228  
  2229  uniform sampler2D tex;
  2230  
  2231  out vec4 fragColor;
  2232  
  2233  vec3 sRGBtoRGB(vec3 rgb)
  2234  {
  2235      bvec3 cutoff = greaterThanEqual(rgb, vec3(0.040449999272823333740234375));
  2236      vec3 below = rgb / vec3(12.9200000762939453125);
  2237      vec3 above = pow((rgb + vec3(0.054999999701976776123046875)) / vec3(1.05499994754791259765625), vec3(2.400000095367431640625));
  2238      return vec3(cutoff.x ? above.x : below.x, cutoff.y ? above.y : below.y, cutoff.z ? above.z : below.z);
  2239  }
  2240  
  2241  void main()
  2242  {
  2243      vec4 texel = texelFetch(tex, ivec2(gl_FragCoord.xy), 0);
  2244      vec3 param = texel.xyz;
  2245      vec3 rgb = sRGBtoRGB(param);
  2246      fragColor = vec4(rgb, texel.w);
  2247  }
  2248  
  2249  `,
  2250  		HLSL: "DXBC\xe6\x89_t\x8b\xfc\xea8\xd9'\xad5.Èk\x01\x00\x00\x00H\x03\x00\x00\x05\x00\x00\x004\x00\x00\x00\xa4\x00\x00\x00\xd8\x00\x00\x00\f\x01\x00\x00\xcc\x02\x00\x00RDEFh\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xff\xff\x00\x01\x00\x00@\x00\x00\x00<\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x01\x00\x00\x00\r\x00\x00\x00tex\x00Microsoft (R) HLSL Shader Compiler 10.1\x00ISGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x03\x00\x00SV_Position\x00OSGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00SV_Target\x00\xab\xabSHDR\xb8\x01\x00\x00@\x00\x00\x00n\x00\x00\x00X\x18\x00\x04\x00p\x10\x00\x00\x00\x00\x00UU\x00\x00d \x00\x042\x10\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00e\x00\x00\x03\xf2 \x10\x00\x00\x00\x00\x00h\x00\x00\x02\x03\x00\x00\x00\x1b\x00\x00\x052\x00\x10\x00\x00\x00\x00\x00F\x10\x10\x00\x00\x00\x00\x006\x00\x00\b\xc2\x00\x10\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00-\x00\x00\a\xf2\x00\x10\x00\x00\x00\x00\x00F\x0e\x10\x00\x00\x00\x00\x00F~\x10\x00\x00\x00\x00\x00\x00\x00\x00\nr\x00\x10\x00\x01\x00\x00\x00F\x02\x10\x00\x00\x00\x00\x00\x02@\x00\x00\xaeGa=\xaeGa=\xaeGa=\x00\x00\x00\x008\x00\x00\nr\x00\x10\x00\x01\x00\x00\x00F\x02\x10\x00\x01\x00\x00\x00\x02@\x00\x00o\xa7r?o\xa7r?o\xa7r?\x00\x00\x00\x00/\x00\x00\x05r\x00\x10\x00\x01\x00\x00\x00F\x02\x10\x00\x01\x00\x00\x008\x00\x00\nr\x00\x10\x00\x01\x00\x00\x00F\x02\x10\x00\x01\x00\x00\x00\x02@\x00\x00\x9a\x99\x19@\x9a\x99\x19@\x9a\x99\x19@\x00\x00\x00\x00\x19\x00\x00\x05r\x00\x10\x00\x01\x00\x00\x00F\x02\x10\x00\x01\x00\x00\x00\x1d\x00\x00\nr\x00\x10\x00\x02\x00\x00\x00F\x02\x10\x00\x00\x00\x00\x00\x02@\x00\x00\xe6\xae%=\xe6\xae%=\xe6\xae%=\x00\x00\x00\x008\x00\x00\nr\x00\x10\x00\x00\x00\x00\x00F\x02\x10\x00\x00\x00\x00\x00\x02@\x00\x00\x91\x83\x9e=\x91\x83\x9e=\x91\x83\x9e=\x00\x00\x00\x006\x00\x00\x05\x82 \x10\x00\x00\x00\x00\x00:\x00\x10\x00\x00\x00\x00\x007\x00\x00\tr \x10\x00\x00\x00\x00\x00F\x02\x10\x00\x02\x00\x00\x00F\x02\x10\x00\x01\x00\x00\x00F\x02\x10\x00\x00\x00\x00\x00>\x00\x00\x01STATt\x00\x00\x00\r\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
  2251  	}
  2252  	shader_copy_vert = driver.ShaderSources{
  2253  		Name: "copy.vert",
  2254  		GLSL100ES: `#version 100
  2255  
  2256  void main()
  2257  {
  2258      for (int spvDummy6 = 0; spvDummy6 < 1; spvDummy6++)
  2259      {
  2260          if (gl_VertexID == 0)
  2261          {
  2262              gl_Position = vec4(-1.0, 1.0, 0.0, 1.0);
  2263              break;
  2264          }
  2265          else if (gl_VertexID == 1)
  2266          {
  2267              gl_Position = vec4(1.0, 1.0, 0.0, 1.0);
  2268              break;
  2269          }
  2270          else if (gl_VertexID == 2)
  2271          {
  2272              gl_Position = vec4(-1.0, -1.0, 0.0, 1.0);
  2273              break;
  2274          }
  2275          else if (gl_VertexID == 3)
  2276          {
  2277              gl_Position = vec4(1.0, -1.0, 0.0, 1.0);
  2278              break;
  2279          }
  2280      }
  2281  }
  2282  
  2283  `,
  2284  		GLSL300ES: `#version 300 es
  2285  
  2286  void main()
  2287  {
  2288      switch (gl_VertexID)
  2289      {
  2290          case 0:
  2291          {
  2292              gl_Position = vec4(-1.0, 1.0, 0.0, 1.0);
  2293              break;
  2294          }
  2295          case 1:
  2296          {
  2297              gl_Position = vec4(1.0, 1.0, 0.0, 1.0);
  2298              break;
  2299          }
  2300          case 2:
  2301          {
  2302              gl_Position = vec4(-1.0, -1.0, 0.0, 1.0);
  2303              break;
  2304          }
  2305          case 3:
  2306          {
  2307              gl_Position = vec4(1.0, -1.0, 0.0, 1.0);
  2308              break;
  2309          }
  2310      }
  2311  }
  2312  
  2313  `,
  2314  		GLSL130: `#version 130
  2315  
  2316  void main()
  2317  {
  2318      switch (gl_VertexID)
  2319      {
  2320          case 0:
  2321          {
  2322              gl_Position = vec4(-1.0, 1.0, 0.0, 1.0);
  2323              break;
  2324          }
  2325          case 1:
  2326          {
  2327              gl_Position = vec4(1.0, 1.0, 0.0, 1.0);
  2328              break;
  2329          }
  2330          case 2:
  2331          {
  2332              gl_Position = vec4(-1.0, -1.0, 0.0, 1.0);
  2333              break;
  2334          }
  2335          case 3:
  2336          {
  2337              gl_Position = vec4(1.0, -1.0, 0.0, 1.0);
  2338              break;
  2339          }
  2340      }
  2341  }
  2342  
  2343  `,
  2344  		GLSL150: `#version 150
  2345  
  2346  void main()
  2347  {
  2348      switch (gl_VertexID)
  2349      {
  2350          case 0:
  2351          {
  2352              gl_Position = vec4(-1.0, 1.0, 0.0, 1.0);
  2353              break;
  2354          }
  2355          case 1:
  2356          {
  2357              gl_Position = vec4(1.0, 1.0, 0.0, 1.0);
  2358              break;
  2359          }
  2360          case 2:
  2361          {
  2362              gl_Position = vec4(-1.0, -1.0, 0.0, 1.0);
  2363              break;
  2364          }
  2365          case 3:
  2366          {
  2367              gl_Position = vec4(1.0, -1.0, 0.0, 1.0);
  2368              break;
  2369          }
  2370      }
  2371  }
  2372  
  2373  `,
  2374  		HLSL: "DXBC\x99\xb4[\xef]IX\xa2Qh\x9f\xb6!\x1cR\xe7\x01\x00\x00\x00\xc0\x02\x00\x00\x05\x00\x00\x004\x00\x00\x00\x80\x00\x00\x00\xb4\x00\x00\x00\xe8\x00\x00\x00D\x02\x00\x00RDEFD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xfe\xff\x00\x01\x00\x00\x1c\x00\x00\x00Microsoft (R) HLSL Shader Compiler 10.1\x00ISGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00SV_VertexID\x00OSGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00SV_Position\x00SHDRT\x01\x00\x00@\x00\x01\x00U\x00\x00\x00`\x00\x00\x04\x12\x10\x10\x00\x00\x00\x00\x00\x06\x00\x00\x00g\x00\x00\x04\xf2 \x10\x00\x00\x00\x00\x00\x01\x00\x00\x00h\x00\x00\x02\x01\x00\x00\x00L\x00\x00\x03\n\x10\x10\x00\x00\x00\x00\x00\x06\x00\x00\x03\x01@\x00\x00\x00\x00\x00\x006\x00\x00\br\x00\x10\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x80\xbf\x00\x00\x80?\x00\x00\x80?\x00\x00\x00\x00\x02\x00\x00\x01\x06\x00\x00\x03\x01@\x00\x00\x01\x00\x00\x006\x00\x00\br\x00\x10\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x80?\x00\x00\x80?\x00\x00\x80?\x00\x00\x00\x00\x02\x00\x00\x01\x06\x00\x00\x03\x01@\x00\x00\x02\x00\x00\x006\x00\x00\br\x00\x10\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x80\xbf\x00\x00\x80\xbf\x00\x00\x80?\x00\x00\x00\x00\x02\x00\x00\x01\x06\x00\x00\x03\x01@\x00\x00\x03\x00\x00\x006\x00\x00\br\x00\x10\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x80?\x00\x00\x80\xbf\x00\x00\x80?\x00\x00\x00\x00\x02\x00\x00\x01\n\x00\x00\x016\x00\x00\br\x00\x10\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x01\x17\x00\x00\x016\x00\x00\x05\xb2 \x10\x00\x00\x00\x00\x00F\b\x10\x00\x00\x00\x00\x006\x00\x00\x05B \x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x00\x00>\x00\x00\x01STATt\x00\x00\x00\x14\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
  2375  	}
  2376  	shader_cover_frag = [...]driver.ShaderSources{
  2377  		{
  2378  			Name:   "cover.frag",
  2379  			Inputs: []driver.InputLocation{{Name: "vCoverUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "vUV", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}},
  2380  			Uniforms: driver.UniformsReflection{
  2381  				Blocks:    []driver.UniformBlock{{Name: "Color", Binding: 0}},
  2382  				Locations: []driver.UniformLocation{{Name: "_color.color", Type: 0x0, Size: 4, Offset: 0}},
  2383  				Size:      16,
  2384  			},
  2385  			Textures: []driver.TextureBinding{{Name: "cover", Binding: 1}},
  2386  			GLSL100ES: `#version 100
  2387  precision mediump float;
  2388  precision highp int;
  2389  
  2390  struct Color
  2391  {
  2392      vec4 color;
  2393  };
  2394  
  2395  uniform Color _color;
  2396  
  2397  uniform mediump sampler2D cover;
  2398  
  2399  varying highp vec2 vCoverUV;
  2400  varying vec2 vUV;
  2401  
  2402  void main()
  2403  {
  2404      gl_FragData[0] = _color.color;
  2405      float cover_1 = min(abs(texture2D(cover, vCoverUV).x), 1.0);
  2406      gl_FragData[0] *= cover_1;
  2407  }
  2408  
  2409  `,
  2410  			GLSL300ES: `#version 300 es
  2411  precision mediump float;
  2412  precision highp int;
  2413  
  2414  layout(std140) uniform Color
  2415  {
  2416      vec4 color;
  2417  } _color;
  2418  
  2419  uniform mediump sampler2D cover;
  2420  
  2421  layout(location = 0) out vec4 fragColor;
  2422  in highp vec2 vCoverUV;
  2423  in vec2 vUV;
  2424  
  2425  void main()
  2426  {
  2427      fragColor = _color.color;
  2428      float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);
  2429      fragColor *= cover_1;
  2430  }
  2431  
  2432  `,
  2433  			GLSL130: `#version 130
  2434  
  2435  struct Color
  2436  {
  2437      vec4 color;
  2438  };
  2439  
  2440  uniform Color _color;
  2441  
  2442  uniform sampler2D cover;
  2443  
  2444  out vec4 fragColor;
  2445  in vec2 vCoverUV;
  2446  in vec2 vUV;
  2447  
  2448  void main()
  2449  {
  2450      fragColor = _color.color;
  2451      float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);
  2452      fragColor *= cover_1;
  2453  }
  2454  
  2455  `,
  2456  			GLSL150: `#version 150
  2457  
  2458  layout(std140) uniform Color
  2459  {
  2460      vec4 color;
  2461  } _color;
  2462  
  2463  uniform sampler2D cover;
  2464  
  2465  out vec4 fragColor;
  2466  in vec2 vCoverUV;
  2467  in vec2 vUV;
  2468  
  2469  void main()
  2470  {
  2471      fragColor = _color.color;
  2472      float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);
  2473      fragColor *= cover_1;
  2474  }
  2475  
  2476  `,
  2477  			HLSL: "DXBC\x88\x01{\x0f\x94\xca3\xeb\xab߸\xa1\xbfL1\xbf\x01\x00\x00\x00\xa4\x03\x00\x00\x06\x00\x00\x008\x00\x00\x00\xcc\x00\x00\x00\x90\x01\x00\x00\f\x02\x00\x00$\x03\x00\x00p\x03\x00\x00Aon9\x8c\x00\x00\x00\x8c\x00\x00\x00\x00\x02\xff\xffX\x00\x00\x004\x00\x00\x00\x01\x00(\x00\x00\x004\x00\x00\x004\x00\x01\x00$\x00\x00\x004\x00\x01\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x02\xff\xff\x1f\x00\x00\x02\x00\x00\x00\x80\x00\x00\x0f\xb0\x1f\x00\x00\x02\x00\x00\x00\x90\x00\b\x0f\xa0B\x00\x00\x03\x00\x00\x0f\x80\x00\x00\xe4\xb0\x00\b\xe4\xa0#\x00\x00\x02\x00\x00\x11\x80\x00\x00\x00\x80\x05\x00\x00\x03\x00\x00\x0f\x80\x00\x00\x00\x80\x00\x00\xe4\xa0\x01\x00\x00\x02\x00\b\x0f\x80\x00\x00\xe4\x80\xff\xff\x00\x00SHDR\xbc\x00\x00\x00@\x00\x00\x00/\x00\x00\x00Y\x00\x00\x04F\x8e \x00\x00\x00\x00\x00\x01\x00\x00\x00Z\x00\x00\x03\x00`\x10\x00\x01\x00\x00\x00X\x18\x00\x04\x00p\x10\x00\x01\x00\x00\x00UU\x00\x00b\x10\x00\x032\x10\x10\x00\x00\x00\x00\x00e\x00\x00\x03\xf2 \x10\x00\x00\x00\x00\x00h\x00\x00\x02\x01\x00\x00\x00E\x00\x00\t\xf2\x00\x10\x00\x00\x00\x00\x00F\x10\x10\x00\x00\x00\x00\x00F~\x10\x00\x01\x00\x00\x00\x00`\x10\x00\x01\x00\x00\x003\x00\x00\b\x12\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x80\x81\x00\x00\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x80?8\x00\x00\b\xf2 \x10\x00\x00\x00\x00\x00\x06\x00\x10\x00\x00\x00\x00\x00F\x8e \x00\x00\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x01STATt\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEF\x10\x01\x00\x00\x01\x00\x00\x00\x98\x00\x00\x00\x03\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xff\xff\x00\x01\x00\x00\xe8\x00\x00\x00|\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x8b\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\x01\x00\x00\x00\x01\x00\x00\x00\r\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00_cover_sampler\x00cover\x00Color\x00\xab\x91\x00\x00\x00\x01\x00\x00\x00\xb0\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00_color_color\x00\xab\xab\xab\x01\x00\x03\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00Microsoft (R) HLSL Shader Compiler 10.1\x00ISGND\x00\x00\x00\x02\x00\x00\x00\b\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x008\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00TEXCOORD\x00\xab\xab\xabOSGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00SV_Target\x00\xab\xab",
  2478  		},
  2479  		{
  2480  			Name:   "cover.frag",
  2481  			Inputs: []driver.InputLocation{{Name: "vCoverUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "vUV", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}},
  2482  			Uniforms: driver.UniformsReflection{
  2483  				Blocks:    []driver.UniformBlock{{Name: "Gradient", Binding: 0}},
  2484  				Locations: []driver.UniformLocation{{Name: "_gradient.color1", Type: 0x0, Size: 4, Offset: 0}, {Name: "_gradient.color2", Type: 0x0, Size: 4, Offset: 16}},
  2485  				Size:      32,
  2486  			},
  2487  			Textures: []driver.TextureBinding{{Name: "cover", Binding: 1}},
  2488  			GLSL100ES: `#version 100
  2489  precision mediump float;
  2490  precision highp int;
  2491  
  2492  struct Gradient
  2493  {
  2494      vec4 color1;
  2495      vec4 color2;
  2496  };
  2497  
  2498  uniform Gradient _gradient;
  2499  
  2500  uniform mediump sampler2D cover;
  2501  
  2502  varying vec2 vUV;
  2503  varying highp vec2 vCoverUV;
  2504  
  2505  void main()
  2506  {
  2507      gl_FragData[0] = mix(_gradient.color1, _gradient.color2, vec4(clamp(vUV.x, 0.0, 1.0)));
  2508      float cover_1 = min(abs(texture2D(cover, vCoverUV).x), 1.0);
  2509      gl_FragData[0] *= cover_1;
  2510  }
  2511  
  2512  `,
  2513  			GLSL300ES: `#version 300 es
  2514  precision mediump float;
  2515  precision highp int;
  2516  
  2517  layout(std140) uniform Gradient
  2518  {
  2519      vec4 color1;
  2520      vec4 color2;
  2521  } _gradient;
  2522  
  2523  uniform mediump sampler2D cover;
  2524  
  2525  layout(location = 0) out vec4 fragColor;
  2526  in vec2 vUV;
  2527  in highp vec2 vCoverUV;
  2528  
  2529  void main()
  2530  {
  2531      fragColor = mix(_gradient.color1, _gradient.color2, vec4(clamp(vUV.x, 0.0, 1.0)));
  2532      float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);
  2533      fragColor *= cover_1;
  2534  }
  2535  
  2536  `,
  2537  			GLSL130: `#version 130
  2538  
  2539  struct Gradient
  2540  {
  2541      vec4 color1;
  2542      vec4 color2;
  2543  };
  2544  
  2545  uniform Gradient _gradient;
  2546  
  2547  uniform sampler2D cover;
  2548  
  2549  out vec4 fragColor;
  2550  in vec2 vUV;
  2551  in vec2 vCoverUV;
  2552  
  2553  void main()
  2554  {
  2555      fragColor = mix(_gradient.color1, _gradient.color2, vec4(clamp(vUV.x, 0.0, 1.0)));
  2556      float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);
  2557      fragColor *= cover_1;
  2558  }
  2559  
  2560  `,
  2561  			GLSL150: `#version 150
  2562  
  2563  layout(std140) uniform Gradient
  2564  {
  2565      vec4 color1;
  2566      vec4 color2;
  2567  } _gradient;
  2568  
  2569  uniform sampler2D cover;
  2570  
  2571  out vec4 fragColor;
  2572  in vec2 vUV;
  2573  in vec2 vCoverUV;
  2574  
  2575  void main()
  2576  {
  2577      fragColor = mix(_gradient.color1, _gradient.color2, vec4(clamp(vUV.x, 0.0, 1.0)));
  2578      float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);
  2579      fragColor *= cover_1;
  2580  }
  2581  
  2582  `,
  2583  			HLSL: "DXBCj\xa0\x9e\x8d\x1eÌO\rJ\xea\x8f\x17\x11o\x98\x01\x00\x00\x00\x80\x04\x00\x00\x06\x00\x00\x008\x00\x00\x00\b\x01\x00\x008\x02\x00\x00\xb4\x02\x00\x00\x00\x04\x00\x00L\x04\x00\x00Aon9\xc8\x00\x00\x00\xc8\x00\x00\x00\x00\x02\xff\xff\x94\x00\x00\x004\x00\x00\x00\x01\x00(\x00\x00\x004\x00\x00\x004\x00\x01\x00$\x00\x00\x004\x00\x01\x01\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x02\xff\xff\x1f\x00\x00\x02\x00\x00\x00\x80\x00\x00\x0f\xb0\x1f\x00\x00\x02\x00\x00\x00\x90\x00\b\x0f\xa0B\x00\x00\x03\x00\x00\x0f\x80\x00\x00\xe4\xb0\x00\b\xe4\xa0\x01\x00\x00\x02\x00\x00\x12\x80\x00\x00\xff\xb0\x01\x00\x00\x02\x01\x00\x0f\x80\x00\x00\xe4\xa0\x02\x00\x00\x03\x01\x00\x0f\x80\x01\x00\xe4\x81\x01\x00\xe4\xa0\x04\x00\x00\x04\x01\x00\x0f\x80\x00\x00U\x80\x01\x00\xe4\x80\x00\x00\xe4\xa0#\x00\x00\x02\x00\x00\x11\x80\x00\x00\x00\x80\x05\x00\x00\x03\x00\x00\x0f\x80\x00\x00\x00\x80\x01\x00\xe4\x80\x01\x00\x00\x02\x00\b\x0f\x80\x00\x00\xe4\x80\xff\xff\x00\x00SHDR(\x01\x00\x00@\x00\x00\x00J\x00\x00\x00Y\x00\x00\x04F\x8e \x00\x00\x00\x00\x00\x02\x00\x00\x00Z\x00\x00\x03\x00`\x10\x00\x01\x00\x00\x00X\x18\x00\x04\x00p\x10\x00\x01\x00\x00\x00UU\x00\x00b\x10\x00\x032\x10\x10\x00\x00\x00\x00\x00b\x10\x00\x03B\x10\x10\x00\x00\x00\x00\x00e\x00\x00\x03\xf2 \x10\x00\x00\x00\x00\x00h\x00\x00\x02\x02\x00\x00\x006 \x00\x05\x12\x00\x10\x00\x00\x00\x00\x00*\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\n\xf2\x00\x10\x00\x01\x00\x00\x00F\x8e \x80A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00F\x8e \x00\x00\x00\x00\x00\x01\x00\x00\x002\x00\x00\n\xf2\x00\x10\x00\x00\x00\x00\x00\x06\x00\x10\x00\x00\x00\x00\x00F\x0e\x10\x00\x01\x00\x00\x00F\x8e \x00\x00\x00\x00\x00\x00\x00\x00\x00E\x00\x00\t\xf2\x00\x10\x00\x01\x00\x00\x00F\x10\x10\x00\x00\x00\x00\x00F~\x10\x00\x01\x00\x00\x00\x00`\x10\x00\x01\x00\x00\x003\x00\x00\b\x12\x00\x10\x00\x01\x00\x00\x00\n\x00\x10\x80\x81\x00\x00\x00\x01\x00\x00\x00\x01@\x00\x00\x00\x00\x80?8\x00\x00\a\xf2 \x10\x00\x00\x00\x00\x00F\x0e\x10\x00\x00\x00\x00\x00\x06\x00\x10\x00\x01\x00\x00\x00>\x00\x00\x01STATt\x00\x00\x00\a\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEFD\x01\x00\x00\x01\x00\x00\x00\x9c\x00\x00\x00\x03\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xff\xff\x00\x01\x00\x00\x19\x01\x00\x00|\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x8b\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\x01\x00\x00\x00\x01\x00\x00\x00\r\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00_cover_sampler\x00cover\x00Gradient\x00\xab\xab\x91\x00\x00\x00\x02\x00\x00\x00\xb4\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\b\x01\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00_gradient_color1\x00\xab\xab\xab\x01\x00\x03\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00_gradient_color2\x00Microsoft (R) HLSL Shader Compiler 10.1\x00\xab\xab\xabISGND\x00\x00\x00\x02\x00\x00\x00\b\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x008\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\f\x04\x00\x00TEXCOORD\x00\xab\xab\xabOSGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00SV_Target\x00\xab\xab",
  2584  		},
  2585  		{
  2586  			Name:     "cover.frag",
  2587  			Inputs:   []driver.InputLocation{{Name: "vCoverUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "vUV", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}},
  2588  			Textures: []driver.TextureBinding{{Name: "tex", Binding: 0}, {Name: "cover", Binding: 1}},
  2589  			GLSL100ES: `#version 100
  2590  precision mediump float;
  2591  precision highp int;
  2592  
  2593  uniform mediump sampler2D tex;
  2594  uniform mediump sampler2D cover;
  2595  
  2596  varying vec2 vUV;
  2597  varying highp vec2 vCoverUV;
  2598  
  2599  void main()
  2600  {
  2601      gl_FragData[0] = texture2D(tex, vUV);
  2602      float cover_1 = min(abs(texture2D(cover, vCoverUV).x), 1.0);
  2603      gl_FragData[0] *= cover_1;
  2604  }
  2605  
  2606  `,
  2607  			GLSL300ES: `#version 300 es
  2608  precision mediump float;
  2609  precision highp int;
  2610  
  2611  uniform mediump sampler2D tex;
  2612  uniform mediump sampler2D cover;
  2613  
  2614  layout(location = 0) out vec4 fragColor;
  2615  in vec2 vUV;
  2616  in highp vec2 vCoverUV;
  2617  
  2618  void main()
  2619  {
  2620      fragColor = texture(tex, vUV);
  2621      float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);
  2622      fragColor *= cover_1;
  2623  }
  2624  
  2625  `,
  2626  			GLSL130: `#version 130
  2627  
  2628  uniform sampler2D tex;
  2629  uniform sampler2D cover;
  2630  
  2631  out vec4 fragColor;
  2632  in vec2 vUV;
  2633  in vec2 vCoverUV;
  2634  
  2635  void main()
  2636  {
  2637      fragColor = texture(tex, vUV);
  2638      float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);
  2639      fragColor *= cover_1;
  2640  }
  2641  
  2642  `,
  2643  			GLSL150: `#version 150
  2644  
  2645  uniform sampler2D tex;
  2646  uniform sampler2D cover;
  2647  
  2648  out vec4 fragColor;
  2649  in vec2 vUV;
  2650  in vec2 vCoverUV;
  2651  
  2652  void main()
  2653  {
  2654      fragColor = texture(tex, vUV);
  2655      float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);
  2656      fragColor *= cover_1;
  2657  }
  2658  
  2659  `,
  2660  			HLSL: "DXBC\x99\x16l`\xf6:k\xa2Y$\xa1,\xfd\xcdJE\x01\x00\x00\x00\xd8\x03\x00\x00\x06\x00\x00\x008\x00\x00\x00\xec\x00\x00\x00\xe8\x01\x00\x00d\x02\x00\x00X\x03\x00\x00\xa4\x03\x00\x00Aon9\xac\x00\x00\x00\xac\x00\x00\x00\x00\x02\xff\xff\x80\x00\x00\x00,\x00\x00\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x02\x00$\x00\x00\x00,\x00\x00\x00\x00\x00\x01\x01\x01\x00\x00\x02\xff\xff\x1f\x00\x00\x02\x00\x00\x00\x80\x00\x00\x0f\xb0\x1f\x00\x00\x02\x00\x00\x00\x90\x00\b\x0f\xa0\x1f\x00\x00\x02\x00\x00\x00\x90\x01\b\x0f\xa0\x01\x00\x00\x02\x00\x00\x03\x80\x00\x00\x1b\xb0B\x00\x00\x03\x00\x00\x0f\x80\x00\x00\xe4\x80\x00\b\xe4\xa0B\x00\x00\x03\x01\x00\x0f\x80\x00\x00\xe4\xb0\x01\b\xe4\xa0#\x00\x00\x02\x01\x00\x11\x80\x01\x00\x00\x80\x05\x00\x00\x03\x00\x00\x0f\x80\x00\x00\xe4\x80\x01\x00\x00\x80\x01\x00\x00\x02\x00\b\x0f\x80\x00\x00\xe4\x80\xff\xff\x00\x00SHDR\xf4\x00\x00\x00@\x00\x00\x00=\x00\x00\x00Z\x00\x00\x03\x00`\x10\x00\x00\x00\x00\x00Z\x00\x00\x03\x00`\x10\x00\x01\x00\x00\x00X\x18\x00\x04\x00p\x10\x00\x00\x00\x00\x00UU\x00\x00X\x18\x00\x04\x00p\x10\x00\x01\x00\x00\x00UU\x00\x00b\x10\x00\x032\x10\x10\x00\x00\x00\x00\x00b\x10\x00\x03\xc2\x10\x10\x00\x00\x00\x00\x00e\x00\x00\x03\xf2 \x10\x00\x00\x00\x00\x00h\x00\x00\x02\x02\x00\x00\x00E\x00\x00\t\xf2\x00\x10\x00\x00\x00\x00\x00F\x10\x10\x00\x00\x00\x00\x00F~\x10\x00\x01\x00\x00\x00\x00`\x10\x00\x01\x00\x00\x003\x00\x00\b\x12\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x80\x81\x00\x00\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x80?E\x00\x00\t\xf2\x00\x10\x00\x01\x00\x00\x00\xe6\x1a\x10\x00\x00\x00\x00\x00F~\x10\x00\x00\x00\x00\x00\x00`\x10\x00\x00\x00\x00\x008\x00\x00\a\xf2 \x10\x00\x00\x00\x00\x00\x06\x00\x10\x00\x00\x00\x00\x00F\x0e\x10\x00\x01\x00\x00\x00>\x00\x00\x01STATt\x00\x00\x00\x05\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEF\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xff\xff\x00\x01\x00\x00\xc2\x00\x00\x00\x9c\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\xa9\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\xb8\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x01\x00\x00\x00\r\x00\x00\x00\xbc\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\x01\x00\x00\x00\x01\x00\x00\x00\r\x00\x00\x00_tex_sampler\x00_cover_sampler\x00tex\x00cover\x00Microsoft (R) HLSL Shader Compiler 10.1\x00\xab\xabISGND\x00\x00\x00\x02\x00\x00\x00\b\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x008\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\f\f\x00\x00TEXCOORD\x00\xab\xab\xabOSGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00SV_Target\x00\xab\xab",
  2661  		},
  2662  	}
  2663  	shader_cover_vert = driver.ShaderSources{
  2664  		Name:   "cover.vert",
  2665  		Inputs: []driver.InputLocation{{Name: "pos", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "uv", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}},
  2666  		Uniforms: driver.UniformsReflection{
  2667  			Blocks:    []driver.UniformBlock{{Name: "Block", Binding: 0}},
  2668  			Locations: []driver.UniformLocation{{Name: "_block.transform", Type: 0x0, Size: 4, Offset: 0}, {Name: "_block.uvCoverTransform", Type: 0x0, Size: 4, Offset: 16}, {Name: "_block.uvTransformR1", Type: 0x0, Size: 4, Offset: 32}, {Name: "_block.uvTransformR2", Type: 0x0, Size: 4, Offset: 48}, {Name: "_block.z", Type: 0x0, Size: 1, Offset: 64}},
  2669  			Size:      68,
  2670  		},
  2671  		GLSL100ES: `#version 100
  2672  
  2673  struct m3x2
  2674  {
  2675      vec3 r0;
  2676      vec3 r1;
  2677  };
  2678  
  2679  struct Block
  2680  {
  2681      vec4 transform;
  2682      vec4 uvCoverTransform;
  2683      vec4 uvTransformR1;
  2684      vec4 uvTransformR2;
  2685      float z;
  2686  };
  2687  
  2688  uniform Block _block;
  2689  
  2690  attribute vec2 pos;
  2691  varying vec2 vUV;
  2692  attribute vec2 uv;
  2693  varying vec2 vCoverUV;
  2694  
  2695  vec4 toClipSpace(vec4 pos_1)
  2696  {
  2697      return pos_1;
  2698  }
  2699  
  2700  vec3 transform3x2(m3x2 t, vec3 v)
  2701  {
  2702      return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v));
  2703  }
  2704  
  2705  void main()
  2706  {
  2707      vec4 param = vec4((pos * _block.transform.xy) + _block.transform.zw, _block.z, 1.0);
  2708      gl_Position = toClipSpace(param);
  2709      m3x2 param_1 = m3x2(_block.uvTransformR1.xyz, _block.uvTransformR2.xyz);
  2710      vec3 param_2 = vec3(uv, 1.0);
  2711      vUV = transform3x2(param_1, param_2).xy;
  2712      m3x2 param_3 = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0));
  2713      vec3 param_4 = vec3(uv, 1.0);
  2714      vec3 uv3 = transform3x2(param_3, param_4);
  2715      vCoverUV = ((uv3 * vec3(_block.uvCoverTransform.xy, 1.0)) + vec3(_block.uvCoverTransform.zw, 0.0)).xy;
  2716  }
  2717  
  2718  `,
  2719  		GLSL300ES: `#version 300 es
  2720  
  2721  struct m3x2
  2722  {
  2723      vec3 r0;
  2724      vec3 r1;
  2725  };
  2726  
  2727  layout(std140) uniform Block
  2728  {
  2729      vec4 transform;
  2730      vec4 uvCoverTransform;
  2731      vec4 uvTransformR1;
  2732      vec4 uvTransformR2;
  2733      float z;
  2734  } _block;
  2735  
  2736  layout(location = 0) in vec2 pos;
  2737  out vec2 vUV;
  2738  layout(location = 1) in vec2 uv;
  2739  out vec2 vCoverUV;
  2740  
  2741  vec4 toClipSpace(vec4 pos_1)
  2742  {
  2743      return pos_1;
  2744  }
  2745  
  2746  vec3 transform3x2(m3x2 t, vec3 v)
  2747  {
  2748      return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v));
  2749  }
  2750  
  2751  void main()
  2752  {
  2753      vec4 param = vec4((pos * _block.transform.xy) + _block.transform.zw, _block.z, 1.0);
  2754      gl_Position = toClipSpace(param);
  2755      m3x2 param_1 = m3x2(_block.uvTransformR1.xyz, _block.uvTransformR2.xyz);
  2756      vec3 param_2 = vec3(uv, 1.0);
  2757      vUV = transform3x2(param_1, param_2).xy;
  2758      m3x2 param_3 = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0));
  2759      vec3 param_4 = vec3(uv, 1.0);
  2760      vec3 uv3 = transform3x2(param_3, param_4);
  2761      vCoverUV = ((uv3 * vec3(_block.uvCoverTransform.xy, 1.0)) + vec3(_block.uvCoverTransform.zw, 0.0)).xy;
  2762  }
  2763  
  2764  `,
  2765  		GLSL130: `#version 130
  2766  
  2767  struct m3x2
  2768  {
  2769      vec3 r0;
  2770      vec3 r1;
  2771  };
  2772  
  2773  struct Block
  2774  {
  2775      vec4 transform;
  2776      vec4 uvCoverTransform;
  2777      vec4 uvTransformR1;
  2778      vec4 uvTransformR2;
  2779      float z;
  2780  };
  2781  
  2782  uniform Block _block;
  2783  
  2784  in vec2 pos;
  2785  out vec2 vUV;
  2786  in vec2 uv;
  2787  out vec2 vCoverUV;
  2788  
  2789  vec4 toClipSpace(vec4 pos_1)
  2790  {
  2791      return pos_1;
  2792  }
  2793  
  2794  vec3 transform3x2(m3x2 t, vec3 v)
  2795  {
  2796      return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v));
  2797  }
  2798  
  2799  void main()
  2800  {
  2801      vec4 param = vec4((pos * _block.transform.xy) + _block.transform.zw, _block.z, 1.0);
  2802      gl_Position = toClipSpace(param);
  2803      m3x2 param_1 = m3x2(_block.uvTransformR1.xyz, _block.uvTransformR2.xyz);
  2804      vec3 param_2 = vec3(uv, 1.0);
  2805      vUV = transform3x2(param_1, param_2).xy;
  2806      m3x2 param_3 = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0));
  2807      vec3 param_4 = vec3(uv, 1.0);
  2808      vec3 uv3 = transform3x2(param_3, param_4);
  2809      vCoverUV = ((uv3 * vec3(_block.uvCoverTransform.xy, 1.0)) + vec3(_block.uvCoverTransform.zw, 0.0)).xy;
  2810  }
  2811  
  2812  `,
  2813  		GLSL150: `#version 150
  2814  
  2815  struct m3x2
  2816  {
  2817      vec3 r0;
  2818      vec3 r1;
  2819  };
  2820  
  2821  layout(std140) uniform Block
  2822  {
  2823      vec4 transform;
  2824      vec4 uvCoverTransform;
  2825      vec4 uvTransformR1;
  2826      vec4 uvTransformR2;
  2827      float z;
  2828  } _block;
  2829  
  2830  in vec2 pos;
  2831  out vec2 vUV;
  2832  in vec2 uv;
  2833  out vec2 vCoverUV;
  2834  
  2835  vec4 toClipSpace(vec4 pos_1)
  2836  {
  2837      return pos_1;
  2838  }
  2839  
  2840  vec3 transform3x2(m3x2 t, vec3 v)
  2841  {
  2842      return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v));
  2843  }
  2844  
  2845  void main()
  2846  {
  2847      vec4 param = vec4((pos * _block.transform.xy) + _block.transform.zw, _block.z, 1.0);
  2848      gl_Position = toClipSpace(param);
  2849      m3x2 param_1 = m3x2(_block.uvTransformR1.xyz, _block.uvTransformR2.xyz);
  2850      vec3 param_2 = vec3(uv, 1.0);
  2851      vUV = transform3x2(param_1, param_2).xy;
  2852      m3x2 param_3 = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0));
  2853      vec3 param_4 = vec3(uv, 1.0);
  2854      vec3 uv3 = transform3x2(param_3, param_4);
  2855      vCoverUV = ((uv3 * vec3(_block.uvCoverTransform.xy, 1.0)) + vec3(_block.uvCoverTransform.zw, 0.0)).xy;
  2856  }
  2857  
  2858  `,
  2859  		HLSL: "DXBCx\xefn{F\v\x88%\xc6\x05\x8f4h\xe4\xaaP\x01\x00\x00\x00\xd8\x05\x00\x00\x06\x00\x00\x008\x00\x00\x00x\x01\x00\x00\x1c\x03\x00\x00\x98\x03\x00\x00\x1c\x05\x00\x00h\x05\x00\x00Aon98\x01\x00\x008\x01\x00\x00\x00\x02\xfe\xff\x04\x01\x00\x004\x00\x00\x00\x01\x00$\x00\x00\x000\x00\x00\x000\x00\x00\x00$\x00\x01\x000\x00\x00\x00\x00\x00\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xfe\xffQ\x00\x00\x05\x06\x00\x0f\xa0\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x80\xbf\x00\x00\x00?\x1f\x00\x00\x02\x05\x00\x00\x80\x00\x00\x0f\x90\x1f\x00\x00\x02\x05\x00\x01\x80\x01\x00\x0f\x90\x04\x00\x00\x04\x00\x00\a\x80\x01\x00Đ\x06\x00Р\x06\x00Š\b\x00\x00\x03\x00\x00\b\xe0\x03\x00\xe4\xa0\x00\x00\xe4\x80\b\x00\x00\x03\x00\x00\x04\xe0\x04\x00\xe4\xa0\x00\x00\xe4\x80\x04\x00\x00\x04\x00\x00\x03\x80\x01\x00\xe1\x90\x06\x00\xe4\xa0\x06\x00\xe1\xa0\x05\x00\x00\x03\x00\x00\x03\x80\x00\x00\xe4\x80\x06\x00\xe2\xa0\x02\x00\x00\x03\x00\x00\x02\x80\x00\x00U\x80\x00\x00\x00\x80\x01\x00\x00\x02\x00\x00\x01\x80\x01\x00\x00\x90\x04\x00\x00\x04\x00\x00\x03\xe0\x00\x00\xe4\x80\x02\x00\xe4\xa0\x02\x00\xee\xa0\x04\x00\x00\x04\x00\x00\x03\x80\x00\x00\xe4\x90\x01\x00\xe4\xa0\x01\x00\xee\xa0\x02\x00\x00\x03\x00\x00\x03\xc0\x00\x00\xe4\x80\x00\x00\xe4\xa0\x01\x00\x00\x02\x00\x00\v\x80\x06\x00\xe4\xa0\x04\x00\x00\x04\x00\x00\f\xc0\x05\x00\x00\xa0\x00\x00t\x80\x00\x004\x80\xff\xff\x00\x00SHDR\x9c\x01\x00\x00@\x00\x01\x00g\x00\x00\x00Y\x00\x00\x04F\x8e \x00\x00\x00\x00\x00\x05\x00\x00\x00_\x00\x00\x032\x10\x10\x00\x00\x00\x00\x00_\x00\x00\x032\x10\x10\x00\x01\x00\x00\x00e\x00\x00\x032 \x10\x00\x00\x00\x00\x00e\x00\x00\x03\xc2 \x10\x00\x00\x00\x00\x00g\x00\x00\x04\xf2 \x10\x00\x01\x00\x00\x00\x01\x00\x00\x00h\x00\x00\x02\x02\x00\x00\x006\x00\x00\x05\x12\x00\x10\x00\x00\x00\x00\x00\n\x10\x10\x00\x01\x00\x00\x006\x00\x00\x052\x00\x10\x00\x01\x00\x00\x00F\x10\x10\x00\x01\x00\x00\x006\x00\x00\x05B\x00\x10\x00\x01\x00\x00\x00\x01@\x00\x00\x00\x00\x80?\x0f\x00\x00\n\"\x00\x10\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x80\xbf\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x96\x05\x10\x00\x01\x00\x00\x002\x00\x00\v2 \x10\x00\x00\x00\x00\x00F\x00\x10\x00\x00\x00\x00\x00F\x80 \x00\x00\x00\x00\x00\x01\x00\x00\x00\xe6\x8a \x00\x00\x00\x00\x00\x01\x00\x00\x00\x10\x00\x00\bB \x10\x00\x00\x00\x00\x00F\x82 \x00\x00\x00\x00\x00\x02\x00\x00\x00F\x02\x10\x00\x01\x00\x00\x00\x10\x00\x00\b\x82 \x10\x00\x00\x00\x00\x00F\x82 \x00\x00\x00\x00\x00\x03\x00\x00\x00F\x02\x10\x00\x01\x00\x00\x002\x00\x00\v2 \x10\x00\x01\x00\x00\x00F\x10\x10\x00\x00\x00\x00\x00F\x80 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x8a \x00\x00\x00\x00\x00\x00\x00\x00\x002\x00\x00\nB \x10\x00\x01\x00\x00\x00\n\x80 \x00\x00\x00\x00\x00\x04\x00\x00\x00\x01@\x00\x00\x00\x00\x00?\x01@\x00\x00\x00\x00\x00?6\x00\x00\x05\x82 \x10\x00\x01\x00\x00\x00\x01@\x00\x00\x00\x00\x80?>\x00\x00\x01STATt\x00\x00\x00\v\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEF|\x01\x00\x00\x01\x00\x00\x00D\x00\x00\x00\x01\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xfe\xff\x00\x01\x00\x00T\x01\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00Block\x00\xab\xab<\x00\x00\x00\x05\x00\x00\x00\\\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00 \x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x00\x00%\x01\x00\x000\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x00\x00:\x01\x00\x00@\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00D\x01\x00\x00\x00\x00\x00\x00_block_transform\x00\xab\xab\xab\x01\x00\x03\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00_block_uvCoverTransform\x00_block_uvTransformR1\x00_block_uvTransformR2\x00_block_z\x00\xab\x00\x00\x03\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00Microsoft (R) HLSL Shader Compiler 10.1\x00ISGND\x00\x00\x00\x02\x00\x00\x00\b\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x008\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x03\x03\x00\x00TEXCOORD\x00\xab\xab\xabOSGNh\x00\x00\x00\x03\x00\x00\x00\b\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\f\x00\x00P\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\f\x03\x00\x00Y\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x0f\x00\x00\x00TEXCOORD\x00SV_Position\x00\xab\xab\xab",
  2860  	}
  2861  	shader_elements_comp = driver.ShaderSources{
  2862  		Name: "elements.comp",
  2863  		GLSL310ES: `#version 310 es
  2864  layout(local_size_x = 32, local_size_y = 1, local_size_z = 1) in;
  2865  
  2866  struct Alloc
  2867  {
  2868      uint offset;
  2869  };
  2870  
  2871  struct ElementRef
  2872  {
  2873      uint offset;
  2874  };
  2875  
  2876  struct LineSegRef
  2877  {
  2878      uint offset;
  2879  };
  2880  
  2881  struct LineSeg
  2882  {
  2883      vec2 p0;
  2884      vec2 p1;
  2885  };
  2886  
  2887  struct QuadSegRef
  2888  {
  2889      uint offset;
  2890  };
  2891  
  2892  struct QuadSeg
  2893  {
  2894      vec2 p0;
  2895      vec2 p1;
  2896      vec2 p2;
  2897  };
  2898  
  2899  struct CubicSegRef
  2900  {
  2901      uint offset;
  2902  };
  2903  
  2904  struct CubicSeg
  2905  {
  2906      vec2 p0;
  2907      vec2 p1;
  2908      vec2 p2;
  2909      vec2 p3;
  2910  };
  2911  
  2912  struct FillColorRef
  2913  {
  2914      uint offset;
  2915  };
  2916  
  2917  struct FillColor
  2918  {
  2919      uint rgba_color;
  2920  };
  2921  
  2922  struct FillImageRef
  2923  {
  2924      uint offset;
  2925  };
  2926  
  2927  struct FillImage
  2928  {
  2929      uint index;
  2930      ivec2 offset;
  2931  };
  2932  
  2933  struct SetLineWidthRef
  2934  {
  2935      uint offset;
  2936  };
  2937  
  2938  struct SetLineWidth
  2939  {
  2940      float width;
  2941  };
  2942  
  2943  struct TransformRef
  2944  {
  2945      uint offset;
  2946  };
  2947  
  2948  struct Transform
  2949  {
  2950      vec4 mat;
  2951      vec2 translate;
  2952  };
  2953  
  2954  struct ClipRef
  2955  {
  2956      uint offset;
  2957  };
  2958  
  2959  struct Clip
  2960  {
  2961      vec4 bbox;
  2962  };
  2963  
  2964  struct SetFillModeRef
  2965  {
  2966      uint offset;
  2967  };
  2968  
  2969  struct SetFillMode
  2970  {
  2971      uint fill_mode;
  2972  };
  2973  
  2974  struct ElementTag
  2975  {
  2976      uint tag;
  2977      uint flags;
  2978  };
  2979  
  2980  struct StateRef
  2981  {
  2982      uint offset;
  2983  };
  2984  
  2985  struct State
  2986  {
  2987      vec4 mat;
  2988      vec2 translate;
  2989      vec4 bbox;
  2990      float linewidth;
  2991      uint flags;
  2992      uint path_count;
  2993      uint pathseg_count;
  2994      uint trans_count;
  2995  };
  2996  
  2997  struct AnnoImageRef
  2998  {
  2999      uint offset;
  3000  };
  3001  
  3002  struct AnnoImage
  3003  {
  3004      vec4 bbox;
  3005      float linewidth;
  3006      uint index;
  3007      ivec2 offset;
  3008  };
  3009  
  3010  struct AnnoColorRef
  3011  {
  3012      uint offset;
  3013  };
  3014  
  3015  struct AnnoColor
  3016  {
  3017      vec4 bbox;
  3018      float linewidth;
  3019      uint rgba_color;
  3020  };
  3021  
  3022  struct AnnoBeginClipRef
  3023  {
  3024      uint offset;
  3025  };
  3026  
  3027  struct AnnoBeginClip
  3028  {
  3029      vec4 bbox;
  3030      float linewidth;
  3031  };
  3032  
  3033  struct AnnoEndClipRef
  3034  {
  3035      uint offset;
  3036  };
  3037  
  3038  struct AnnoEndClip
  3039  {
  3040      vec4 bbox;
  3041  };
  3042  
  3043  struct AnnotatedRef
  3044  {
  3045      uint offset;
  3046  };
  3047  
  3048  struct PathCubicRef
  3049  {
  3050      uint offset;
  3051  };
  3052  
  3053  struct PathCubic
  3054  {
  3055      vec2 p0;
  3056      vec2 p1;
  3057      vec2 p2;
  3058      vec2 p3;
  3059      uint path_ix;
  3060      uint trans_ix;
  3061      vec2 stroke;
  3062  };
  3063  
  3064  struct PathSegRef
  3065  {
  3066      uint offset;
  3067  };
  3068  
  3069  struct TransformSegRef
  3070  {
  3071      uint offset;
  3072  };
  3073  
  3074  struct TransformSeg
  3075  {
  3076      vec4 mat;
  3077      vec2 translate;
  3078  };
  3079  
  3080  struct Config
  3081  {
  3082      uint n_elements;
  3083      uint n_pathseg;
  3084      uint width_in_tiles;
  3085      uint height_in_tiles;
  3086      Alloc tile_alloc;
  3087      Alloc bin_alloc;
  3088      Alloc ptcl_alloc;
  3089      Alloc pathseg_alloc;
  3090      Alloc anno_alloc;
  3091      Alloc trans_alloc;
  3092  };
  3093  
  3094  layout(binding = 0, std430) buffer Memory
  3095  {
  3096      uint mem_offset;
  3097      uint mem_error;
  3098      uint memory[];
  3099  } _294;
  3100  
  3101  layout(binding = 2, std430) readonly buffer SceneBuf
  3102  {
  3103      uint scene[];
  3104  } _323;
  3105  
  3106  layout(binding = 3, std430) coherent buffer StateBuf
  3107  {
  3108      uint part_counter;
  3109      uint state[];
  3110  } _779;
  3111  
  3112  layout(binding = 1, std430) readonly buffer ConfigBuf
  3113  {
  3114      Config conf;
  3115  } _2429;
  3116  
  3117  shared uint sh_part_ix;
  3118  shared State sh_state[32];
  3119  shared State sh_prefix;
  3120  
  3121  ElementTag Element_tag(ElementRef ref)
  3122  {
  3123      uint tag_and_flags = _323.scene[ref.offset >> uint(2)];
  3124      return ElementTag(tag_and_flags & 65535u, tag_and_flags >> uint(16));
  3125  }
  3126  
  3127  LineSeg LineSeg_read(LineSegRef ref)
  3128  {
  3129      uint ix = ref.offset >> uint(2);
  3130      uint raw0 = _323.scene[ix + 0u];
  3131      uint raw1 = _323.scene[ix + 1u];
  3132      uint raw2 = _323.scene[ix + 2u];
  3133      uint raw3 = _323.scene[ix + 3u];
  3134      LineSeg s;
  3135      s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1));
  3136      s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3));
  3137      return s;
  3138  }
  3139  
  3140  LineSeg Element_Line_read(ElementRef ref)
  3141  {
  3142      LineSegRef param = LineSegRef(ref.offset + 4u);
  3143      return LineSeg_read(param);
  3144  }
  3145  
  3146  QuadSeg QuadSeg_read(QuadSegRef ref)
  3147  {
  3148      uint ix = ref.offset >> uint(2);
  3149      uint raw0 = _323.scene[ix + 0u];
  3150      uint raw1 = _323.scene[ix + 1u];
  3151      uint raw2 = _323.scene[ix + 2u];
  3152      uint raw3 = _323.scene[ix + 3u];
  3153      uint raw4 = _323.scene[ix + 4u];
  3154      uint raw5 = _323.scene[ix + 5u];
  3155      QuadSeg s;
  3156      s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1));
  3157      s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3));
  3158      s.p2 = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5));
  3159      return s;
  3160  }
  3161  
  3162  QuadSeg Element_Quad_read(ElementRef ref)
  3163  {
  3164      QuadSegRef param = QuadSegRef(ref.offset + 4u);
  3165      return QuadSeg_read(param);
  3166  }
  3167  
  3168  CubicSeg CubicSeg_read(CubicSegRef ref)
  3169  {
  3170      uint ix = ref.offset >> uint(2);
  3171      uint raw0 = _323.scene[ix + 0u];
  3172      uint raw1 = _323.scene[ix + 1u];
  3173      uint raw2 = _323.scene[ix + 2u];
  3174      uint raw3 = _323.scene[ix + 3u];
  3175      uint raw4 = _323.scene[ix + 4u];
  3176      uint raw5 = _323.scene[ix + 5u];
  3177      uint raw6 = _323.scene[ix + 6u];
  3178      uint raw7 = _323.scene[ix + 7u];
  3179      CubicSeg s;
  3180      s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1));
  3181      s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3));
  3182      s.p2 = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5));
  3183      s.p3 = vec2(uintBitsToFloat(raw6), uintBitsToFloat(raw7));
  3184      return s;
  3185  }
  3186  
  3187  CubicSeg Element_Cubic_read(ElementRef ref)
  3188  {
  3189      CubicSegRef param = CubicSegRef(ref.offset + 4u);
  3190      return CubicSeg_read(param);
  3191  }
  3192  
  3193  SetLineWidth SetLineWidth_read(SetLineWidthRef ref)
  3194  {
  3195      uint ix = ref.offset >> uint(2);
  3196      uint raw0 = _323.scene[ix + 0u];
  3197      SetLineWidth s;
  3198      s.width = uintBitsToFloat(raw0);
  3199      return s;
  3200  }
  3201  
  3202  SetLineWidth Element_SetLineWidth_read(ElementRef ref)
  3203  {
  3204      SetLineWidthRef param = SetLineWidthRef(ref.offset + 4u);
  3205      return SetLineWidth_read(param);
  3206  }
  3207  
  3208  Transform Transform_read(TransformRef ref)
  3209  {
  3210      uint ix = ref.offset >> uint(2);
  3211      uint raw0 = _323.scene[ix + 0u];
  3212      uint raw1 = _323.scene[ix + 1u];
  3213      uint raw2 = _323.scene[ix + 2u];
  3214      uint raw3 = _323.scene[ix + 3u];
  3215      uint raw4 = _323.scene[ix + 4u];
  3216      uint raw5 = _323.scene[ix + 5u];
  3217      Transform s;
  3218      s.mat = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
  3219      s.translate = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5));
  3220      return s;
  3221  }
  3222  
  3223  Transform Element_Transform_read(ElementRef ref)
  3224  {
  3225      TransformRef param = TransformRef(ref.offset + 4u);
  3226      return Transform_read(param);
  3227  }
  3228  
  3229  SetFillMode SetFillMode_read(SetFillModeRef ref)
  3230  {
  3231      uint ix = ref.offset >> uint(2);
  3232      uint raw0 = _323.scene[ix + 0u];
  3233      SetFillMode s;
  3234      s.fill_mode = raw0;
  3235      return s;
  3236  }
  3237  
  3238  SetFillMode Element_SetFillMode_read(ElementRef ref)
  3239  {
  3240      SetFillModeRef param = SetFillModeRef(ref.offset + 4u);
  3241      return SetFillMode_read(param);
  3242  }
  3243  
  3244  State map_element(ElementRef ref)
  3245  {
  3246      ElementRef param = ref;
  3247      uint tag = Element_tag(param).tag;
  3248      State c;
  3249      c.bbox = vec4(0.0);
  3250      c.mat = vec4(1.0, 0.0, 0.0, 1.0);
  3251      c.translate = vec2(0.0);
  3252      c.linewidth = 1.0;
  3253      c.flags = 0u;
  3254      c.path_count = 0u;
  3255      c.pathseg_count = 0u;
  3256      c.trans_count = 0u;
  3257      switch (tag)
  3258      {
  3259          case 1u:
  3260          {
  3261              ElementRef param_1 = ref;
  3262              LineSeg line = Element_Line_read(param_1);
  3263              vec2 _1919 = min(line.p0, line.p1);
  3264              c.bbox = vec4(_1919.x, _1919.y, c.bbox.z, c.bbox.w);
  3265              vec2 _1927 = max(line.p0, line.p1);
  3266              c.bbox = vec4(c.bbox.x, c.bbox.y, _1927.x, _1927.y);
  3267              c.pathseg_count = 1u;
  3268              break;
  3269          }
  3270          case 2u:
  3271          {
  3272              ElementRef param_2 = ref;
  3273              QuadSeg quad = Element_Quad_read(param_2);
  3274              vec2 _1944 = min(min(quad.p0, quad.p1), quad.p2);
  3275              c.bbox = vec4(_1944.x, _1944.y, c.bbox.z, c.bbox.w);
  3276              vec2 _1955 = max(max(quad.p0, quad.p1), quad.p2);
  3277              c.bbox = vec4(c.bbox.x, c.bbox.y, _1955.x, _1955.y);
  3278              c.pathseg_count = 1u;
  3279              break;
  3280          }
  3281          case 3u:
  3282          {
  3283              ElementRef param_3 = ref;
  3284              CubicSeg cubic = Element_Cubic_read(param_3);
  3285              vec2 _1975 = min(min(cubic.p0, cubic.p1), min(cubic.p2, cubic.p3));
  3286              c.bbox = vec4(_1975.x, _1975.y, c.bbox.z, c.bbox.w);
  3287              vec2 _1989 = max(max(cubic.p0, cubic.p1), max(cubic.p2, cubic.p3));
  3288              c.bbox = vec4(c.bbox.x, c.bbox.y, _1989.x, _1989.y);
  3289              c.pathseg_count = 1u;
  3290              break;
  3291          }
  3292          case 4u:
  3293          case 9u:
  3294          case 7u:
  3295          {
  3296              c.flags = 4u;
  3297              c.path_count = 1u;
  3298              break;
  3299          }
  3300          case 8u:
  3301          {
  3302              c.path_count = 1u;
  3303              break;
  3304          }
  3305          case 5u:
  3306          {
  3307              ElementRef param_4 = ref;
  3308              SetLineWidth lw = Element_SetLineWidth_read(param_4);
  3309              c.linewidth = lw.width;
  3310              c.flags = 1u;
  3311              break;
  3312          }
  3313          case 6u:
  3314          {
  3315              ElementRef param_5 = ref;
  3316              Transform t = Element_Transform_read(param_5);
  3317              c.mat = t.mat;
  3318              c.translate = t.translate;
  3319              c.trans_count = 1u;
  3320              break;
  3321          }
  3322          case 10u:
  3323          {
  3324              ElementRef param_6 = ref;
  3325              SetFillMode fm = Element_SetFillMode_read(param_6);
  3326              c.flags = 8u | (fm.fill_mode << uint(4));
  3327              break;
  3328          }
  3329      }
  3330      return c;
  3331  }
  3332  
  3333  ElementRef Element_index(ElementRef ref, uint index)
  3334  {
  3335      return ElementRef(ref.offset + (index * 36u));
  3336  }
  3337  
  3338  State combine_state(State a, State b)
  3339  {
  3340      State c;
  3341      c.bbox.x = (min(a.mat.x * b.bbox.x, a.mat.x * b.bbox.z) + min(a.mat.z * b.bbox.y, a.mat.z * b.bbox.w)) + a.translate.x;
  3342      c.bbox.y = (min(a.mat.y * b.bbox.x, a.mat.y * b.bbox.z) + min(a.mat.w * b.bbox.y, a.mat.w * b.bbox.w)) + a.translate.y;
  3343      c.bbox.z = (max(a.mat.x * b.bbox.x, a.mat.x * b.bbox.z) + max(a.mat.z * b.bbox.y, a.mat.z * b.bbox.w)) + a.translate.x;
  3344      c.bbox.w = (max(a.mat.y * b.bbox.x, a.mat.y * b.bbox.z) + max(a.mat.w * b.bbox.y, a.mat.w * b.bbox.w)) + a.translate.y;
  3345      bool _1657 = (a.flags & 4u) == 0u;
  3346      bool _1665;
  3347      if (_1657)
  3348      {
  3349          _1665 = b.bbox.z <= b.bbox.x;
  3350      }
  3351      else
  3352      {
  3353          _1665 = _1657;
  3354      }
  3355      bool _1673;
  3356      if (_1665)
  3357      {
  3358          _1673 = b.bbox.w <= b.bbox.y;
  3359      }
  3360      else
  3361      {
  3362          _1673 = _1665;
  3363      }
  3364      if (_1673)
  3365      {
  3366          c.bbox = a.bbox;
  3367      }
  3368      else
  3369      {
  3370          bool _1683 = (a.flags & 4u) == 0u;
  3371          bool _1690;
  3372          if (_1683)
  3373          {
  3374              _1690 = (b.flags & 2u) == 0u;
  3375          }
  3376          else
  3377          {
  3378              _1690 = _1683;
  3379          }
  3380          bool _1707;
  3381          if (_1690)
  3382          {
  3383              bool _1697 = a.bbox.z > a.bbox.x;
  3384              bool _1706;
  3385              if (!_1697)
  3386              {
  3387                  _1706 = a.bbox.w > a.bbox.y;
  3388              }
  3389              else
  3390              {
  3391                  _1706 = _1697;
  3392              }
  3393              _1707 = _1706;
  3394          }
  3395          else
  3396          {
  3397              _1707 = _1690;
  3398          }
  3399          if (_1707)
  3400          {
  3401              vec2 _1716 = min(a.bbox.xy, c.bbox.xy);
  3402              c.bbox = vec4(_1716.x, _1716.y, c.bbox.z, c.bbox.w);
  3403              vec2 _1726 = max(a.bbox.zw, c.bbox.zw);
  3404              c.bbox = vec4(c.bbox.x, c.bbox.y, _1726.x, _1726.y);
  3405          }
  3406      }
  3407      c.mat.x = (a.mat.x * b.mat.x) + (a.mat.z * b.mat.y);
  3408      c.mat.y = (a.mat.y * b.mat.x) + (a.mat.w * b.mat.y);
  3409      c.mat.z = (a.mat.x * b.mat.z) + (a.mat.z * b.mat.w);
  3410      c.mat.w = (a.mat.y * b.mat.z) + (a.mat.w * b.mat.w);
  3411      c.translate.x = ((a.mat.x * b.translate.x) + (a.mat.z * b.translate.y)) + a.translate.x;
  3412      c.translate.y = ((a.mat.y * b.translate.x) + (a.mat.w * b.translate.y)) + a.translate.y;
  3413      float _1812;
  3414      if ((b.flags & 1u) == 0u)
  3415      {
  3416          _1812 = a.linewidth;
  3417      }
  3418      else
  3419      {
  3420          _1812 = b.linewidth;
  3421      }
  3422      c.linewidth = _1812;
  3423      c.flags = (a.flags & 11u) | b.flags;
  3424      c.flags |= ((a.flags & 4u) >> uint(1));
  3425      uint _1842;
  3426      if ((b.flags & 8u) == 0u)
  3427      {
  3428          _1842 = a.flags;
  3429      }
  3430      else
  3431      {
  3432          _1842 = b.flags;
  3433      }
  3434      uint fill_mode = _1842;
  3435      fill_mode &= 16u;
  3436      c.flags = (c.flags & 4294967279u) | fill_mode;
  3437      c.path_count = a.path_count + b.path_count;
  3438      c.pathseg_count = a.pathseg_count + b.pathseg_count;
  3439      c.trans_count = a.trans_count + b.trans_count;
  3440      return c;
  3441  }
  3442  
  3443  StateRef state_aggregate_ref(uint partition_ix)
  3444  {
  3445      return StateRef(4u + (partition_ix * 124u));
  3446  }
  3447  
  3448  void State_write(StateRef ref, State s)
  3449  {
  3450      uint ix = ref.offset >> uint(2);
  3451      _779.state[ix + 0u] = floatBitsToUint(s.mat.x);
  3452      _779.state[ix + 1u] = floatBitsToUint(s.mat.y);
  3453      _779.state[ix + 2u] = floatBitsToUint(s.mat.z);
  3454      _779.state[ix + 3u] = floatBitsToUint(s.mat.w);
  3455      _779.state[ix + 4u] = floatBitsToUint(s.translate.x);
  3456      _779.state[ix + 5u] = floatBitsToUint(s.translate.y);
  3457      _779.state[ix + 6u] = floatBitsToUint(s.bbox.x);
  3458      _779.state[ix + 7u] = floatBitsToUint(s.bbox.y);
  3459      _779.state[ix + 8u] = floatBitsToUint(s.bbox.z);
  3460      _779.state[ix + 9u] = floatBitsToUint(s.bbox.w);
  3461      _779.state[ix + 10u] = floatBitsToUint(s.linewidth);
  3462      _779.state[ix + 11u] = s.flags;
  3463      _779.state[ix + 12u] = s.path_count;
  3464      _779.state[ix + 13u] = s.pathseg_count;
  3465      _779.state[ix + 14u] = s.trans_count;
  3466  }
  3467  
  3468  StateRef state_prefix_ref(uint partition_ix)
  3469  {
  3470      return StateRef((4u + (partition_ix * 124u)) + 60u);
  3471  }
  3472  
  3473  uint state_flag_index(uint partition_ix)
  3474  {
  3475      return partition_ix * 31u;
  3476  }
  3477  
  3478  State State_read(StateRef ref)
  3479  {
  3480      uint ix = ref.offset >> uint(2);
  3481      uint raw0 = _779.state[ix + 0u];
  3482      uint raw1 = _779.state[ix + 1u];
  3483      uint raw2 = _779.state[ix + 2u];
  3484      uint raw3 = _779.state[ix + 3u];
  3485      uint raw4 = _779.state[ix + 4u];
  3486      uint raw5 = _779.state[ix + 5u];
  3487      uint raw6 = _779.state[ix + 6u];
  3488      uint raw7 = _779.state[ix + 7u];
  3489      uint raw8 = _779.state[ix + 8u];
  3490      uint raw9 = _779.state[ix + 9u];
  3491      uint raw10 = _779.state[ix + 10u];
  3492      uint raw11 = _779.state[ix + 11u];
  3493      uint raw12 = _779.state[ix + 12u];
  3494      uint raw13 = _779.state[ix + 13u];
  3495      uint raw14 = _779.state[ix + 14u];
  3496      State s;
  3497      s.mat = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
  3498      s.translate = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5));
  3499      s.bbox = vec4(uintBitsToFloat(raw6), uintBitsToFloat(raw7), uintBitsToFloat(raw8), uintBitsToFloat(raw9));
  3500      s.linewidth = uintBitsToFloat(raw10);
  3501      s.flags = raw11;
  3502      s.path_count = raw12;
  3503      s.pathseg_count = raw13;
  3504      s.trans_count = raw14;
  3505      return s;
  3506  }
  3507  
  3508  uint fill_mode_from_flags(uint flags)
  3509  {
  3510      return flags & 1u;
  3511  }
  3512  
  3513  vec2 get_linewidth(State st)
  3514  {
  3515      return vec2(length(st.mat.xz), length(st.mat.yw)) * (0.5 * st.linewidth);
  3516  }
  3517  
  3518  bool touch_mem(Alloc alloc, uint offset)
  3519  {
  3520      return true;
  3521  }
  3522  
  3523  void write_mem(Alloc alloc, uint offset, uint val)
  3524  {
  3525      Alloc param = alloc;
  3526      uint param_1 = offset;
  3527      if (!touch_mem(param, param_1))
  3528      {
  3529          return;
  3530      }
  3531      _294.memory[offset] = val;
  3532  }
  3533  
  3534  void PathCubic_write(Alloc a, PathCubicRef ref, PathCubic s)
  3535  {
  3536      uint ix = ref.offset >> uint(2);
  3537      Alloc param = a;
  3538      uint param_1 = ix + 0u;
  3539      uint param_2 = floatBitsToUint(s.p0.x);
  3540      write_mem(param, param_1, param_2);
  3541      Alloc param_3 = a;
  3542      uint param_4 = ix + 1u;
  3543      uint param_5 = floatBitsToUint(s.p0.y);
  3544      write_mem(param_3, param_4, param_5);
  3545      Alloc param_6 = a;
  3546      uint param_7 = ix + 2u;
  3547      uint param_8 = floatBitsToUint(s.p1.x);
  3548      write_mem(param_6, param_7, param_8);
  3549      Alloc param_9 = a;
  3550      uint param_10 = ix + 3u;
  3551      uint param_11 = floatBitsToUint(s.p1.y);
  3552      write_mem(param_9, param_10, param_11);
  3553      Alloc param_12 = a;
  3554      uint param_13 = ix + 4u;
  3555      uint param_14 = floatBitsToUint(s.p2.x);
  3556      write_mem(param_12, param_13, param_14);
  3557      Alloc param_15 = a;
  3558      uint param_16 = ix + 5u;
  3559      uint param_17 = floatBitsToUint(s.p2.y);
  3560      write_mem(param_15, param_16, param_17);
  3561      Alloc param_18 = a;
  3562      uint param_19 = ix + 6u;
  3563      uint param_20 = floatBitsToUint(s.p3.x);
  3564      write_mem(param_18, param_19, param_20);
  3565      Alloc param_21 = a;
  3566      uint param_22 = ix + 7u;
  3567      uint param_23 = floatBitsToUint(s.p3.y);
  3568      write_mem(param_21, param_22, param_23);
  3569      Alloc param_24 = a;
  3570      uint param_25 = ix + 8u;
  3571      uint param_26 = s.path_ix;
  3572      write_mem(param_24, param_25, param_26);
  3573      Alloc param_27 = a;
  3574      uint param_28 = ix + 9u;
  3575      uint param_29 = s.trans_ix;
  3576      write_mem(param_27, param_28, param_29);
  3577      Alloc param_30 = a;
  3578      uint param_31 = ix + 10u;
  3579      uint param_32 = floatBitsToUint(s.stroke.x);
  3580      write_mem(param_30, param_31, param_32);
  3581      Alloc param_33 = a;
  3582      uint param_34 = ix + 11u;
  3583      uint param_35 = floatBitsToUint(s.stroke.y);
  3584      write_mem(param_33, param_34, param_35);
  3585  }
  3586  
  3587  void PathSeg_Cubic_write(Alloc a, PathSegRef ref, uint flags, PathCubic s)
  3588  {
  3589      Alloc param = a;
  3590      uint param_1 = ref.offset >> uint(2);
  3591      uint param_2 = (flags << uint(16)) | 1u;
  3592      write_mem(param, param_1, param_2);
  3593      Alloc param_3 = a;
  3594      PathCubicRef param_4 = PathCubicRef(ref.offset + 4u);
  3595      PathCubic param_5 = s;
  3596      PathCubic_write(param_3, param_4, param_5);
  3597  }
  3598  
  3599  FillColor FillColor_read(FillColorRef ref)
  3600  {
  3601      uint ix = ref.offset >> uint(2);
  3602      uint raw0 = _323.scene[ix + 0u];
  3603      FillColor s;
  3604      s.rgba_color = raw0;
  3605      return s;
  3606  }
  3607  
  3608  FillColor Element_FillColor_read(ElementRef ref)
  3609  {
  3610      FillColorRef param = FillColorRef(ref.offset + 4u);
  3611      return FillColor_read(param);
  3612  }
  3613  
  3614  void AnnoColor_write(Alloc a, AnnoColorRef ref, AnnoColor s)
  3615  {
  3616      uint ix = ref.offset >> uint(2);
  3617      Alloc param = a;
  3618      uint param_1 = ix + 0u;
  3619      uint param_2 = floatBitsToUint(s.bbox.x);
  3620      write_mem(param, param_1, param_2);
  3621      Alloc param_3 = a;
  3622      uint param_4 = ix + 1u;
  3623      uint param_5 = floatBitsToUint(s.bbox.y);
  3624      write_mem(param_3, param_4, param_5);
  3625      Alloc param_6 = a;
  3626      uint param_7 = ix + 2u;
  3627      uint param_8 = floatBitsToUint(s.bbox.z);
  3628      write_mem(param_6, param_7, param_8);
  3629      Alloc param_9 = a;
  3630      uint param_10 = ix + 3u;
  3631      uint param_11 = floatBitsToUint(s.bbox.w);
  3632      write_mem(param_9, param_10, param_11);
  3633      Alloc param_12 = a;
  3634      uint param_13 = ix + 4u;
  3635      uint param_14 = floatBitsToUint(s.linewidth);
  3636      write_mem(param_12, param_13, param_14);
  3637      Alloc param_15 = a;
  3638      uint param_16 = ix + 5u;
  3639      uint param_17 = s.rgba_color;
  3640      write_mem(param_15, param_16, param_17);
  3641  }
  3642  
  3643  void Annotated_Color_write(Alloc a, AnnotatedRef ref, uint flags, AnnoColor s)
  3644  {
  3645      Alloc param = a;
  3646      uint param_1 = ref.offset >> uint(2);
  3647      uint param_2 = (flags << uint(16)) | 1u;
  3648      write_mem(param, param_1, param_2);
  3649      Alloc param_3 = a;
  3650      AnnoColorRef param_4 = AnnoColorRef(ref.offset + 4u);
  3651      AnnoColor param_5 = s;
  3652      AnnoColor_write(param_3, param_4, param_5);
  3653  }
  3654  
  3655  FillImage FillImage_read(FillImageRef ref)
  3656  {
  3657      uint ix = ref.offset >> uint(2);
  3658      uint raw0 = _323.scene[ix + 0u];
  3659      uint raw1 = _323.scene[ix + 1u];
  3660      FillImage s;
  3661      s.index = raw0;
  3662      s.offset = ivec2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16);
  3663      return s;
  3664  }
  3665  
  3666  FillImage Element_FillImage_read(ElementRef ref)
  3667  {
  3668      FillImageRef param = FillImageRef(ref.offset + 4u);
  3669      return FillImage_read(param);
  3670  }
  3671  
  3672  void AnnoImage_write(Alloc a, AnnoImageRef ref, AnnoImage s)
  3673  {
  3674      uint ix = ref.offset >> uint(2);
  3675      Alloc param = a;
  3676      uint param_1 = ix + 0u;
  3677      uint param_2 = floatBitsToUint(s.bbox.x);
  3678      write_mem(param, param_1, param_2);
  3679      Alloc param_3 = a;
  3680      uint param_4 = ix + 1u;
  3681      uint param_5 = floatBitsToUint(s.bbox.y);
  3682      write_mem(param_3, param_4, param_5);
  3683      Alloc param_6 = a;
  3684      uint param_7 = ix + 2u;
  3685      uint param_8 = floatBitsToUint(s.bbox.z);
  3686      write_mem(param_6, param_7, param_8);
  3687      Alloc param_9 = a;
  3688      uint param_10 = ix + 3u;
  3689      uint param_11 = floatBitsToUint(s.bbox.w);
  3690      write_mem(param_9, param_10, param_11);
  3691      Alloc param_12 = a;
  3692      uint param_13 = ix + 4u;
  3693      uint param_14 = floatBitsToUint(s.linewidth);
  3694      write_mem(param_12, param_13, param_14);
  3695      Alloc param_15 = a;
  3696      uint param_16 = ix + 5u;
  3697      uint param_17 = s.index;
  3698      write_mem(param_15, param_16, param_17);
  3699      Alloc param_18 = a;
  3700      uint param_19 = ix + 6u;
  3701      uint param_20 = (uint(s.offset.x) & 65535u) | (uint(s.offset.y) << uint(16));
  3702      write_mem(param_18, param_19, param_20);
  3703  }
  3704  
  3705  void Annotated_Image_write(Alloc a, AnnotatedRef ref, uint flags, AnnoImage s)
  3706  {
  3707      Alloc param = a;
  3708      uint param_1 = ref.offset >> uint(2);
  3709      uint param_2 = (flags << uint(16)) | 2u;
  3710      write_mem(param, param_1, param_2);
  3711      Alloc param_3 = a;
  3712      AnnoImageRef param_4 = AnnoImageRef(ref.offset + 4u);
  3713      AnnoImage param_5 = s;
  3714      AnnoImage_write(param_3, param_4, param_5);
  3715  }
  3716  
  3717  Clip Clip_read(ClipRef ref)
  3718  {
  3719      uint ix = ref.offset >> uint(2);
  3720      uint raw0 = _323.scene[ix + 0u];
  3721      uint raw1 = _323.scene[ix + 1u];
  3722      uint raw2 = _323.scene[ix + 2u];
  3723      uint raw3 = _323.scene[ix + 3u];
  3724      Clip s;
  3725      s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
  3726      return s;
  3727  }
  3728  
  3729  Clip Element_BeginClip_read(ElementRef ref)
  3730  {
  3731      ClipRef param = ClipRef(ref.offset + 4u);
  3732      return Clip_read(param);
  3733  }
  3734  
  3735  void AnnoBeginClip_write(Alloc a, AnnoBeginClipRef ref, AnnoBeginClip s)
  3736  {
  3737      uint ix = ref.offset >> uint(2);
  3738      Alloc param = a;
  3739      uint param_1 = ix + 0u;
  3740      uint param_2 = floatBitsToUint(s.bbox.x);
  3741      write_mem(param, param_1, param_2);
  3742      Alloc param_3 = a;
  3743      uint param_4 = ix + 1u;
  3744      uint param_5 = floatBitsToUint(s.bbox.y);
  3745      write_mem(param_3, param_4, param_5);
  3746      Alloc param_6 = a;
  3747      uint param_7 = ix + 2u;
  3748      uint param_8 = floatBitsToUint(s.bbox.z);
  3749      write_mem(param_6, param_7, param_8);
  3750      Alloc param_9 = a;
  3751      uint param_10 = ix + 3u;
  3752      uint param_11 = floatBitsToUint(s.bbox.w);
  3753      write_mem(param_9, param_10, param_11);
  3754      Alloc param_12 = a;
  3755      uint param_13 = ix + 4u;
  3756      uint param_14 = floatBitsToUint(s.linewidth);
  3757      write_mem(param_12, param_13, param_14);
  3758  }
  3759  
  3760  void Annotated_BeginClip_write(Alloc a, AnnotatedRef ref, uint flags, AnnoBeginClip s)
  3761  {
  3762      Alloc param = a;
  3763      uint param_1 = ref.offset >> uint(2);
  3764      uint param_2 = (flags << uint(16)) | 3u;
  3765      write_mem(param, param_1, param_2);
  3766      Alloc param_3 = a;
  3767      AnnoBeginClipRef param_4 = AnnoBeginClipRef(ref.offset + 4u);
  3768      AnnoBeginClip param_5 = s;
  3769      AnnoBeginClip_write(param_3, param_4, param_5);
  3770  }
  3771  
  3772  Clip Element_EndClip_read(ElementRef ref)
  3773  {
  3774      ClipRef param = ClipRef(ref.offset + 4u);
  3775      return Clip_read(param);
  3776  }
  3777  
  3778  void AnnoEndClip_write(Alloc a, AnnoEndClipRef ref, AnnoEndClip s)
  3779  {
  3780      uint ix = ref.offset >> uint(2);
  3781      Alloc param = a;
  3782      uint param_1 = ix + 0u;
  3783      uint param_2 = floatBitsToUint(s.bbox.x);
  3784      write_mem(param, param_1, param_2);
  3785      Alloc param_3 = a;
  3786      uint param_4 = ix + 1u;
  3787      uint param_5 = floatBitsToUint(s.bbox.y);
  3788      write_mem(param_3, param_4, param_5);
  3789      Alloc param_6 = a;
  3790      uint param_7 = ix + 2u;
  3791      uint param_8 = floatBitsToUint(s.bbox.z);
  3792      write_mem(param_6, param_7, param_8);
  3793      Alloc param_9 = a;
  3794      uint param_10 = ix + 3u;
  3795      uint param_11 = floatBitsToUint(s.bbox.w);
  3796      write_mem(param_9, param_10, param_11);
  3797  }
  3798  
  3799  void Annotated_EndClip_write(Alloc a, AnnotatedRef ref, AnnoEndClip s)
  3800  {
  3801      Alloc param = a;
  3802      uint param_1 = ref.offset >> uint(2);
  3803      uint param_2 = 4u;
  3804      write_mem(param, param_1, param_2);
  3805      Alloc param_3 = a;
  3806      AnnoEndClipRef param_4 = AnnoEndClipRef(ref.offset + 4u);
  3807      AnnoEndClip param_5 = s;
  3808      AnnoEndClip_write(param_3, param_4, param_5);
  3809  }
  3810  
  3811  void TransformSeg_write(Alloc a, TransformSegRef ref, TransformSeg s)
  3812  {
  3813      uint ix = ref.offset >> uint(2);
  3814      Alloc param = a;
  3815      uint param_1 = ix + 0u;
  3816      uint param_2 = floatBitsToUint(s.mat.x);
  3817      write_mem(param, param_1, param_2);
  3818      Alloc param_3 = a;
  3819      uint param_4 = ix + 1u;
  3820      uint param_5 = floatBitsToUint(s.mat.y);
  3821      write_mem(param_3, param_4, param_5);
  3822      Alloc param_6 = a;
  3823      uint param_7 = ix + 2u;
  3824      uint param_8 = floatBitsToUint(s.mat.z);
  3825      write_mem(param_6, param_7, param_8);
  3826      Alloc param_9 = a;
  3827      uint param_10 = ix + 3u;
  3828      uint param_11 = floatBitsToUint(s.mat.w);
  3829      write_mem(param_9, param_10, param_11);
  3830      Alloc param_12 = a;
  3831      uint param_13 = ix + 4u;
  3832      uint param_14 = floatBitsToUint(s.translate.x);
  3833      write_mem(param_12, param_13, param_14);
  3834      Alloc param_15 = a;
  3835      uint param_16 = ix + 5u;
  3836      uint param_17 = floatBitsToUint(s.translate.y);
  3837      write_mem(param_15, param_16, param_17);
  3838  }
  3839  
  3840  void main()
  3841  {
  3842      if (gl_LocalInvocationID.x == 0u)
  3843      {
  3844          uint _2063 = atomicAdd(_779.part_counter, 1u);
  3845          sh_part_ix = _2063;
  3846      }
  3847      barrier();
  3848      uint part_ix = sh_part_ix;
  3849      uint ix = (part_ix * 128u) + (gl_LocalInvocationID.x * 4u);
  3850      ElementRef ref = ElementRef(ix * 36u);
  3851      ElementRef param = ref;
  3852      State th_state[4];
  3853      th_state[0] = map_element(param);
  3854      for (uint i = 1u; i < 4u; i++)
  3855      {
  3856          ElementRef param_1 = ref;
  3857          uint param_2 = i;
  3858          ElementRef param_3 = Element_index(param_1, param_2);
  3859          State param_4 = th_state[i - 1u];
  3860          State param_5 = map_element(param_3);
  3861          th_state[i] = combine_state(param_4, param_5);
  3862      }
  3863      State agg = th_state[3];
  3864      sh_state[gl_LocalInvocationID.x] = agg;
  3865      for (uint i_1 = 0u; i_1 < 5u; i_1++)
  3866      {
  3867          barrier();
  3868          if (gl_LocalInvocationID.x >= uint(1 << int(i_1)))
  3869          {
  3870              State other = sh_state[gl_LocalInvocationID.x - uint(1 << int(i_1))];
  3871              State param_6 = other;
  3872              State param_7 = agg;
  3873              agg = combine_state(param_6, param_7);
  3874          }
  3875          barrier();
  3876          sh_state[gl_LocalInvocationID.x] = agg;
  3877      }
  3878      State exclusive;
  3879      exclusive.bbox = vec4(0.0);
  3880      exclusive.mat = vec4(1.0, 0.0, 0.0, 1.0);
  3881      exclusive.translate = vec2(0.0);
  3882      exclusive.linewidth = 1.0;
  3883      exclusive.flags = 0u;
  3884      exclusive.path_count = 0u;
  3885      exclusive.pathseg_count = 0u;
  3886      exclusive.trans_count = 0u;
  3887      if (gl_LocalInvocationID.x == 31u)
  3888      {
  3889          uint param_8 = part_ix;
  3890          StateRef param_9 = state_aggregate_ref(param_8);
  3891          State param_10 = agg;
  3892          State_write(param_9, param_10);
  3893          uint flag = 1u;
  3894          memoryBarrierBuffer();
  3895          if (part_ix == 0u)
  3896          {
  3897              uint param_11 = part_ix;
  3898              StateRef param_12 = state_prefix_ref(param_11);
  3899              State param_13 = agg;
  3900              State_write(param_12, param_13);
  3901              flag = 2u;
  3902          }
  3903          uint param_14 = part_ix;
  3904          _779.state[state_flag_index(param_14)] = flag;
  3905          if (part_ix != 0u)
  3906          {
  3907              uint look_back_ix = part_ix - 1u;
  3908              uint their_ix = 0u;
  3909              State their_agg;
  3910              while (true)
  3911              {
  3912                  uint param_15 = look_back_ix;
  3913                  flag = _779.state[state_flag_index(param_15)];
  3914                  if (flag == 2u)
  3915                  {
  3916                      uint param_16 = look_back_ix;
  3917                      StateRef param_17 = state_prefix_ref(param_16);
  3918                      State their_prefix = State_read(param_17);
  3919                      State param_18 = their_prefix;
  3920                      State param_19 = exclusive;
  3921                      exclusive = combine_state(param_18, param_19);
  3922                      break;
  3923                  }
  3924                  else
  3925                  {
  3926                      if (flag == 1u)
  3927                      {
  3928                          uint param_20 = look_back_ix;
  3929                          StateRef param_21 = state_aggregate_ref(param_20);
  3930                          their_agg = State_read(param_21);
  3931                          State param_22 = their_agg;
  3932                          State param_23 = exclusive;
  3933                          exclusive = combine_state(param_22, param_23);
  3934                          look_back_ix--;
  3935                          their_ix = 0u;
  3936                          continue;
  3937                      }
  3938                  }
  3939                  ElementRef ref_1 = ElementRef(((look_back_ix * 128u) + their_ix) * 36u);
  3940                  ElementRef param_24 = ref_1;
  3941                  State s = map_element(param_24);
  3942                  if (their_ix == 0u)
  3943                  {
  3944                      their_agg = s;
  3945                  }
  3946                  else
  3947                  {
  3948                      State param_25 = their_agg;
  3949                      State param_26 = s;
  3950                      their_agg = combine_state(param_25, param_26);
  3951                  }
  3952                  their_ix++;
  3953                  if (their_ix == 128u)
  3954                  {
  3955                      State param_27 = their_agg;
  3956                      State param_28 = exclusive;
  3957                      exclusive = combine_state(param_27, param_28);
  3958                      if (look_back_ix == 0u)
  3959                      {
  3960                          break;
  3961                      }
  3962                      look_back_ix--;
  3963                      their_ix = 0u;
  3964                  }
  3965              }
  3966              State param_29 = exclusive;
  3967              State param_30 = agg;
  3968              State inclusive_prefix = combine_state(param_29, param_30);
  3969              sh_prefix = exclusive;
  3970              uint param_31 = part_ix;
  3971              StateRef param_32 = state_prefix_ref(param_31);
  3972              State param_33 = inclusive_prefix;
  3973              State_write(param_32, param_33);
  3974              memoryBarrierBuffer();
  3975              flag = 2u;
  3976              uint param_34 = part_ix;
  3977              _779.state[state_flag_index(param_34)] = flag;
  3978          }
  3979      }
  3980      barrier();
  3981      if (part_ix != 0u)
  3982      {
  3983          exclusive = sh_prefix;
  3984      }
  3985      State row = exclusive;
  3986      if (gl_LocalInvocationID.x > 0u)
  3987      {
  3988          State other_1 = sh_state[gl_LocalInvocationID.x - 1u];
  3989          State param_35 = row;
  3990          State param_36 = other_1;
  3991          row = combine_state(param_35, param_36);
  3992      }
  3993      PathCubic path_cubic;
  3994      PathSegRef path_out_ref;
  3995      Alloc param_45;
  3996      Alloc param_51;
  3997      Alloc param_57;
  3998      AnnoColor anno_fill;
  3999      AnnotatedRef out_ref;
  4000      Alloc param_63;
  4001      AnnoImage anno_img;
  4002      Alloc param_69;
  4003      AnnoBeginClip anno_begin_clip;
  4004      Alloc param_75;
  4005      Alloc param_80;
  4006      Alloc param_83;
  4007      for (uint i_2 = 0u; i_2 < 4u; i_2++)
  4008      {
  4009          State param_37 = row;
  4010          State param_38 = th_state[i_2];
  4011          State st = combine_state(param_37, param_38);
  4012          ElementRef param_39 = ref;
  4013          uint param_40 = i_2;
  4014          ElementRef this_ref = Element_index(param_39, param_40);
  4015          ElementRef param_41 = this_ref;
  4016          ElementTag tag = Element_tag(param_41);
  4017          uint param_42 = st.flags >> uint(4);
  4018          uint fill_mode = fill_mode_from_flags(param_42);
  4019          bool is_stroke = fill_mode == 1u;
  4020          switch (tag.tag)
  4021          {
  4022              case 1u:
  4023              {
  4024                  ElementRef param_43 = this_ref;
  4025                  LineSeg line = Element_Line_read(param_43);
  4026                  path_cubic.p0 = line.p0;
  4027                  path_cubic.p1 = mix(line.p0, line.p1, vec2(0.3333333432674407958984375));
  4028                  path_cubic.p2 = mix(line.p1, line.p0, vec2(0.3333333432674407958984375));
  4029                  path_cubic.p3 = line.p1;
  4030                  path_cubic.path_ix = st.path_count;
  4031                  path_cubic.trans_ix = st.trans_count;
  4032                  if (is_stroke)
  4033                  {
  4034                      State param_44 = st;
  4035                      path_cubic.stroke = get_linewidth(param_44);
  4036                  }
  4037                  else
  4038                  {
  4039                      path_cubic.stroke = vec2(0.0);
  4040                  }
  4041                  path_out_ref = PathSegRef(_2429.conf.pathseg_alloc.offset + ((st.pathseg_count - 1u) * 52u));
  4042                  param_45.offset = _2429.conf.pathseg_alloc.offset;
  4043                  PathSegRef param_46 = path_out_ref;
  4044                  uint param_47 = fill_mode;
  4045                  PathCubic param_48 = path_cubic;
  4046                  PathSeg_Cubic_write(param_45, param_46, param_47, param_48);
  4047                  break;
  4048              }
  4049              case 2u:
  4050              {
  4051                  ElementRef param_49 = this_ref;
  4052                  QuadSeg quad = Element_Quad_read(param_49);
  4053                  path_cubic.p0 = quad.p0;
  4054                  path_cubic.p1 = mix(quad.p1, quad.p0, vec2(0.3333333432674407958984375));
  4055                  path_cubic.p2 = mix(quad.p1, quad.p2, vec2(0.3333333432674407958984375));
  4056                  path_cubic.p3 = quad.p2;
  4057                  path_cubic.path_ix = st.path_count;
  4058                  path_cubic.trans_ix = st.trans_count;
  4059                  if (is_stroke)
  4060                  {
  4061                      State param_50 = st;
  4062                      path_cubic.stroke = get_linewidth(param_50);
  4063                  }
  4064                  else
  4065                  {
  4066                      path_cubic.stroke = vec2(0.0);
  4067                  }
  4068                  path_out_ref = PathSegRef(_2429.conf.pathseg_alloc.offset + ((st.pathseg_count - 1u) * 52u));
  4069                  param_51.offset = _2429.conf.pathseg_alloc.offset;
  4070                  PathSegRef param_52 = path_out_ref;
  4071                  uint param_53 = fill_mode;
  4072                  PathCubic param_54 = path_cubic;
  4073                  PathSeg_Cubic_write(param_51, param_52, param_53, param_54);
  4074                  break;
  4075              }
  4076              case 3u:
  4077              {
  4078                  ElementRef param_55 = this_ref;
  4079                  CubicSeg cubic = Element_Cubic_read(param_55);
  4080                  path_cubic.p0 = cubic.p0;
  4081                  path_cubic.p1 = cubic.p1;
  4082                  path_cubic.p2 = cubic.p2;
  4083                  path_cubic.p3 = cubic.p3;
  4084                  path_cubic.path_ix = st.path_count;
  4085                  path_cubic.trans_ix = st.trans_count;
  4086                  if (is_stroke)
  4087                  {
  4088                      State param_56 = st;
  4089                      path_cubic.stroke = get_linewidth(param_56);
  4090                  }
  4091                  else
  4092                  {
  4093                      path_cubic.stroke = vec2(0.0);
  4094                  }
  4095                  path_out_ref = PathSegRef(_2429.conf.pathseg_alloc.offset + ((st.pathseg_count - 1u) * 52u));
  4096                  param_57.offset = _2429.conf.pathseg_alloc.offset;
  4097                  PathSegRef param_58 = path_out_ref;
  4098                  uint param_59 = fill_mode;
  4099                  PathCubic param_60 = path_cubic;
  4100                  PathSeg_Cubic_write(param_57, param_58, param_59, param_60);
  4101                  break;
  4102              }
  4103              case 4u:
  4104              {
  4105                  ElementRef param_61 = this_ref;
  4106                  FillColor fill = Element_FillColor_read(param_61);
  4107                  anno_fill.rgba_color = fill.rgba_color;
  4108                  if (is_stroke)
  4109                  {
  4110                      State param_62 = st;
  4111                      vec2 lw = get_linewidth(param_62);
  4112                      anno_fill.bbox = st.bbox + vec4(-lw, lw);
  4113                      anno_fill.linewidth = st.linewidth * sqrt(abs((st.mat.x * st.mat.w) - (st.mat.y * st.mat.z)));
  4114                  }
  4115                  else
  4116                  {
  4117                      anno_fill.bbox = st.bbox;
  4118                      anno_fill.linewidth = 0.0;
  4119                  }
  4120                  out_ref = AnnotatedRef(_2429.conf.anno_alloc.offset + ((st.path_count - 1u) * 32u));
  4121                  param_63.offset = _2429.conf.anno_alloc.offset;
  4122                  AnnotatedRef param_64 = out_ref;
  4123                  uint param_65 = fill_mode;
  4124                  AnnoColor param_66 = anno_fill;
  4125                  Annotated_Color_write(param_63, param_64, param_65, param_66);
  4126                  break;
  4127              }
  4128              case 9u:
  4129              {
  4130                  ElementRef param_67 = this_ref;
  4131                  FillImage fill_img = Element_FillImage_read(param_67);
  4132                  anno_img.index = fill_img.index;
  4133                  anno_img.offset = fill_img.offset;
  4134                  if (is_stroke)
  4135                  {
  4136                      State param_68 = st;
  4137                      vec2 lw_1 = get_linewidth(param_68);
  4138                      anno_img.bbox = st.bbox + vec4(-lw_1, lw_1);
  4139                      anno_img.linewidth = st.linewidth * sqrt(abs((st.mat.x * st.mat.w) - (st.mat.y * st.mat.z)));
  4140                  }
  4141                  else
  4142                  {
  4143                      anno_img.bbox = st.bbox;
  4144                      anno_img.linewidth = 0.0;
  4145                  }
  4146                  out_ref = AnnotatedRef(_2429.conf.anno_alloc.offset + ((st.path_count - 1u) * 32u));
  4147                  param_69.offset = _2429.conf.anno_alloc.offset;
  4148                  AnnotatedRef param_70 = out_ref;
  4149                  uint param_71 = fill_mode;
  4150                  AnnoImage param_72 = anno_img;
  4151                  Annotated_Image_write(param_69, param_70, param_71, param_72);
  4152                  break;
  4153              }
  4154              case 7u:
  4155              {
  4156                  ElementRef param_73 = this_ref;
  4157                  Clip begin_clip = Element_BeginClip_read(param_73);
  4158                  anno_begin_clip.bbox = begin_clip.bbox;
  4159                  if (is_stroke)
  4160                  {
  4161                      State param_74 = st;
  4162                      vec2 lw_2 = get_linewidth(param_74);
  4163                      anno_begin_clip.linewidth = st.linewidth * sqrt(abs((st.mat.x * st.mat.w) - (st.mat.y * st.mat.z)));
  4164                  }
  4165                  else
  4166                  {
  4167                      anno_fill.linewidth = 0.0;
  4168                  }
  4169                  out_ref = AnnotatedRef(_2429.conf.anno_alloc.offset + ((st.path_count - 1u) * 32u));
  4170                  param_75.offset = _2429.conf.anno_alloc.offset;
  4171                  AnnotatedRef param_76 = out_ref;
  4172                  uint param_77 = fill_mode;
  4173                  AnnoBeginClip param_78 = anno_begin_clip;
  4174                  Annotated_BeginClip_write(param_75, param_76, param_77, param_78);
  4175                  break;
  4176              }
  4177              case 8u:
  4178              {
  4179                  ElementRef param_79 = this_ref;
  4180                  Clip end_clip = Element_EndClip_read(param_79);
  4181                  AnnoEndClip anno_end_clip = AnnoEndClip(end_clip.bbox);
  4182                  out_ref = AnnotatedRef(_2429.conf.anno_alloc.offset + ((st.path_count - 1u) * 32u));
  4183                  param_80.offset = _2429.conf.anno_alloc.offset;
  4184                  AnnotatedRef param_81 = out_ref;
  4185                  AnnoEndClip param_82 = anno_end_clip;
  4186                  Annotated_EndClip_write(param_80, param_81, param_82);
  4187                  break;
  4188              }
  4189              case 6u:
  4190              {
  4191                  TransformSeg transform = TransformSeg(st.mat, st.translate);
  4192                  TransformSegRef trans_ref = TransformSegRef(_2429.conf.trans_alloc.offset + ((st.trans_count - 1u) * 24u));
  4193                  param_83.offset = _2429.conf.trans_alloc.offset;
  4194                  TransformSegRef param_84 = trans_ref;
  4195                  TransformSeg param_85 = transform;
  4196                  TransformSeg_write(param_83, param_84, param_85);
  4197                  break;
  4198              }
  4199          }
  4200      }
  4201  }
  4202  
  4203  `,
  4204  	}
  4205  	shader_intersect_frag = driver.ShaderSources{
  4206  		Name:     "intersect.frag",
  4207  		Inputs:   []driver.InputLocation{{Name: "vUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}},
  4208  		Textures: []driver.TextureBinding{{Name: "cover", Binding: 0}},
  4209  		GLSL100ES: `#version 100
  4210  precision mediump float;
  4211  precision highp int;
  4212  
  4213  uniform mediump sampler2D cover;
  4214  
  4215  varying highp vec2 vUV;
  4216  
  4217  void main()
  4218  {
  4219      float cover_1 = abs(texture2D(cover, vUV).x);
  4220      gl_FragData[0].x = cover_1;
  4221  }
  4222  
  4223  `,
  4224  		GLSL300ES: `#version 300 es
  4225  precision mediump float;
  4226  precision highp int;
  4227  
  4228  uniform mediump sampler2D cover;
  4229  
  4230  in highp vec2 vUV;
  4231  layout(location = 0) out vec4 fragColor;
  4232  
  4233  void main()
  4234  {
  4235      float cover_1 = abs(texture(cover, vUV).x);
  4236      fragColor.x = cover_1;
  4237  }
  4238  
  4239  `,
  4240  		GLSL130: `#version 130
  4241  
  4242  uniform sampler2D cover;
  4243  
  4244  in vec2 vUV;
  4245  out vec4 fragColor;
  4246  
  4247  void main()
  4248  {
  4249      float cover_1 = abs(texture(cover, vUV).x);
  4250      fragColor.x = cover_1;
  4251  }
  4252  
  4253  `,
  4254  		GLSL150: `#version 150
  4255  
  4256  uniform sampler2D cover;
  4257  
  4258  in vec2 vUV;
  4259  out vec4 fragColor;
  4260  
  4261  void main()
  4262  {
  4263      float cover_1 = abs(texture(cover, vUV).x);
  4264      fragColor.x = cover_1;
  4265  }
  4266  
  4267  `,
  4268  		HLSL: "DXBC\xe0\xe4\x03\x8c\xacVF\x82l\xe7|\xc3T\xa6'\xef\x01\x00\x00\x00\b\x03\x00\x00\x06\x00\x00\x008\x00\x00\x00\xd4\x00\x00\x00\x80\x01\x00\x00\xfc\x01\x00\x00\xa0\x02\x00\x00\xd4\x02\x00\x00Aon9\x94\x00\x00\x00\x94\x00\x00\x00\x00\x02\xff\xffl\x00\x00\x00(\x00\x00\x00\x00\x00(\x00\x00\x00(\x00\x00\x00(\x00\x01\x00$\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x02\xff\xffQ\x00\x00\x05\x00\x00\x0f\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x02\x00\x00\x00\x80\x00\x00\x03\xb0\x1f\x00\x00\x02\x00\x00\x00\x90\x00\b\x0f\xa0B\x00\x00\x03\x00\x00\x0f\x80\x00\x00\xe4\xb0\x00\b\xe4\xa0#\x00\x00\x02\x00\x00\x01\x80\x00\x00\x00\x80\x01\x00\x00\x02\x00\x00\x0e\x80\x00\x00\x00\xa0\x01\x00\x00\x02\x00\b\x0f\x80\x00\x00\xe4\x80\xff\xff\x00\x00SHDR\xa4\x00\x00\x00@\x00\x00\x00)\x00\x00\x00Z\x00\x00\x03\x00`\x10\x00\x00\x00\x00\x00X\x18\x00\x04\x00p\x10\x00\x00\x00\x00\x00UU\x00\x00b\x10\x00\x032\x10\x10\x00\x00\x00\x00\x00e\x00\x00\x03\xf2 \x10\x00\x00\x00\x00\x00h\x00\x00\x02\x01\x00\x00\x00E\x00\x00\t\xf2\x00\x10\x00\x00\x00\x00\x00F\x10\x10\x00\x00\x00\x00\x00F~\x10\x00\x00\x00\x00\x00\x00`\x10\x00\x00\x00\x00\x006\x00\x00\x06\x12 \x10\x00\x00\x00\x00\x00\n\x00\x10\x80\x81\x00\x00\x00\x00\x00\x00\x006\x00\x00\b\xe2 \x10\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x01STATt\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEF\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xff\xff\x00\x01\x00\x00q\x00\x00\x00\\\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00k\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x01\x00\x00\x00\r\x00\x00\x00_cover_sampler\x00cover\x00Microsoft (R) HLSL Shader Compiler 10.1\x00\xab\xab\xabISGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00TEXCOORD\x00\xab\xab\xabOSGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00SV_Target\x00\xab\xab",
  4269  	}
  4270  	shader_intersect_vert = driver.ShaderSources{
  4271  		Name:   "intersect.vert",
  4272  		Inputs: []driver.InputLocation{{Name: "pos", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "uv", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}},
  4273  		Uniforms: driver.UniformsReflection{
  4274  			Blocks:    []driver.UniformBlock{{Name: "Block", Binding: 0}},
  4275  			Locations: []driver.UniformLocation{{Name: "_block.uvTransform", Type: 0x0, Size: 4, Offset: 0}, {Name: "_block.subUVTransform", Type: 0x0, Size: 4, Offset: 16}},
  4276  			Size:      32,
  4277  		},
  4278  		GLSL100ES: `#version 100
  4279  
  4280  struct m3x2
  4281  {
  4282      vec3 r0;
  4283      vec3 r1;
  4284  };
  4285  
  4286  struct Block
  4287  {
  4288      vec4 uvTransform;
  4289      vec4 subUVTransform;
  4290  };
  4291  
  4292  uniform Block _block;
  4293  
  4294  attribute vec2 pos;
  4295  attribute vec2 uv;
  4296  varying vec2 vUV;
  4297  
  4298  vec3 transform3x2(m3x2 t, vec3 v)
  4299  {
  4300      return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v));
  4301  }
  4302  
  4303  void main()
  4304  {
  4305      m3x2 param = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, -1.0, 0.0));
  4306      vec3 param_1 = vec3(pos, 1.0);
  4307      vec3 p = transform3x2(param, param_1);
  4308      gl_Position = vec4(p, 1.0);
  4309      m3x2 param_2 = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0));
  4310      vec3 param_3 = vec3(uv, 1.0);
  4311      vec3 uv3 = transform3x2(param_2, param_3);
  4312      vUV = (uv3.xy * _block.subUVTransform.xy) + _block.subUVTransform.zw;
  4313      m3x2 param_4 = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0));
  4314      vec3 param_5 = vec3(vUV, 1.0);
  4315      vUV = transform3x2(param_4, param_5).xy;
  4316      vUV = (vUV * _block.uvTransform.xy) + _block.uvTransform.zw;
  4317  }
  4318  
  4319  `,
  4320  		GLSL300ES: `#version 300 es
  4321  
  4322  struct m3x2
  4323  {
  4324      vec3 r0;
  4325      vec3 r1;
  4326  };
  4327  
  4328  layout(std140) uniform Block
  4329  {
  4330      vec4 uvTransform;
  4331      vec4 subUVTransform;
  4332  } _block;
  4333  
  4334  layout(location = 0) in vec2 pos;
  4335  layout(location = 1) in vec2 uv;
  4336  out vec2 vUV;
  4337  
  4338  vec3 transform3x2(m3x2 t, vec3 v)
  4339  {
  4340      return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v));
  4341  }
  4342  
  4343  void main()
  4344  {
  4345      m3x2 param = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, -1.0, 0.0));
  4346      vec3 param_1 = vec3(pos, 1.0);
  4347      vec3 p = transform3x2(param, param_1);
  4348      gl_Position = vec4(p, 1.0);
  4349      m3x2 param_2 = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0));
  4350      vec3 param_3 = vec3(uv, 1.0);
  4351      vec3 uv3 = transform3x2(param_2, param_3);
  4352      vUV = (uv3.xy * _block.subUVTransform.xy) + _block.subUVTransform.zw;
  4353      m3x2 param_4 = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0));
  4354      vec3 param_5 = vec3(vUV, 1.0);
  4355      vUV = transform3x2(param_4, param_5).xy;
  4356      vUV = (vUV * _block.uvTransform.xy) + _block.uvTransform.zw;
  4357  }
  4358  
  4359  `,
  4360  		GLSL130: `#version 130
  4361  
  4362  struct m3x2
  4363  {
  4364      vec3 r0;
  4365      vec3 r1;
  4366  };
  4367  
  4368  struct Block
  4369  {
  4370      vec4 uvTransform;
  4371      vec4 subUVTransform;
  4372  };
  4373  
  4374  uniform Block _block;
  4375  
  4376  in vec2 pos;
  4377  in vec2 uv;
  4378  out vec2 vUV;
  4379  
  4380  vec3 transform3x2(m3x2 t, vec3 v)
  4381  {
  4382      return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v));
  4383  }
  4384  
  4385  void main()
  4386  {
  4387      m3x2 param = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, -1.0, 0.0));
  4388      vec3 param_1 = vec3(pos, 1.0);
  4389      vec3 p = transform3x2(param, param_1);
  4390      gl_Position = vec4(p, 1.0);
  4391      m3x2 param_2 = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0));
  4392      vec3 param_3 = vec3(uv, 1.0);
  4393      vec3 uv3 = transform3x2(param_2, param_3);
  4394      vUV = (uv3.xy * _block.subUVTransform.xy) + _block.subUVTransform.zw;
  4395      m3x2 param_4 = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0));
  4396      vec3 param_5 = vec3(vUV, 1.0);
  4397      vUV = transform3x2(param_4, param_5).xy;
  4398      vUV = (vUV * _block.uvTransform.xy) + _block.uvTransform.zw;
  4399  }
  4400  
  4401  `,
  4402  		GLSL150: `#version 150
  4403  
  4404  struct m3x2
  4405  {
  4406      vec3 r0;
  4407      vec3 r1;
  4408  };
  4409  
  4410  layout(std140) uniform Block
  4411  {
  4412      vec4 uvTransform;
  4413      vec4 subUVTransform;
  4414  } _block;
  4415  
  4416  in vec2 pos;
  4417  in vec2 uv;
  4418  out vec2 vUV;
  4419  
  4420  vec3 transform3x2(m3x2 t, vec3 v)
  4421  {
  4422      return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v));
  4423  }
  4424  
  4425  void main()
  4426  {
  4427      m3x2 param = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, -1.0, 0.0));
  4428      vec3 param_1 = vec3(pos, 1.0);
  4429      vec3 p = transform3x2(param, param_1);
  4430      gl_Position = vec4(p, 1.0);
  4431      m3x2 param_2 = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0));
  4432      vec3 param_3 = vec3(uv, 1.0);
  4433      vec3 uv3 = transform3x2(param_2, param_3);
  4434      vUV = (uv3.xy * _block.subUVTransform.xy) + _block.subUVTransform.zw;
  4435      m3x2 param_4 = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0));
  4436      vec3 param_5 = vec3(vUV, 1.0);
  4437      vUV = transform3x2(param_4, param_5).xy;
  4438      vUV = (vUV * _block.uvTransform.xy) + _block.uvTransform.zw;
  4439  }
  4440  
  4441  `,
  4442  		HLSL: "DXBCxH\xc4I\xbe\x0f[|\nl\x899\xe0\xb8\xcb?\x01\x00\x00\x00\xdc\x04\x00\x00\x06\x00\x00\x008\x00\x00\x00L\x01\x00\x00\xc4\x02\x00\x00@\x03\x00\x008\x04\x00\x00\x84\x04\x00\x00Aon9\f\x01\x00\x00\f\x01\x00\x00\x00\x02\xfe\xff\xd8\x00\x00\x004\x00\x00\x00\x01\x00$\x00\x00\x000\x00\x00\x000\x00\x00\x00$\x00\x01\x000\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xfe\xffQ\x00\x00\x05\x03\x00\x0f\xa0\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x80\xbf\x00\x00\x00\x00\x1f\x00\x00\x02\x05\x00\x00\x80\x00\x00\x0f\x90\x1f\x00\x00\x02\x05\x00\x01\x80\x01\x00\x0f\x90\x04\x00\x00\x04\x00\x00\x03\x80\x01\x00U\x90\x03\x00\xe4\xa0\x03\x00\xe1\xa0\x05\x00\x00\x03\x00\x00\x03\x80\x00\x00\xe4\x80\x03\x00\xe2\xa0\x02\x00\x00\x03\x00\x00\x02\x80\x00\x00U\x80\x00\x00\x00\x80\x01\x00\x00\x02\x00\x00\x01\x80\x01\x00\x00\x90\x04\x00\x00\x04\x00\x00\x03\x80\x00\x00\xe4\x80\x02\x00\xe4\xa0\x02\x00\xee\xa0\x01\x00\x00\x02\x00\x00\x04\x80\x03\x00\x00\xa0\b\x00\x00\x03\x00\x00\b\x80\x03\x00ɠ\x00\x00\xe4\x80\x04\x00\x00\x04\x00\x00\x03\xe0\x00\x00\xec\x80\x01\x00\xe4\xa0\x01\x00\xee\xa0\x02\x00\x00\x03\x00\x00\x03\xc0\x00\x00\xe4\x90\x00\x00\xe4\xa0\x01\x00\x00\x02\x00\x00\f\xc0\x03\x00\x00\xa0\xff\xff\x00\x00SHDRp\x01\x00\x00@\x00\x01\x00\\\x00\x00\x00Y\x00\x00\x04F\x8e \x00\x00\x00\x00\x00\x02\x00\x00\x00_\x00\x00\x032\x10\x10\x00\x00\x00\x00\x00_\x00\x00\x032\x10\x10\x00\x01\x00\x00\x00e\x00\x00\x032 \x10\x00\x00\x00\x00\x00g\x00\x00\x04\xf2 \x10\x00\x01\x00\x00\x00\x01\x00\x00\x00h\x00\x00\x02\x01\x00\x00\x006\x00\x00\x05\"\x00\x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x80?6\x00\x00\x05R\x00\x10\x00\x00\x00\x00\x00V\x14\x10\x00\x01\x00\x00\x00\x0f\x00\x00\n\x82\x00\x10\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x80\xbf\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00F\x00\x10\x00\x00\x00\x00\x002\x00\x00\v2\x00\x10\x00\x00\x00\x00\x00\xe6\n\x10\x00\x00\x00\x00\x00F\x80 \x00\x00\x00\x00\x00\x01\x00\x00\x00\xe6\x8a \x00\x00\x00\x00\x00\x01\x00\x00\x006\x00\x00\x05B\x00\x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x80?\x0f\x00\x00\n\x82\x00\x10\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x80\xbf\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x96\x05\x10\x00\x00\x00\x00\x002\x00\x00\v2 \x10\x00\x00\x00\x00\x00\xc6\x00\x10\x00\x00\x00\x00\x00F\x80 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x8a \x00\x00\x00\x00\x00\x00\x00\x00\x006\x00\x00\x052 \x10\x00\x01\x00\x00\x00F\x10\x10\x00\x00\x00\x00\x006\x00\x00\b\xc2 \x10\x00\x01\x00\x00\x00\x02@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x80?>\x00\x00\x01STATt\x00\x00\x00\n\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEF\xf0\x00\x00\x00\x01\x00\x00\x00D\x00\x00\x00\x01\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xfe\xff\x00\x01\x00\x00\xc6\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00Block\x00\xab\xab<\x00\x00\x00\x02\x00\x00\x00\\\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00_block_uvTransform\x00\xab\x01\x00\x03\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00_block_subUVTransform\x00Microsoft (R) HLSL Shader Compiler 10.1\x00\xab\xabISGND\x00\x00\x00\x02\x00\x00\x00\b\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x008\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x03\x03\x00\x00TEXCOORD\x00\xab\xab\xabOSGNP\x00\x00\x00\x02\x00\x00\x00\b\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\f\x00\x00A\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x0f\x00\x00\x00TEXCOORD\x00SV_Position\x00\xab\xab\xab",
  4443  	}
  4444  	shader_kernel4_comp = driver.ShaderSources{
  4445  		Name: "kernel4.comp",
  4446  		GLSL310ES: `#version 310 es
  4447  layout(local_size_x = 16, local_size_y = 8, local_size_z = 1) in;
  4448  
  4449  struct Alloc
  4450  {
  4451      uint offset;
  4452  };
  4453  
  4454  struct CmdStrokeRef
  4455  {
  4456      uint offset;
  4457  };
  4458  
  4459  struct CmdStroke
  4460  {
  4461      uint tile_ref;
  4462      float half_width;
  4463  };
  4464  
  4465  struct CmdFillRef
  4466  {
  4467      uint offset;
  4468  };
  4469  
  4470  struct CmdFill
  4471  {
  4472      uint tile_ref;
  4473      int backdrop;
  4474  };
  4475  
  4476  struct CmdColorRef
  4477  {
  4478      uint offset;
  4479  };
  4480  
  4481  struct CmdColor
  4482  {
  4483      uint rgba_color;
  4484  };
  4485  
  4486  struct CmdImageRef
  4487  {
  4488      uint offset;
  4489  };
  4490  
  4491  struct CmdImage
  4492  {
  4493      uint index;
  4494      ivec2 offset;
  4495  };
  4496  
  4497  struct CmdAlphaRef
  4498  {
  4499      uint offset;
  4500  };
  4501  
  4502  struct CmdAlpha
  4503  {
  4504      float alpha;
  4505  };
  4506  
  4507  struct CmdJumpRef
  4508  {
  4509      uint offset;
  4510  };
  4511  
  4512  struct CmdJump
  4513  {
  4514      uint new_ref;
  4515  };
  4516  
  4517  struct CmdRef
  4518  {
  4519      uint offset;
  4520  };
  4521  
  4522  struct CmdTag
  4523  {
  4524      uint tag;
  4525      uint flags;
  4526  };
  4527  
  4528  struct TileSegRef
  4529  {
  4530      uint offset;
  4531  };
  4532  
  4533  struct TileSeg
  4534  {
  4535      vec2 origin;
  4536      vec2 vector;
  4537      float y_edge;
  4538      TileSegRef next;
  4539  };
  4540  
  4541  struct Config
  4542  {
  4543      uint n_elements;
  4544      uint n_pathseg;
  4545      uint width_in_tiles;
  4546      uint height_in_tiles;
  4547      Alloc tile_alloc;
  4548      Alloc bin_alloc;
  4549      Alloc ptcl_alloc;
  4550      Alloc pathseg_alloc;
  4551      Alloc anno_alloc;
  4552      Alloc trans_alloc;
  4553  };
  4554  
  4555  layout(binding = 0, std430) buffer Memory
  4556  {
  4557      uint mem_offset;
  4558      uint mem_error;
  4559      uint memory[];
  4560  } _198;
  4561  
  4562  layout(binding = 1, std430) restrict readonly buffer ConfigBuf
  4563  {
  4564      Config conf;
  4565  } _686;
  4566  
  4567  layout(binding = 3, rgba8) uniform restrict readonly highp image2D images[1];
  4568  layout(binding = 2, rgba8) uniform restrict writeonly highp image2D image;
  4569  
  4570  Alloc slice_mem(Alloc a, uint offset, uint size)
  4571  {
  4572      return Alloc(a.offset + offset);
  4573  }
  4574  
  4575  bool touch_mem(Alloc alloc, uint offset)
  4576  {
  4577      return true;
  4578  }
  4579  
  4580  uint read_mem(Alloc alloc, uint offset)
  4581  {
  4582      Alloc param = alloc;
  4583      uint param_1 = offset;
  4584      if (!touch_mem(param, param_1))
  4585      {
  4586          return 0u;
  4587      }
  4588      uint v = _198.memory[offset];
  4589      return v;
  4590  }
  4591  
  4592  Alloc alloc_read(Alloc a, uint offset)
  4593  {
  4594      Alloc param = a;
  4595      uint param_1 = offset >> uint(2);
  4596      Alloc alloc;
  4597      alloc.offset = read_mem(param, param_1);
  4598      return alloc;
  4599  }
  4600  
  4601  CmdTag Cmd_tag(Alloc a, CmdRef ref)
  4602  {
  4603      Alloc param = a;
  4604      uint param_1 = ref.offset >> uint(2);
  4605      uint tag_and_flags = read_mem(param, param_1);
  4606      return CmdTag(tag_and_flags & 65535u, tag_and_flags >> uint(16));
  4607  }
  4608  
  4609  CmdStroke CmdStroke_read(Alloc a, CmdStrokeRef ref)
  4610  {
  4611      uint ix = ref.offset >> uint(2);
  4612      Alloc param = a;
  4613      uint param_1 = ix + 0u;
  4614      uint raw0 = read_mem(param, param_1);
  4615      Alloc param_2 = a;
  4616      uint param_3 = ix + 1u;
  4617      uint raw1 = read_mem(param_2, param_3);
  4618      CmdStroke s;
  4619      s.tile_ref = raw0;
  4620      s.half_width = uintBitsToFloat(raw1);
  4621      return s;
  4622  }
  4623  
  4624  CmdStroke Cmd_Stroke_read(Alloc a, CmdRef ref)
  4625  {
  4626      Alloc param = a;
  4627      CmdStrokeRef param_1 = CmdStrokeRef(ref.offset + 4u);
  4628      return CmdStroke_read(param, param_1);
  4629  }
  4630  
  4631  Alloc new_alloc(uint offset, uint size, bool mem_ok)
  4632  {
  4633      Alloc a;
  4634      a.offset = offset;
  4635      return a;
  4636  }
  4637  
  4638  TileSeg TileSeg_read(Alloc a, TileSegRef ref)
  4639  {
  4640      uint ix = ref.offset >> uint(2);
  4641      Alloc param = a;
  4642      uint param_1 = ix + 0u;
  4643      uint raw0 = read_mem(param, param_1);
  4644      Alloc param_2 = a;
  4645      uint param_3 = ix + 1u;
  4646      uint raw1 = read_mem(param_2, param_3);
  4647      Alloc param_4 = a;
  4648      uint param_5 = ix + 2u;
  4649      uint raw2 = read_mem(param_4, param_5);
  4650      Alloc param_6 = a;
  4651      uint param_7 = ix + 3u;
  4652      uint raw3 = read_mem(param_6, param_7);
  4653      Alloc param_8 = a;
  4654      uint param_9 = ix + 4u;
  4655      uint raw4 = read_mem(param_8, param_9);
  4656      Alloc param_10 = a;
  4657      uint param_11 = ix + 5u;
  4658      uint raw5 = read_mem(param_10, param_11);
  4659      TileSeg s;
  4660      s.origin = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1));
  4661      s.vector = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3));
  4662      s.y_edge = uintBitsToFloat(raw4);
  4663      s.next = TileSegRef(raw5);
  4664      return s;
  4665  }
  4666  
  4667  uvec2 chunk_offset(uint i)
  4668  {
  4669      return uvec2((i % 2u) * 16u, (i / 2u) * 8u);
  4670  }
  4671  
  4672  CmdFill CmdFill_read(Alloc a, CmdFillRef ref)
  4673  {
  4674      uint ix = ref.offset >> uint(2);
  4675      Alloc param = a;
  4676      uint param_1 = ix + 0u;
  4677      uint raw0 = read_mem(param, param_1);
  4678      Alloc param_2 = a;
  4679      uint param_3 = ix + 1u;
  4680      uint raw1 = read_mem(param_2, param_3);
  4681      CmdFill s;
  4682      s.tile_ref = raw0;
  4683      s.backdrop = int(raw1);
  4684      return s;
  4685  }
  4686  
  4687  CmdFill Cmd_Fill_read(Alloc a, CmdRef ref)
  4688  {
  4689      Alloc param = a;
  4690      CmdFillRef param_1 = CmdFillRef(ref.offset + 4u);
  4691      return CmdFill_read(param, param_1);
  4692  }
  4693  
  4694  CmdAlpha CmdAlpha_read(Alloc a, CmdAlphaRef ref)
  4695  {
  4696      uint ix = ref.offset >> uint(2);
  4697      Alloc param = a;
  4698      uint param_1 = ix + 0u;
  4699      uint raw0 = read_mem(param, param_1);
  4700      CmdAlpha s;
  4701      s.alpha = uintBitsToFloat(raw0);
  4702      return s;
  4703  }
  4704  
  4705  CmdAlpha Cmd_Alpha_read(Alloc a, CmdRef ref)
  4706  {
  4707      Alloc param = a;
  4708      CmdAlphaRef param_1 = CmdAlphaRef(ref.offset + 4u);
  4709      return CmdAlpha_read(param, param_1);
  4710  }
  4711  
  4712  CmdColor CmdColor_read(Alloc a, CmdColorRef ref)
  4713  {
  4714      uint ix = ref.offset >> uint(2);
  4715      Alloc param = a;
  4716      uint param_1 = ix + 0u;
  4717      uint raw0 = read_mem(param, param_1);
  4718      CmdColor s;
  4719      s.rgba_color = raw0;
  4720      return s;
  4721  }
  4722  
  4723  CmdColor Cmd_Color_read(Alloc a, CmdRef ref)
  4724  {
  4725      Alloc param = a;
  4726      CmdColorRef param_1 = CmdColorRef(ref.offset + 4u);
  4727      return CmdColor_read(param, param_1);
  4728  }
  4729  
  4730  mediump vec3 fromsRGB(mediump vec3 srgb)
  4731  {
  4732      bvec3 cutoff = greaterThanEqual(srgb, vec3(0.040449999272823333740234375));
  4733      mediump vec3 below = srgb / vec3(12.9200000762939453125);
  4734      mediump vec3 above = pow((srgb + vec3(0.054999999701976776123046875)) / vec3(1.05499994754791259765625), vec3(2.400000095367431640625));
  4735      return mix(below, above, cutoff);
  4736  }
  4737  
  4738  mediump vec4 unpacksRGB(uint srgba)
  4739  {
  4740      mediump vec4 color = unpackUnorm4x8(srgba).wzyx;
  4741      mediump vec3 param = color.xyz;
  4742      return vec4(fromsRGB(param), color.w);
  4743  }
  4744  
  4745  CmdImage CmdImage_read(Alloc a, CmdImageRef ref)
  4746  {
  4747      uint ix = ref.offset >> uint(2);
  4748      Alloc param = a;
  4749      uint param_1 = ix + 0u;
  4750      uint raw0 = read_mem(param, param_1);
  4751      Alloc param_2 = a;
  4752      uint param_3 = ix + 1u;
  4753      uint raw1 = read_mem(param_2, param_3);
  4754      CmdImage s;
  4755      s.index = raw0;
  4756      s.offset = ivec2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16);
  4757      return s;
  4758  }
  4759  
  4760  CmdImage Cmd_Image_read(Alloc a, CmdRef ref)
  4761  {
  4762      Alloc param = a;
  4763      CmdImageRef param_1 = CmdImageRef(ref.offset + 4u);
  4764      return CmdImage_read(param, param_1);
  4765  }
  4766  
  4767  mediump vec4[8] fillImage(uvec2 xy, CmdImage cmd_img)
  4768  {
  4769      mediump vec4 rgba[8];
  4770      for (uint i = 0u; i < 8u; i++)
  4771      {
  4772          uint param = i;
  4773          ivec2 uv = ivec2(xy + chunk_offset(param)) + cmd_img.offset;
  4774          mediump vec4 fg_rgba = imageLoad(images[0], uv);
  4775          mediump vec3 param_1 = fg_rgba.xyz;
  4776          mediump vec3 _662 = fromsRGB(param_1);
  4777          fg_rgba = vec4(_662.x, _662.y, _662.z, fg_rgba.w);
  4778          rgba[i] = fg_rgba;
  4779      }
  4780      return rgba;
  4781  }
  4782  
  4783  mediump vec3 tosRGB(mediump vec3 rgb)
  4784  {
  4785      bvec3 cutoff = greaterThanEqual(rgb, vec3(0.003130800090730190277099609375));
  4786      mediump vec3 below = vec3(12.9200000762939453125) * rgb;
  4787      mediump vec3 above = (vec3(1.05499994754791259765625) * pow(rgb, vec3(0.416660010814666748046875))) - vec3(0.054999999701976776123046875);
  4788      return mix(below, above, cutoff);
  4789  }
  4790  
  4791  uint packsRGB(inout mediump vec4 rgba)
  4792  {
  4793      mediump vec3 param = rgba.xyz;
  4794      rgba = vec4(tosRGB(param), rgba.w);
  4795      return packUnorm4x8(rgba.wzyx);
  4796  }
  4797  
  4798  void write_mem(Alloc alloc, uint offset, uint val)
  4799  {
  4800      Alloc param = alloc;
  4801      uint param_1 = offset;
  4802      if (!touch_mem(param, param_1))
  4803      {
  4804          return;
  4805      }
  4806      _198.memory[offset] = val;
  4807  }
  4808  
  4809  CmdJump CmdJump_read(Alloc a, CmdJumpRef ref)
  4810  {
  4811      uint ix = ref.offset >> uint(2);
  4812      Alloc param = a;
  4813      uint param_1 = ix + 0u;
  4814      uint raw0 = read_mem(param, param_1);
  4815      CmdJump s;
  4816      s.new_ref = raw0;
  4817      return s;
  4818  }
  4819  
  4820  CmdJump Cmd_Jump_read(Alloc a, CmdRef ref)
  4821  {
  4822      Alloc param = a;
  4823      CmdJumpRef param_1 = CmdJumpRef(ref.offset + 4u);
  4824      return CmdJump_read(param, param_1);
  4825  }
  4826  
  4827  void main()
  4828  {
  4829      uint tile_ix = (gl_WorkGroupID.y * _686.conf.width_in_tiles) + gl_WorkGroupID.x;
  4830      Alloc param;
  4831      param.offset = _686.conf.ptcl_alloc.offset;
  4832      uint param_1 = tile_ix * 1024u;
  4833      uint param_2 = 1024u;
  4834      Alloc cmd_alloc = slice_mem(param, param_1, param_2);
  4835      CmdRef cmd_ref = CmdRef(cmd_alloc.offset);
  4836      Alloc param_3 = cmd_alloc;
  4837      uint param_4 = cmd_ref.offset;
  4838      Alloc scratch_alloc = alloc_read(param_3, param_4);
  4839      cmd_ref.offset += 8u;
  4840      uvec2 xy_uint = uvec2(gl_LocalInvocationID.x + (32u * gl_WorkGroupID.x), gl_LocalInvocationID.y + (32u * gl_WorkGroupID.y));
  4841      vec2 xy = vec2(xy_uint);
  4842      mediump vec4 rgba[8];
  4843      for (uint i = 0u; i < 8u; i++)
  4844      {
  4845          rgba[i] = vec4(0.0);
  4846      }
  4847      uint clip_depth = 0u;
  4848      bool mem_ok = _198.mem_error == 0u;
  4849      mediump float df[8];
  4850      TileSegRef tile_seg_ref;
  4851      mediump float area[8];
  4852      uint base_ix;
  4853      while (mem_ok)
  4854      {
  4855          Alloc param_5 = cmd_alloc;
  4856          CmdRef param_6 = cmd_ref;
  4857          uint tag = Cmd_tag(param_5, param_6).tag;
  4858          if (tag == 0u)
  4859          {
  4860              break;
  4861          }
  4862          switch (tag)
  4863          {
  4864              case 2u:
  4865              {
  4866                  Alloc param_7 = cmd_alloc;
  4867                  CmdRef param_8 = cmd_ref;
  4868                  CmdStroke stroke = Cmd_Stroke_read(param_7, param_8);
  4869                  for (uint k = 0u; k < 8u; k++)
  4870                  {
  4871                      df[k] = 1000000000.0;
  4872                  }
  4873                  tile_seg_ref = TileSegRef(stroke.tile_ref);
  4874                  do
  4875                  {
  4876                      uint param_9 = tile_seg_ref.offset;
  4877                      uint param_10 = 24u;
  4878                      bool param_11 = mem_ok;
  4879                      Alloc param_12 = new_alloc(param_9, param_10, param_11);
  4880                      TileSegRef param_13 = tile_seg_ref;
  4881                      TileSeg seg = TileSeg_read(param_12, param_13);
  4882                      vec2 line_vec = seg.vector;
  4883                      for (uint k_1 = 0u; k_1 < 8u; k_1++)
  4884                      {
  4885                          vec2 dpos = (xy + vec2(0.5)) - seg.origin;
  4886                          uint param_14 = k_1;
  4887                          dpos += vec2(chunk_offset(param_14));
  4888                          float t = clamp(dot(line_vec, dpos) / dot(line_vec, line_vec), 0.0, 1.0);
  4889                          df[k_1] = min(df[k_1], length((line_vec * t) - dpos));
  4890                      }
  4891                      tile_seg_ref = seg.next;
  4892                  } while (tile_seg_ref.offset != 0u);
  4893                  for (uint k_2 = 0u; k_2 < 8u; k_2++)
  4894                  {
  4895                      area[k_2] = clamp((stroke.half_width + 0.5) - df[k_2], 0.0, 1.0);
  4896                  }
  4897                  cmd_ref.offset += 12u;
  4898                  break;
  4899              }
  4900              case 1u:
  4901              {
  4902                  Alloc param_15 = cmd_alloc;
  4903                  CmdRef param_16 = cmd_ref;
  4904                  CmdFill fill = Cmd_Fill_read(param_15, param_16);
  4905                  for (uint k_3 = 0u; k_3 < 8u; k_3++)
  4906                  {
  4907                      area[k_3] = float(fill.backdrop);
  4908                  }
  4909                  tile_seg_ref = TileSegRef(fill.tile_ref);
  4910                  do
  4911                  {
  4912                      uint param_17 = tile_seg_ref.offset;
  4913                      uint param_18 = 24u;
  4914                      bool param_19 = mem_ok;
  4915                      Alloc param_20 = new_alloc(param_17, param_18, param_19);
  4916                      TileSegRef param_21 = tile_seg_ref;
  4917                      TileSeg seg_1 = TileSeg_read(param_20, param_21);
  4918                      for (uint k_4 = 0u; k_4 < 8u; k_4++)
  4919                      {
  4920                          uint param_22 = k_4;
  4921                          vec2 my_xy = xy + vec2(chunk_offset(param_22));
  4922                          vec2 start = seg_1.origin - my_xy;
  4923                          vec2 end = start + seg_1.vector;
  4924                          vec2 window = clamp(vec2(start.y, end.y), vec2(0.0), vec2(1.0));
  4925                          if (!(window.x == window.y))
  4926                          {
  4927                              vec2 t_1 = (window - vec2(start.y)) / vec2(seg_1.vector.y);
  4928                              vec2 xs = vec2(mix(start.x, end.x, t_1.x), mix(start.x, end.x, t_1.y));
  4929                              float xmin = min(min(xs.x, xs.y), 1.0) - 9.9999999747524270787835121154785e-07;
  4930                              float xmax = max(xs.x, xs.y);
  4931                              float b = min(xmax, 1.0);
  4932                              float c = max(b, 0.0);
  4933                              float d = max(xmin, 0.0);
  4934                              float a = ((b + (0.5 * ((d * d) - (c * c)))) - xmin) / (xmax - xmin);
  4935                              area[k_4] += (a * (window.x - window.y));
  4936                          }
  4937                          area[k_4] += (sign(seg_1.vector.x) * clamp((my_xy.y - seg_1.y_edge) + 1.0, 0.0, 1.0));
  4938                      }
  4939                      tile_seg_ref = seg_1.next;
  4940                  } while (tile_seg_ref.offset != 0u);
  4941                  for (uint k_5 = 0u; k_5 < 8u; k_5++)
  4942                  {
  4943                      area[k_5] = min(abs(area[k_5]), 1.0);
  4944                  }
  4945                  cmd_ref.offset += 12u;
  4946                  break;
  4947              }
  4948              case 3u:
  4949              {
  4950                  for (uint k_6 = 0u; k_6 < 8u; k_6++)
  4951                  {
  4952                      area[k_6] = 1.0;
  4953                  }
  4954                  cmd_ref.offset += 4u;
  4955                  break;
  4956              }
  4957              case 4u:
  4958              {
  4959                  Alloc param_23 = cmd_alloc;
  4960                  CmdRef param_24 = cmd_ref;
  4961                  CmdAlpha alpha = Cmd_Alpha_read(param_23, param_24);
  4962                  for (uint k_7 = 0u; k_7 < 8u; k_7++)
  4963                  {
  4964                      area[k_7] = alpha.alpha;
  4965                  }
  4966                  cmd_ref.offset += 8u;
  4967                  break;
  4968              }
  4969              case 5u:
  4970              {
  4971                  Alloc param_25 = cmd_alloc;
  4972                  CmdRef param_26 = cmd_ref;
  4973                  CmdColor color = Cmd_Color_read(param_25, param_26);
  4974                  uint param_27 = color.rgba_color;
  4975                  mediump vec4 fg = unpacksRGB(param_27);
  4976                  for (uint k_8 = 0u; k_8 < 8u; k_8++)
  4977                  {
  4978                      mediump vec4 fg_k = fg * area[k_8];
  4979                      rgba[k_8] = (rgba[k_8] * (1.0 - fg_k.w)) + fg_k;
  4980                  }
  4981                  cmd_ref.offset += 8u;
  4982                  break;
  4983              }
  4984              case 6u:
  4985              {
  4986                  Alloc param_28 = cmd_alloc;
  4987                  CmdRef param_29 = cmd_ref;
  4988                  CmdImage fill_img = Cmd_Image_read(param_28, param_29);
  4989                  uvec2 param_30 = xy_uint;
  4990                  CmdImage param_31 = fill_img;
  4991                  mediump vec4 img[8] = fillImage(param_30, param_31);
  4992                  for (uint k_9 = 0u; k_9 < 8u; k_9++)
  4993                  {
  4994                      mediump vec4 fg_k_1 = img[k_9] * area[k_9];
  4995                      rgba[k_9] = (rgba[k_9] * (1.0 - fg_k_1.w)) + fg_k_1;
  4996                  }
  4997                  cmd_ref.offset += 12u;
  4998                  break;
  4999              }
  5000              case 7u:
  5001              {
  5002                  base_ix = (scratch_alloc.offset >> uint(2)) + (2u * ((((clip_depth * 32u) * 32u) + gl_LocalInvocationID.x) + (32u * gl_LocalInvocationID.y)));
  5003                  for (uint k_10 = 0u; k_10 < 8u; k_10++)
  5004                  {
  5005                      uint param_32 = k_10;
  5006                      uvec2 offset = chunk_offset(param_32);
  5007                      mediump vec4 param_33 = vec4(rgba[k_10]);
  5008                      uint _1288 = packsRGB(param_33);
  5009                      uint srgb = _1288;
  5010                      mediump float alpha_1 = clamp(abs(area[k_10]), 0.0, 1.0);
  5011                      Alloc param_34 = scratch_alloc;
  5012                      uint param_35 = (base_ix + 0u) + (2u * (offset.x + (offset.y * 32u)));
  5013                      uint param_36 = srgb;
  5014                      write_mem(param_34, param_35, param_36);
  5015                      Alloc param_37 = scratch_alloc;
  5016                      uint param_38 = (base_ix + 1u) + (2u * (offset.x + (offset.y * 32u)));
  5017                      uint param_39 = floatBitsToUint(alpha_1);
  5018                      write_mem(param_37, param_38, param_39);
  5019                      rgba[k_10] = vec4(0.0);
  5020                  }
  5021                  clip_depth++;
  5022                  cmd_ref.offset += 4u;
  5023                  break;
  5024              }
  5025              case 8u:
  5026              {
  5027                  clip_depth--;
  5028                  base_ix = (scratch_alloc.offset >> uint(2)) + (2u * ((((clip_depth * 32u) * 32u) + gl_LocalInvocationID.x) + (32u * gl_LocalInvocationID.y)));
  5029                  for (uint k_11 = 0u; k_11 < 8u; k_11++)
  5030                  {
  5031                      uint param_40 = k_11;
  5032                      uvec2 offset_1 = chunk_offset(param_40);
  5033                      Alloc param_41 = scratch_alloc;
  5034                      uint param_42 = (base_ix + 0u) + (2u * (offset_1.x + (offset_1.y * 32u)));
  5035                      uint srgb_1 = read_mem(param_41, param_42);
  5036                      Alloc param_43 = scratch_alloc;
  5037                      uint param_44 = (base_ix + 1u) + (2u * (offset_1.x + (offset_1.y * 32u)));
  5038                      uint alpha_2 = read_mem(param_43, param_44);
  5039                      uint param_45 = srgb_1;
  5040                      mediump vec4 bg = unpacksRGB(param_45);
  5041                      mediump vec4 fg_1 = (rgba[k_11] * area[k_11]) * uintBitsToFloat(alpha_2);
  5042                      rgba[k_11] = (bg * (1.0 - fg_1.w)) + fg_1;
  5043                  }
  5044                  cmd_ref.offset += 4u;
  5045                  break;
  5046              }
  5047              case 9u:
  5048              {
  5049                  Alloc param_46 = cmd_alloc;
  5050                  CmdRef param_47 = cmd_ref;
  5051                  cmd_ref = CmdRef(Cmd_Jump_read(param_46, param_47).new_ref);
  5052                  cmd_alloc.offset = cmd_ref.offset;
  5053                  break;
  5054              }
  5055          }
  5056      }
  5057      for (uint i_1 = 0u; i_1 < 8u; i_1++)
  5058      {
  5059          uint param_48 = i_1;
  5060          mediump vec3 param_49 = rgba[i_1].xyz;
  5061          imageStore(image, ivec2(xy_uint + chunk_offset(param_48)), vec4(tosRGB(param_49), rgba[i_1].w));
  5062      }
  5063  }
  5064  
  5065  `,
  5066  	}
  5067  	shader_material_frag = driver.ShaderSources{
  5068  		Name:     "material.frag",
  5069  		Inputs:   []driver.InputLocation{{Name: "vUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}},
  5070  		Textures: []driver.TextureBinding{{Name: "tex", Binding: 0}},
  5071  		GLSL100ES: `#version 100
  5072  precision mediump float;
  5073  precision highp int;
  5074  
  5075  uniform mediump sampler2D tex;
  5076  
  5077  varying vec2 vUV;
  5078  
  5079  vec3 RGBtosRGB(vec3 rgb)
  5080  {
  5081      bvec3 cutoff = greaterThanEqual(rgb, vec3(0.003130800090730190277099609375));
  5082      vec3 below = vec3(12.9200000762939453125) * rgb;
  5083      vec3 above = (vec3(1.05499994754791259765625) * pow(rgb, vec3(0.416660010814666748046875))) - vec3(0.054999999701976776123046875);
  5084      return vec3(cutoff.x ? above.x : below.x, cutoff.y ? above.y : below.y, cutoff.z ? above.z : below.z);
  5085  }
  5086  
  5087  void main()
  5088  {
  5089      vec4 texel = texture2D(tex, vUV);
  5090      vec3 param = texel.xyz;
  5091      vec3 _59 = RGBtosRGB(param);
  5092      texel = vec4(_59.x, _59.y, _59.z, texel.w);
  5093      gl_FragData[0] = texel;
  5094  }
  5095  
  5096  `,
  5097  		GLSL300ES: `#version 300 es
  5098  precision mediump float;
  5099  precision highp int;
  5100  
  5101  uniform mediump sampler2D tex;
  5102  
  5103  in vec2 vUV;
  5104  layout(location = 0) out vec4 fragColor;
  5105  
  5106  vec3 RGBtosRGB(vec3 rgb)
  5107  {
  5108      bvec3 cutoff = greaterThanEqual(rgb, vec3(0.003130800090730190277099609375));
  5109      vec3 below = vec3(12.9200000762939453125) * rgb;
  5110      vec3 above = (vec3(1.05499994754791259765625) * pow(rgb, vec3(0.416660010814666748046875))) - vec3(0.054999999701976776123046875);
  5111      return vec3(cutoff.x ? above.x : below.x, cutoff.y ? above.y : below.y, cutoff.z ? above.z : below.z);
  5112  }
  5113  
  5114  void main()
  5115  {
  5116      vec4 texel = texture(tex, vUV);
  5117      vec3 param = texel.xyz;
  5118      vec3 _59 = RGBtosRGB(param);
  5119      texel = vec4(_59.x, _59.y, _59.z, texel.w);
  5120      fragColor = texel;
  5121  }
  5122  
  5123  `,
  5124  		GLSL130: `#version 130
  5125  
  5126  uniform sampler2D tex;
  5127  
  5128  in vec2 vUV;
  5129  out vec4 fragColor;
  5130  
  5131  vec3 RGBtosRGB(vec3 rgb)
  5132  {
  5133      bvec3 cutoff = greaterThanEqual(rgb, vec3(0.003130800090730190277099609375));
  5134      vec3 below = vec3(12.9200000762939453125) * rgb;
  5135      vec3 above = (vec3(1.05499994754791259765625) * pow(rgb, vec3(0.416660010814666748046875))) - vec3(0.054999999701976776123046875);
  5136      return vec3(cutoff.x ? above.x : below.x, cutoff.y ? above.y : below.y, cutoff.z ? above.z : below.z);
  5137  }
  5138  
  5139  void main()
  5140  {
  5141      vec4 texel = texture(tex, vUV);
  5142      vec3 param = texel.xyz;
  5143      vec3 _59 = RGBtosRGB(param);
  5144      texel = vec4(_59.x, _59.y, _59.z, texel.w);
  5145      fragColor = texel;
  5146  }
  5147  
  5148  `,
  5149  		GLSL150: `#version 150
  5150  
  5151  uniform sampler2D tex;
  5152  
  5153  in vec2 vUV;
  5154  out vec4 fragColor;
  5155  
  5156  vec3 RGBtosRGB(vec3 rgb)
  5157  {
  5158      bvec3 cutoff = greaterThanEqual(rgb, vec3(0.003130800090730190277099609375));
  5159      vec3 below = vec3(12.9200000762939453125) * rgb;
  5160      vec3 above = (vec3(1.05499994754791259765625) * pow(rgb, vec3(0.416660010814666748046875))) - vec3(0.054999999701976776123046875);
  5161      return vec3(cutoff.x ? above.x : below.x, cutoff.y ? above.y : below.y, cutoff.z ? above.z : below.z);
  5162  }
  5163  
  5164  void main()
  5165  {
  5166      vec4 texel = texture(tex, vUV);
  5167      vec3 param = texel.xyz;
  5168      vec3 _59 = RGBtosRGB(param);
  5169      texel = vec4(_59.x, _59.y, _59.z, texel.w);
  5170      fragColor = texel;
  5171  }
  5172  
  5173  `,
  5174  		HLSL: "DXBC\x9e\x87LD\xf3\x17\n\x06\\\xb7\x98\x94\xa9PKe\x01\x00\x00\x00\xc8\x04\x00\x00\x06\x00\x00\x008\x00\x00\x00\xbc\x01\x00\x00D\x03\x00\x00\xc0\x03\x00\x00`\x04\x00\x00\x94\x04\x00\x00Aon9|\x01\x00\x00|\x01\x00\x00\x00\x02\xff\xffT\x01\x00\x00(\x00\x00\x00\x00\x00(\x00\x00\x00(\x00\x00\x00(\x00\x01\x00$\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x02\xff\xffQ\x00\x00\x05\x00\x00\x0f\xa0=\n\x87?\xaeGa\xbd\x00\x00\x00\x00\x00\x00\x00\x00Q\x00\x00\x05\x01\x00\x0f\xa0\x1c.M\xbbR\xb8NAvT\xd5>\x00\x00\x00\x00\x1f\x00\x00\x02\x00\x00\x00\x80\x00\x00\x03\xb0\x1f\x00\x00\x02\x00\x00\x00\x90\x00\b\x0f\xa0B\x00\x00\x03\x00\x00\x0f\x80\x00\x00\xe4\xb0\x00\b\xe4\xa0\x0f\x00\x00\x02\x01\x00\x01\x80\x00\x00\x00\x80\x0f\x00\x00\x02\x01\x00\x02\x80\x00\x00U\x80\x0f\x00\x00\x02\x01\x00\x04\x80\x00\x00\xaa\x80\x05\x00\x00\x03\x01\x00\a\x80\x01\x00\xe4\x80\x01\x00\xaa\xa0\x0e\x00\x00\x02\x02\x00\x01\x80\x01\x00\x00\x80\x0e\x00\x00\x02\x02\x00\x02\x80\x01\x00U\x80\x0e\x00\x00\x02\x02\x00\x04\x80\x01\x00\xaa\x80\x04\x00\x00\x04\x01\x00\a\x80\x02\x00\xe4\x80\x00\x00\x00\xa0\x00\x00U\xa0\x02\x00\x00\x03\x01\x00\b\x80\x00\x00\x00\x80\x01\x00\x00\xa0\x05\x00\x00\x03\x02\x00\a\x80\x00\x00\xe4\x80\x01\x00U\xa0X\x00\x00\x04\x00\x00\x01\x80\x01\x00\xff\x80\x01\x00\x00\x80\x02\x00\x00\x80\x02\x00\x00\x03\x01\x00\x01\x80\x00\x00U\x80\x01\x00\x00\xa0X\x00\x00\x04\x00\x00\x02\x80\x01\x00\x00\x80\x01\x00U\x80\x02\x00U\x80\x02\x00\x00\x03\x01\x00\x01\x80\x00\x00\xaa\x80\x01\x00\x00\xa0X\x00\x00\x04\x00\x00\x04\x80\x01\x00\x00\x80\x01\x00\xaa\x80\x02\x00\xaa\x80\x01\x00\x00\x02\x00\b\x0f\x80\x00\x00\xe4\x80\xff\xff\x00\x00SHDR\x80\x01\x00\x00@\x00\x00\x00`\x00\x00\x00Z\x00\x00\x03\x00`\x10\x00\x00\x00\x00\x00X\x18\x00\x04\x00p\x10\x00\x00\x00\x00\x00UU\x00\x00b\x10\x00\x032\x10\x10\x00\x00\x00\x00\x00e\x00\x00\x03\xf2 \x10\x00\x00\x00\x00\x00h\x00\x00\x02\x03\x00\x00\x00E\x00\x00\t\xf2\x00\x10\x00\x00\x00\x00\x00F\x10\x10\x00\x00\x00\x00\x00F~\x10\x00\x00\x00\x00\x00\x00`\x10\x00\x00\x00\x00\x00/\x00\x00\x05r\x00\x10\x00\x01\x00\x00\x00F\x02\x10\x00\x00\x00\x00\x008\x00\x00\nr\x00\x10\x00\x01\x00\x00\x00F\x02\x10\x00\x01\x00\x00\x00\x02@\x00\x00vT\xd5>vT\xd5>vT\xd5>\x00\x00\x00\x00\x19\x00\x00\x05r\x00\x10\x00\x01\x00\x00\x00F\x02\x10\x00\x01\x00\x00\x002\x00\x00\x0fr\x00\x10\x00\x01\x00\x00\x00F\x02\x10\x00\x01\x00\x00\x00\x02@\x00\x00=\n\x87?=\n\x87?=\n\x87?\x00\x00\x00\x00\x02@\x00\x00\xaeGa\xbd\xaeGa\xbd\xaeGa\xbd\x00\x00\x00\x00\x1d\x00\x00\nr\x00\x10\x00\x02\x00\x00\x00F\x02\x10\x00\x00\x00\x00\x00\x02@\x00\x00\x1c.M;\x1c.M;\x1c.M;\x00\x00\x00\x008\x00\x00\nr\x00\x10\x00\x00\x00\x00\x00F\x02\x10\x00\x00\x00\x00\x00\x02@\x00\x00R\xb8NAR\xb8NAR\xb8NA\x00\x00\x00\x006\x00\x00\x05\x82 \x10\x00\x00\x00\x00\x00:\x00\x10\x00\x00\x00\x00\x007\x00\x00\tr \x10\x00\x00\x00\x00\x00F\x02\x10\x00\x02\x00\x00\x00F\x02\x10\x00\x01\x00\x00\x00F\x02\x10\x00\x00\x00\x00\x00>\x00\x00\x01STATt\x00\x00\x00\n\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEF\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xff\xff\x00\x01\x00\x00m\x00\x00\x00\\\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00i\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x01\x00\x00\x00\r\x00\x00\x00_tex_sampler\x00tex\x00Microsoft (R) HLSL Shader Compiler 10.1\x00\xab\xab\xabISGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00TEXCOORD\x00\xab\xab\xabOSGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00SV_Target\x00\xab\xab",
  5175  	}
  5176  	shader_material_vert = driver.ShaderSources{
  5177  		Name:   "material.vert",
  5178  		Inputs: []driver.InputLocation{{Name: "pos", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "uv", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}},
  5179  		Uniforms: driver.UniformsReflection{
  5180  			Blocks:    []driver.UniformBlock{{Name: "Block", Binding: 0}},
  5181  			Locations: []driver.UniformLocation{{Name: "_block.transform", Type: 0x0, Size: 4, Offset: 0}},
  5182  			Size:      16,
  5183  		},
  5184  		GLSL100ES: `#version 100
  5185  
  5186  struct Block
  5187  {
  5188      vec4 transform;
  5189  };
  5190  
  5191  uniform Block _block;
  5192  
  5193  varying vec2 vUV;
  5194  attribute vec2 uv;
  5195  attribute vec2 pos;
  5196  
  5197  void main()
  5198  {
  5199      vUV = uv;
  5200      gl_Position = vec4((pos * _block.transform.xy) + _block.transform.zw, 0.0, 1.0);
  5201  }
  5202  
  5203  `,
  5204  		GLSL300ES: `#version 300 es
  5205  
  5206  layout(std140) uniform Block
  5207  {
  5208      vec4 transform;
  5209  } _block;
  5210  
  5211  out vec2 vUV;
  5212  layout(location = 1) in vec2 uv;
  5213  layout(location = 0) in vec2 pos;
  5214  
  5215  void main()
  5216  {
  5217      vUV = uv;
  5218      gl_Position = vec4((pos * _block.transform.xy) + _block.transform.zw, 0.0, 1.0);
  5219  }
  5220  
  5221  `,
  5222  		GLSL130: `#version 130
  5223  
  5224  struct Block
  5225  {
  5226      vec4 transform;
  5227  };
  5228  
  5229  uniform Block _block;
  5230  
  5231  out vec2 vUV;
  5232  in vec2 uv;
  5233  in vec2 pos;
  5234  
  5235  void main()
  5236  {
  5237      vUV = uv;
  5238      gl_Position = vec4((pos * _block.transform.xy) + _block.transform.zw, 0.0, 1.0);
  5239  }
  5240  
  5241  `,
  5242  		GLSL150: `#version 150
  5243  
  5244  layout(std140) uniform Block
  5245  {
  5246      vec4 transform;
  5247  } _block;
  5248  
  5249  out vec2 vUV;
  5250  in vec2 uv;
  5251  in vec2 pos;
  5252  
  5253  void main()
  5254  {
  5255      vUV = uv;
  5256      gl_Position = vec4((pos * _block.transform.xy) + _block.transform.zw, 0.0, 1.0);
  5257  }
  5258  
  5259  `,
  5260  		HLSL: "DXBCq\x961\x05q\xd1`\xea\xd4\xd2\xe1g\x9e\x84\\0\x01\x00\x00\x00\x88\x03\x00\x00\x06\x00\x00\x008\x00\x00\x00\xe8\x00\x00\x00\xa0\x01\x00\x00\x1c\x02\x00\x00\xe4\x02\x00\x000\x03\x00\x00Aon9\xa8\x00\x00\x00\xa8\x00\x00\x00\x00\x02\xfe\xfft\x00\x00\x004\x00\x00\x00\x01\x00$\x00\x00\x000\x00\x00\x000\x00\x00\x00$\x00\x01\x000\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xfe\xffQ\x00\x00\x05\x02\x00\x0f\xa0\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x02\x05\x00\x00\x80\x00\x00\x0f\x90\x1f\x00\x00\x02\x05\x00\x01\x80\x01\x00\x0f\x90\x04\x00\x00\x04\x00\x00\x03\x80\x00\x00\xe4\x90\x01\x00\xe4\xa0\x01\x00\xee\xa0\x02\x00\x00\x03\x00\x00\x03\xc0\x00\x00\xe4\x80\x00\x00\xe4\xa0\x01\x00\x00\x02\x00\x00\x03\xe0\x01\x00\xe4\x90\x01\x00\x00\x02\x00\x00\f\xc0\x02\x00D\xa0\xff\xff\x00\x00SHDR\xb0\x00\x00\x00@\x00\x01\x00,\x00\x00\x00Y\x00\x00\x04F\x8e \x00\x00\x00\x00\x00\x01\x00\x00\x00_\x00\x00\x032\x10\x10\x00\x00\x00\x00\x00_\x00\x00\x032\x10\x10\x00\x01\x00\x00\x00e\x00\x00\x032 \x10\x00\x00\x00\x00\x00g\x00\x00\x04\xf2 \x10\x00\x01\x00\x00\x00\x01\x00\x00\x006\x00\x00\x052 \x10\x00\x00\x00\x00\x00F\x10\x10\x00\x01\x00\x00\x002\x00\x00\v2 \x10\x00\x01\x00\x00\x00F\x10\x10\x00\x00\x00\x00\x00F\x80 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x8a \x00\x00\x00\x00\x00\x00\x00\x00\x006\x00\x00\b\xc2 \x10\x00\x01\x00\x00\x00\x02@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?>\x00\x00\x01STATt\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEF\xc0\x00\x00\x00\x01\x00\x00\x00D\x00\x00\x00\x01\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xfe\xff\x00\x01\x00\x00\x98\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00Block\x00\xab\xab<\x00\x00\x00\x01\x00\x00\x00\\\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00_block_transform\x00\xab\xab\xab\x01\x00\x03\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00Microsoft (R) HLSL Shader Compiler 10.1\x00ISGND\x00\x00\x00\x02\x00\x00\x00\b\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x008\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x03\x03\x00\x00TEXCOORD\x00\xab\xab\xabOSGNP\x00\x00\x00\x02\x00\x00\x00\b\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\f\x00\x00A\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x0f\x00\x00\x00TEXCOORD\x00SV_Position\x00\xab\xab\xab",
  5261  	}
  5262  	shader_path_coarse_comp = driver.ShaderSources{
  5263  		Name: "path_coarse.comp",
  5264  		GLSL310ES: `#version 310 es
  5265  layout(local_size_x = 32, local_size_y = 1, local_size_z = 1) in;
  5266  
  5267  struct Alloc
  5268  {
  5269      uint offset;
  5270  };
  5271  
  5272  struct MallocResult
  5273  {
  5274      Alloc alloc;
  5275      bool failed;
  5276  };
  5277  
  5278  struct PathCubicRef
  5279  {
  5280      uint offset;
  5281  };
  5282  
  5283  struct PathCubic
  5284  {
  5285      vec2 p0;
  5286      vec2 p1;
  5287      vec2 p2;
  5288      vec2 p3;
  5289      uint path_ix;
  5290      uint trans_ix;
  5291      vec2 stroke;
  5292  };
  5293  
  5294  struct PathSegRef
  5295  {
  5296      uint offset;
  5297  };
  5298  
  5299  struct PathSegTag
  5300  {
  5301      uint tag;
  5302      uint flags;
  5303  };
  5304  
  5305  struct TileRef
  5306  {
  5307      uint offset;
  5308  };
  5309  
  5310  struct PathRef
  5311  {
  5312      uint offset;
  5313  };
  5314  
  5315  struct Path
  5316  {
  5317      uvec4 bbox;
  5318      TileRef tiles;
  5319  };
  5320  
  5321  struct TileSegRef
  5322  {
  5323      uint offset;
  5324  };
  5325  
  5326  struct TileSeg
  5327  {
  5328      vec2 origin;
  5329      vec2 vector;
  5330      float y_edge;
  5331      TileSegRef next;
  5332  };
  5333  
  5334  struct TransformSegRef
  5335  {
  5336      uint offset;
  5337  };
  5338  
  5339  struct TransformSeg
  5340  {
  5341      vec4 mat;
  5342      vec2 translate;
  5343  };
  5344  
  5345  struct SubdivResult
  5346  {
  5347      float val;
  5348      float a0;
  5349      float a2;
  5350  };
  5351  
  5352  struct Config
  5353  {
  5354      uint n_elements;
  5355      uint n_pathseg;
  5356      uint width_in_tiles;
  5357      uint height_in_tiles;
  5358      Alloc tile_alloc;
  5359      Alloc bin_alloc;
  5360      Alloc ptcl_alloc;
  5361      Alloc pathseg_alloc;
  5362      Alloc anno_alloc;
  5363      Alloc trans_alloc;
  5364  };
  5365  
  5366  layout(binding = 0, std430) buffer Memory
  5367  {
  5368      uint mem_offset;
  5369      uint mem_error;
  5370      uint memory[];
  5371  } _145;
  5372  
  5373  layout(binding = 1, std430) readonly buffer ConfigBuf
  5374  {
  5375      Config conf;
  5376  } _787;
  5377  
  5378  bool touch_mem(Alloc alloc, uint offset)
  5379  {
  5380      return true;
  5381  }
  5382  
  5383  uint read_mem(Alloc alloc, uint offset)
  5384  {
  5385      Alloc param = alloc;
  5386      uint param_1 = offset;
  5387      if (!touch_mem(param, param_1))
  5388      {
  5389          return 0u;
  5390      }
  5391      uint v = _145.memory[offset];
  5392      return v;
  5393  }
  5394  
  5395  PathSegTag PathSeg_tag(Alloc a, PathSegRef ref)
  5396  {
  5397      Alloc param = a;
  5398      uint param_1 = ref.offset >> uint(2);
  5399      uint tag_and_flags = read_mem(param, param_1);
  5400      return PathSegTag(tag_and_flags & 65535u, tag_and_flags >> uint(16));
  5401  }
  5402  
  5403  PathCubic PathCubic_read(Alloc a, PathCubicRef ref)
  5404  {
  5405      uint ix = ref.offset >> uint(2);
  5406      Alloc param = a;
  5407      uint param_1 = ix + 0u;
  5408      uint raw0 = read_mem(param, param_1);
  5409      Alloc param_2 = a;
  5410      uint param_3 = ix + 1u;
  5411      uint raw1 = read_mem(param_2, param_3);
  5412      Alloc param_4 = a;
  5413      uint param_5 = ix + 2u;
  5414      uint raw2 = read_mem(param_4, param_5);
  5415      Alloc param_6 = a;
  5416      uint param_7 = ix + 3u;
  5417      uint raw3 = read_mem(param_6, param_7);
  5418      Alloc param_8 = a;
  5419      uint param_9 = ix + 4u;
  5420      uint raw4 = read_mem(param_8, param_9);
  5421      Alloc param_10 = a;
  5422      uint param_11 = ix + 5u;
  5423      uint raw5 = read_mem(param_10, param_11);
  5424      Alloc param_12 = a;
  5425      uint param_13 = ix + 6u;
  5426      uint raw6 = read_mem(param_12, param_13);
  5427      Alloc param_14 = a;
  5428      uint param_15 = ix + 7u;
  5429      uint raw7 = read_mem(param_14, param_15);
  5430      Alloc param_16 = a;
  5431      uint param_17 = ix + 8u;
  5432      uint raw8 = read_mem(param_16, param_17);
  5433      Alloc param_18 = a;
  5434      uint param_19 = ix + 9u;
  5435      uint raw9 = read_mem(param_18, param_19);
  5436      Alloc param_20 = a;
  5437      uint param_21 = ix + 10u;
  5438      uint raw10 = read_mem(param_20, param_21);
  5439      Alloc param_22 = a;
  5440      uint param_23 = ix + 11u;
  5441      uint raw11 = read_mem(param_22, param_23);
  5442      PathCubic s;
  5443      s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1));
  5444      s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3));
  5445      s.p2 = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5));
  5446      s.p3 = vec2(uintBitsToFloat(raw6), uintBitsToFloat(raw7));
  5447      s.path_ix = raw8;
  5448      s.trans_ix = raw9;
  5449      s.stroke = vec2(uintBitsToFloat(raw10), uintBitsToFloat(raw11));
  5450      return s;
  5451  }
  5452  
  5453  PathCubic PathSeg_Cubic_read(Alloc a, PathSegRef ref)
  5454  {
  5455      Alloc param = a;
  5456      PathCubicRef param_1 = PathCubicRef(ref.offset + 4u);
  5457      return PathCubic_read(param, param_1);
  5458  }
  5459  
  5460  TransformSeg TransformSeg_read(Alloc a, TransformSegRef ref)
  5461  {
  5462      uint ix = ref.offset >> uint(2);
  5463      Alloc param = a;
  5464      uint param_1 = ix + 0u;
  5465      uint raw0 = read_mem(param, param_1);
  5466      Alloc param_2 = a;
  5467      uint param_3 = ix + 1u;
  5468      uint raw1 = read_mem(param_2, param_3);
  5469      Alloc param_4 = a;
  5470      uint param_5 = ix + 2u;
  5471      uint raw2 = read_mem(param_4, param_5);
  5472      Alloc param_6 = a;
  5473      uint param_7 = ix + 3u;
  5474      uint raw3 = read_mem(param_6, param_7);
  5475      Alloc param_8 = a;
  5476      uint param_9 = ix + 4u;
  5477      uint raw4 = read_mem(param_8, param_9);
  5478      Alloc param_10 = a;
  5479      uint param_11 = ix + 5u;
  5480      uint raw5 = read_mem(param_10, param_11);
  5481      TransformSeg s;
  5482      s.mat = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
  5483      s.translate = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5));
  5484      return s;
  5485  }
  5486  
  5487  vec2 eval_cubic(vec2 p0, vec2 p1, vec2 p2, vec2 p3, float t)
  5488  {
  5489      float mt = 1.0 - t;
  5490      return (p0 * ((mt * mt) * mt)) + (((p1 * ((mt * mt) * 3.0)) + (((p2 * (mt * 3.0)) + (p3 * t)) * t)) * t);
  5491  }
  5492  
  5493  float approx_parabola_integral(float x)
  5494  {
  5495      return x * inversesqrt(sqrt(0.3300000131130218505859375 + (0.201511204242706298828125 + ((0.25 * x) * x))));
  5496  }
  5497  
  5498  SubdivResult estimate_subdiv(vec2 p0, vec2 p1, vec2 p2, float sqrt_tol)
  5499  {
  5500      vec2 d01 = p1 - p0;
  5501      vec2 d12 = p2 - p1;
  5502      vec2 dd = d01 - d12;
  5503      float _cross = ((p2.x - p0.x) * dd.y) - ((p2.y - p0.y) * dd.x);
  5504      float x0 = ((d01.x * dd.x) + (d01.y * dd.y)) / _cross;
  5505      float x2 = ((d12.x * dd.x) + (d12.y * dd.y)) / _cross;
  5506      float scale = abs(_cross / (length(dd) * (x2 - x0)));
  5507      float param = x0;
  5508      float a0 = approx_parabola_integral(param);
  5509      float param_1 = x2;
  5510      float a2 = approx_parabola_integral(param_1);
  5511      float val = 0.0;
  5512      if (scale < 1000000000.0)
  5513      {
  5514          float da = abs(a2 - a0);
  5515          float sqrt_scale = sqrt(scale);
  5516          if (sign(x0) == sign(x2))
  5517          {
  5518              val = da * sqrt_scale;
  5519          }
  5520          else
  5521          {
  5522              float xmin = sqrt_tol / sqrt_scale;
  5523              float param_2 = xmin;
  5524              val = (sqrt_tol * da) / approx_parabola_integral(param_2);
  5525          }
  5526      }
  5527      return SubdivResult(val, a0, a2);
  5528  }
  5529  
  5530  uint fill_mode_from_flags(uint flags)
  5531  {
  5532      return flags & 1u;
  5533  }
  5534  
  5535  Path Path_read(Alloc a, PathRef ref)
  5536  {
  5537      uint ix = ref.offset >> uint(2);
  5538      Alloc param = a;
  5539      uint param_1 = ix + 0u;
  5540      uint raw0 = read_mem(param, param_1);
  5541      Alloc param_2 = a;
  5542      uint param_3 = ix + 1u;
  5543      uint raw1 = read_mem(param_2, param_3);
  5544      Alloc param_4 = a;
  5545      uint param_5 = ix + 2u;
  5546      uint raw2 = read_mem(param_4, param_5);
  5547      Path s;
  5548      s.bbox = uvec4(raw0 & 65535u, raw0 >> uint(16), raw1 & 65535u, raw1 >> uint(16));
  5549      s.tiles = TileRef(raw2);
  5550      return s;
  5551  }
  5552  
  5553  Alloc new_alloc(uint offset, uint size, bool mem_ok)
  5554  {
  5555      Alloc a;
  5556      a.offset = offset;
  5557      return a;
  5558  }
  5559  
  5560  float approx_parabola_inv_integral(float x)
  5561  {
  5562      return x * sqrt(0.61000001430511474609375 + (0.1520999968051910400390625 + ((0.25 * x) * x)));
  5563  }
  5564  
  5565  vec2 eval_quad(vec2 p0, vec2 p1, vec2 p2, float t)
  5566  {
  5567      float mt = 1.0 - t;
  5568      return (p0 * (mt * mt)) + (((p1 * (mt * 2.0)) + (p2 * t)) * t);
  5569  }
  5570  
  5571  MallocResult malloc(uint size)
  5572  {
  5573      uint _151 = atomicAdd(_145.mem_offset, size);
  5574      uint offset = _151;
  5575      MallocResult r;
  5576      r.failed = (offset + size) > uint(int(uint(_145.memory.length())) * 4);
  5577      uint param = offset;
  5578      uint param_1 = size;
  5579      bool param_2 = !r.failed;
  5580      r.alloc = new_alloc(param, param_1, param_2);
  5581      if (r.failed)
  5582      {
  5583          uint _180 = atomicMax(_145.mem_error, 1u);
  5584          return r;
  5585      }
  5586      return r;
  5587  }
  5588  
  5589  TileRef Tile_index(TileRef ref, uint index)
  5590  {
  5591      return TileRef(ref.offset + (index * 8u));
  5592  }
  5593  
  5594  void write_mem(Alloc alloc, uint offset, uint val)
  5595  {
  5596      Alloc param = alloc;
  5597      uint param_1 = offset;
  5598      if (!touch_mem(param, param_1))
  5599      {
  5600          return;
  5601      }
  5602      _145.memory[offset] = val;
  5603  }
  5604  
  5605  void TileSeg_write(Alloc a, TileSegRef ref, TileSeg s)
  5606  {
  5607      uint ix = ref.offset >> uint(2);
  5608      Alloc param = a;
  5609      uint param_1 = ix + 0u;
  5610      uint param_2 = floatBitsToUint(s.origin.x);
  5611      write_mem(param, param_1, param_2);
  5612      Alloc param_3 = a;
  5613      uint param_4 = ix + 1u;
  5614      uint param_5 = floatBitsToUint(s.origin.y);
  5615      write_mem(param_3, param_4, param_5);
  5616      Alloc param_6 = a;
  5617      uint param_7 = ix + 2u;
  5618      uint param_8 = floatBitsToUint(s.vector.x);
  5619      write_mem(param_6, param_7, param_8);
  5620      Alloc param_9 = a;
  5621      uint param_10 = ix + 3u;
  5622      uint param_11 = floatBitsToUint(s.vector.y);
  5623      write_mem(param_9, param_10, param_11);
  5624      Alloc param_12 = a;
  5625      uint param_13 = ix + 4u;
  5626      uint param_14 = floatBitsToUint(s.y_edge);
  5627      write_mem(param_12, param_13, param_14);
  5628      Alloc param_15 = a;
  5629      uint param_16 = ix + 5u;
  5630      uint param_17 = s.next.offset;
  5631      write_mem(param_15, param_16, param_17);
  5632  }
  5633  
  5634  void main()
  5635  {
  5636      uint element_ix = gl_GlobalInvocationID.x;
  5637      PathSegRef ref = PathSegRef(_787.conf.pathseg_alloc.offset + (element_ix * 52u));
  5638      PathSegTag tag = PathSegTag(0u, 0u);
  5639      if (element_ix < _787.conf.n_pathseg)
  5640      {
  5641          Alloc param;
  5642          param.offset = _787.conf.pathseg_alloc.offset;
  5643          PathSegRef param_1 = ref;
  5644          tag = PathSeg_tag(param, param_1);
  5645      }
  5646      bool mem_ok = _145.mem_error == 0u;
  5647      switch (tag.tag)
  5648      {
  5649          case 1u:
  5650          {
  5651              Alloc param_2;
  5652              param_2.offset = _787.conf.pathseg_alloc.offset;
  5653              PathSegRef param_3 = ref;
  5654              PathCubic cubic = PathSeg_Cubic_read(param_2, param_3);
  5655              uint trans_ix = cubic.trans_ix;
  5656              if (trans_ix > 0u)
  5657              {
  5658                  TransformSegRef trans_ref = TransformSegRef(_787.conf.trans_alloc.offset + ((trans_ix - 1u) * 24u));
  5659                  Alloc param_4;
  5660                  param_4.offset = _787.conf.trans_alloc.offset;
  5661                  TransformSegRef param_5 = trans_ref;
  5662                  TransformSeg trans = TransformSeg_read(param_4, param_5);
  5663                  cubic.p0 = ((trans.mat.xy * cubic.p0.x) + (trans.mat.zw * cubic.p0.y)) + trans.translate;
  5664                  cubic.p1 = ((trans.mat.xy * cubic.p1.x) + (trans.mat.zw * cubic.p1.y)) + trans.translate;
  5665                  cubic.p2 = ((trans.mat.xy * cubic.p2.x) + (trans.mat.zw * cubic.p2.y)) + trans.translate;
  5666                  cubic.p3 = ((trans.mat.xy * cubic.p3.x) + (trans.mat.zw * cubic.p3.y)) + trans.translate;
  5667              }
  5668              vec2 err_v = (((cubic.p2 - cubic.p1) * 3.0) + cubic.p0) - cubic.p3;
  5669              float err = (err_v.x * err_v.x) + (err_v.y * err_v.y);
  5670              uint n_quads = max(uint(ceil(pow(err * 3.7037036418914794921875, 0.16666667163372039794921875))), 1u);
  5671              float val = 0.0;
  5672              vec2 qp0 = cubic.p0;
  5673              float _step = 1.0 / float(n_quads);
  5674              for (uint i = 0u; i < n_quads; i++)
  5675              {
  5676                  float t = float(i + 1u) * _step;
  5677                  vec2 param_6 = cubic.p0;
  5678                  vec2 param_7 = cubic.p1;
  5679                  vec2 param_8 = cubic.p2;
  5680                  vec2 param_9 = cubic.p3;
  5681                  float param_10 = t;
  5682                  vec2 qp2 = eval_cubic(param_6, param_7, param_8, param_9, param_10);
  5683                  vec2 param_11 = cubic.p0;
  5684                  vec2 param_12 = cubic.p1;
  5685                  vec2 param_13 = cubic.p2;
  5686                  vec2 param_14 = cubic.p3;
  5687                  float param_15 = t - (0.5 * _step);
  5688                  vec2 qp1 = eval_cubic(param_11, param_12, param_13, param_14, param_15);
  5689                  qp1 = (qp1 * 2.0) - ((qp0 + qp2) * 0.5);
  5690                  vec2 param_16 = qp0;
  5691                  vec2 param_17 = qp1;
  5692                  vec2 param_18 = qp2;
  5693                  float param_19 = 0.4743416607379913330078125;
  5694                  SubdivResult params = estimate_subdiv(param_16, param_17, param_18, param_19);
  5695                  val += params.val;
  5696                  qp0 = qp2;
  5697              }
  5698              uint n = max(uint(ceil((val * 0.5) / 0.4743416607379913330078125)), 1u);
  5699              uint param_20 = tag.flags;
  5700              bool is_stroke = fill_mode_from_flags(param_20) == 1u;
  5701              uint path_ix = cubic.path_ix;
  5702              Alloc param_21;
  5703              param_21.offset = _787.conf.tile_alloc.offset;
  5704              PathRef param_22 = PathRef(_787.conf.tile_alloc.offset + (path_ix * 12u));
  5705              Path path = Path_read(param_21, param_22);
  5706              uint param_23 = path.tiles.offset;
  5707              uint param_24 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u;
  5708              bool param_25 = mem_ok;
  5709              Alloc path_alloc = new_alloc(param_23, param_24, param_25);
  5710              ivec4 bbox = ivec4(path.bbox);
  5711              vec2 p0 = cubic.p0;
  5712              qp0 = cubic.p0;
  5713              float v_step = val / float(n);
  5714              int n_out = 1;
  5715              float val_sum = 0.0;
  5716              vec2 p1;
  5717              float _1314;
  5718              TileSeg tile_seg;
  5719              for (uint i_1 = 0u; i_1 < n_quads; i_1++)
  5720              {
  5721                  float t_1 = float(i_1 + 1u) * _step;
  5722                  vec2 param_26 = cubic.p0;
  5723                  vec2 param_27 = cubic.p1;
  5724                  vec2 param_28 = cubic.p2;
  5725                  vec2 param_29 = cubic.p3;
  5726                  float param_30 = t_1;
  5727                  vec2 qp2_1 = eval_cubic(param_26, param_27, param_28, param_29, param_30);
  5728                  vec2 param_31 = cubic.p0;
  5729                  vec2 param_32 = cubic.p1;
  5730                  vec2 param_33 = cubic.p2;
  5731                  vec2 param_34 = cubic.p3;
  5732                  float param_35 = t_1 - (0.5 * _step);
  5733                  vec2 qp1_1 = eval_cubic(param_31, param_32, param_33, param_34, param_35);
  5734                  qp1_1 = (qp1_1 * 2.0) - ((qp0 + qp2_1) * 0.5);
  5735                  vec2 param_36 = qp0;
  5736                  vec2 param_37 = qp1_1;
  5737                  vec2 param_38 = qp2_1;
  5738                  float param_39 = 0.4743416607379913330078125;
  5739                  SubdivResult params_1 = estimate_subdiv(param_36, param_37, param_38, param_39);
  5740                  float param_40 = params_1.a0;
  5741                  float u0 = approx_parabola_inv_integral(param_40);
  5742                  float param_41 = params_1.a2;
  5743                  float u2 = approx_parabola_inv_integral(param_41);
  5744                  float uscale = 1.0 / (u2 - u0);
  5745                  float target = float(n_out) * v_step;
  5746                  for (;;)
  5747                  {
  5748                      bool _1207 = uint(n_out) == n;
  5749                      bool _1217;
  5750                      if (!_1207)
  5751                      {
  5752                          _1217 = target < (val_sum + params_1.val);
  5753                      }
  5754                      else
  5755                      {
  5756                          _1217 = _1207;
  5757                      }
  5758                      if (_1217)
  5759                      {
  5760                          if (uint(n_out) == n)
  5761                          {
  5762                              p1 = cubic.p3;
  5763                          }
  5764                          else
  5765                          {
  5766                              float u = (target - val_sum) / params_1.val;
  5767                              float a = mix(params_1.a0, params_1.a2, u);
  5768                              float param_42 = a;
  5769                              float au = approx_parabola_inv_integral(param_42);
  5770                              float t_2 = (au - u0) * uscale;
  5771                              vec2 param_43 = qp0;
  5772                              vec2 param_44 = qp1_1;
  5773                              vec2 param_45 = qp2_1;
  5774                              float param_46 = t_2;
  5775                              p1 = eval_quad(param_43, param_44, param_45, param_46);
  5776                          }
  5777                          float xmin = min(p0.x, p1.x) - cubic.stroke.x;
  5778                          float xmax = max(p0.x, p1.x) + cubic.stroke.x;
  5779                          float ymin = min(p0.y, p1.y) - cubic.stroke.y;
  5780                          float ymax = max(p0.y, p1.y) + cubic.stroke.y;
  5781                          float dx = p1.x - p0.x;
  5782                          float dy = p1.y - p0.y;
  5783                          if (abs(dy) < 9.999999717180685365747194737196e-10)
  5784                          {
  5785                              _1314 = 1000000000.0;
  5786                          }
  5787                          else
  5788                          {
  5789                              _1314 = dx / dy;
  5790                          }
  5791                          float invslope = _1314;
  5792                          float c = (cubic.stroke.x + (abs(invslope) * (16.0 + cubic.stroke.y))) * 0.03125;
  5793                          float b = invslope;
  5794                          float a_1 = (p0.x - ((p0.y - 16.0) * b)) * 0.03125;
  5795                          int x0 = int(floor(xmin * 0.03125));
  5796                          int x1 = int(floor(xmax * 0.03125) + 1.0);
  5797                          int y0 = int(floor(ymin * 0.03125));
  5798                          int y1 = int(floor(ymax * 0.03125) + 1.0);
  5799                          x0 = clamp(x0, bbox.x, bbox.z);
  5800                          y0 = clamp(y0, bbox.y, bbox.w);
  5801                          x1 = clamp(x1, bbox.x, bbox.z);
  5802                          y1 = clamp(y1, bbox.y, bbox.w);
  5803                          float xc = a_1 + (b * float(y0));
  5804                          int stride = bbox.z - bbox.x;
  5805                          int base = ((y0 - bbox.y) * stride) - bbox.x;
  5806                          uint n_tile_alloc = uint((x1 - x0) * (y1 - y0));
  5807                          uint param_47 = n_tile_alloc * 24u;
  5808                          MallocResult _1429 = malloc(param_47);
  5809                          MallocResult tile_alloc = _1429;
  5810                          if (tile_alloc.failed || (!mem_ok))
  5811                          {
  5812                              return;
  5813                          }
  5814                          uint tile_offset = tile_alloc.alloc.offset;
  5815                          int xray = int(floor(p0.x * 0.03125));
  5816                          int last_xray = int(floor(p1.x * 0.03125));
  5817                          if (p0.y > p1.y)
  5818                          {
  5819                              int tmp = xray;
  5820                              xray = last_xray;
  5821                              last_xray = tmp;
  5822                          }
  5823                          for (int y = y0; y < y1; y++)
  5824                          {
  5825                              float tile_y0 = float(y * 32);
  5826                              int xbackdrop = max((xray + 1), bbox.x);
  5827                              bool _1486 = !is_stroke;
  5828                              bool _1496;
  5829                              if (_1486)
  5830                              {
  5831                                  _1496 = min(p0.y, p1.y) < tile_y0;
  5832                              }
  5833                              else
  5834                              {
  5835                                  _1496 = _1486;
  5836                              }
  5837                              bool _1503;
  5838                              if (_1496)
  5839                              {
  5840                                  _1503 = xbackdrop < bbox.z;
  5841                              }
  5842                              else
  5843                              {
  5844                                  _1503 = _1496;
  5845                              }
  5846                              if (_1503)
  5847                              {
  5848                                  int backdrop = (p1.y < p0.y) ? 1 : (-1);
  5849                                  TileRef param_48 = path.tiles;
  5850                                  uint param_49 = uint(base + xbackdrop);
  5851                                  TileRef tile_ref = Tile_index(param_48, param_49);
  5852                                  uint tile_el = tile_ref.offset >> uint(2);
  5853                                  Alloc param_50 = path_alloc;
  5854                                  uint param_51 = tile_el + 1u;
  5855                                  if (touch_mem(param_50, param_51))
  5856                                  {
  5857                                      uint _1541 = atomicAdd(_145.memory[tile_el + 1u], uint(backdrop));
  5858                                  }
  5859                              }
  5860                              int next_xray = last_xray;
  5861                              if (y < (y1 - 1))
  5862                              {
  5863                                  float tile_y1 = float((y + 1) * 32);
  5864                                  float x_edge = mix(p0.x, p1.x, (tile_y1 - p0.y) / dy);
  5865                                  next_xray = int(floor(x_edge * 0.03125));
  5866                              }
  5867                              int min_xray = min(xray, next_xray);
  5868                              int max_xray = max(xray, next_xray);
  5869                              int xx0 = min(int(floor(xc - c)), min_xray);
  5870                              int xx1 = max(int(ceil(xc + c)), (max_xray + 1));
  5871                              xx0 = clamp(xx0, x0, x1);
  5872                              xx1 = clamp(xx1, x0, x1);
  5873                              for (int x = xx0; x < xx1; x++)
  5874                              {
  5875                                  float tile_x0 = float(x * 32);
  5876                                  TileRef param_52 = TileRef(path.tiles.offset);
  5877                                  uint param_53 = uint(base + x);
  5878                                  TileRef tile_ref_1 = Tile_index(param_52, param_53);
  5879                                  uint tile_el_1 = tile_ref_1.offset >> uint(2);
  5880                                  uint old = 0u;
  5881                                  Alloc param_54 = path_alloc;
  5882                                  uint param_55 = tile_el_1;
  5883                                  if (touch_mem(param_54, param_55))
  5884                                  {
  5885                                      uint _1644 = atomicExchange(_145.memory[tile_el_1], tile_offset);
  5886                                      old = _1644;
  5887                                  }
  5888                                  tile_seg.origin = p0;
  5889                                  tile_seg.vector = p1 - p0;
  5890                                  float y_edge = 0.0;
  5891                                  if (!is_stroke)
  5892                                  {
  5893                                      y_edge = mix(p0.y, p1.y, (tile_x0 - p0.x) / dx);
  5894                                      if (min(p0.x, p1.x) < tile_x0)
  5895                                      {
  5896                                          vec2 p = vec2(tile_x0, y_edge);
  5897                                          if (p0.x > p1.x)
  5898                                          {
  5899                                              tile_seg.vector = p - p0;
  5900                                          }
  5901                                          else
  5902                                          {
  5903                                              tile_seg.origin = p;
  5904                                              tile_seg.vector = p1 - p;
  5905                                          }
  5906                                          if (tile_seg.vector.x == 0.0)
  5907                                          {
  5908                                              tile_seg.vector.x = sign(p1.x - p0.x) * 9.999999717180685365747194737196e-10;
  5909                                          }
  5910                                      }
  5911                                      if ((x <= min_xray) || (max_xray < x))
  5912                                      {
  5913                                          y_edge = 1000000000.0;
  5914                                      }
  5915                                  }
  5916                                  tile_seg.y_edge = y_edge;
  5917                                  tile_seg.next.offset = old;
  5918                                  Alloc param_56 = tile_alloc.alloc;
  5919                                  TileSegRef param_57 = TileSegRef(tile_offset);
  5920                                  TileSeg param_58 = tile_seg;
  5921                                  TileSeg_write(param_56, param_57, param_58);
  5922                                  tile_offset += 24u;
  5923                              }
  5924                              xc += b;
  5925                              base += stride;
  5926                              xray = next_xray;
  5927                          }
  5928                          n_out++;
  5929                          target += v_step;
  5930                          p0 = p1;
  5931                          continue;
  5932                      }
  5933                      else
  5934                      {
  5935                          break;
  5936                      }
  5937                  }
  5938                  val_sum += params_1.val;
  5939                  qp0 = qp2_1;
  5940              }
  5941              break;
  5942          }
  5943      }
  5944  }
  5945  
  5946  `,
  5947  	}
  5948  	shader_stencil_frag = driver.ShaderSources{
  5949  		Name:   "stencil.frag",
  5950  		Inputs: []driver.InputLocation{{Name: "vFrom", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "vCtrl", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}, {Name: "vTo", Location: 2, Semantic: "TEXCOORD", SemanticIndex: 2, Type: 0x0, Size: 2}},
  5951  		GLSL100ES: `#version 100
  5952  precision mediump float;
  5953  precision highp int;
  5954  
  5955  varying vec2 vTo;
  5956  varying vec2 vFrom;
  5957  varying vec2 vCtrl;
  5958  
  5959  void main()
  5960  {
  5961      float dx = vTo.x - vFrom.x;
  5962      bool increasing = vTo.x >= vFrom.x;
  5963      bvec2 _35 = bvec2(increasing);
  5964      vec2 left = vec2(_35.x ? vFrom.x : vTo.x, _35.y ? vFrom.y : vTo.y);
  5965      bvec2 _41 = bvec2(increasing);
  5966      vec2 right = vec2(_41.x ? vTo.x : vFrom.x, _41.y ? vTo.y : vFrom.y);
  5967      vec2 extent = clamp(vec2(vFrom.x, vTo.x), vec2(-0.5), vec2(0.5));
  5968      float midx = mix(extent.x, extent.y, 0.5);
  5969      float x0 = midx - left.x;
  5970      vec2 p1 = vCtrl - left;
  5971      vec2 v = right - vCtrl;
  5972      float t = x0 / (p1.x + sqrt((p1.x * p1.x) + ((v.x - p1.x) * x0)));
  5973      float y = mix(mix(left.y, vCtrl.y, t), mix(vCtrl.y, right.y, t), t);
  5974      vec2 d_half = mix(p1, v, vec2(t));
  5975      float dy = d_half.y / d_half.x;
  5976      float width = extent.y - extent.x;
  5977      dy = abs(dy * width);
  5978      vec4 sides = vec4((dy * 0.5) + y, (dy * (-0.5)) + y, (0.5 - y) / dy, ((-0.5) - y) / dy);
  5979      sides = clamp(sides + vec4(0.5), vec4(0.0), vec4(1.0));
  5980      float area = 0.5 * ((((sides.z - (sides.z * sides.y)) + 1.0) - sides.x) + (sides.x * sides.w));
  5981      area *= width;
  5982      if (width == 0.0)
  5983      {
  5984          area = 0.0;
  5985      }
  5986      gl_FragData[0].x = area;
  5987  }
  5988  
  5989  `,
  5990  		GLSL300ES: `#version 300 es
  5991  precision mediump float;
  5992  precision highp int;
  5993  
  5994  in vec2 vTo;
  5995  in vec2 vFrom;
  5996  in vec2 vCtrl;
  5997  layout(location = 0) out vec4 fragCover;
  5998  
  5999  void main()
  6000  {
  6001      float dx = vTo.x - vFrom.x;
  6002      bool increasing = vTo.x >= vFrom.x;
  6003      bvec2 _35 = bvec2(increasing);
  6004      vec2 left = vec2(_35.x ? vFrom.x : vTo.x, _35.y ? vFrom.y : vTo.y);
  6005      bvec2 _41 = bvec2(increasing);
  6006      vec2 right = vec2(_41.x ? vTo.x : vFrom.x, _41.y ? vTo.y : vFrom.y);
  6007      vec2 extent = clamp(vec2(vFrom.x, vTo.x), vec2(-0.5), vec2(0.5));
  6008      float midx = mix(extent.x, extent.y, 0.5);
  6009      float x0 = midx - left.x;
  6010      vec2 p1 = vCtrl - left;
  6011      vec2 v = right - vCtrl;
  6012      float t = x0 / (p1.x + sqrt((p1.x * p1.x) + ((v.x - p1.x) * x0)));
  6013      float y = mix(mix(left.y, vCtrl.y, t), mix(vCtrl.y, right.y, t), t);
  6014      vec2 d_half = mix(p1, v, vec2(t));
  6015      float dy = d_half.y / d_half.x;
  6016      float width = extent.y - extent.x;
  6017      dy = abs(dy * width);
  6018      vec4 sides = vec4((dy * 0.5) + y, (dy * (-0.5)) + y, (0.5 - y) / dy, ((-0.5) - y) / dy);
  6019      sides = clamp(sides + vec4(0.5), vec4(0.0), vec4(1.0));
  6020      float area = 0.5 * ((((sides.z - (sides.z * sides.y)) + 1.0) - sides.x) + (sides.x * sides.w));
  6021      area *= width;
  6022      if (width == 0.0)
  6023      {
  6024          area = 0.0;
  6025      }
  6026      fragCover.x = area;
  6027  }
  6028  
  6029  `,
  6030  		GLSL130: `#version 130
  6031  
  6032  in vec2 vTo;
  6033  in vec2 vFrom;
  6034  in vec2 vCtrl;
  6035  out vec4 fragCover;
  6036  
  6037  void main()
  6038  {
  6039      float dx = vTo.x - vFrom.x;
  6040      bool increasing = vTo.x >= vFrom.x;
  6041      bvec2 _35 = bvec2(increasing);
  6042      vec2 left = vec2(_35.x ? vFrom.x : vTo.x, _35.y ? vFrom.y : vTo.y);
  6043      bvec2 _41 = bvec2(increasing);
  6044      vec2 right = vec2(_41.x ? vTo.x : vFrom.x, _41.y ? vTo.y : vFrom.y);
  6045      vec2 extent = clamp(vec2(vFrom.x, vTo.x), vec2(-0.5), vec2(0.5));
  6046      float midx = mix(extent.x, extent.y, 0.5);
  6047      float x0 = midx - left.x;
  6048      vec2 p1 = vCtrl - left;
  6049      vec2 v = right - vCtrl;
  6050      float t = x0 / (p1.x + sqrt((p1.x * p1.x) + ((v.x - p1.x) * x0)));
  6051      float y = mix(mix(left.y, vCtrl.y, t), mix(vCtrl.y, right.y, t), t);
  6052      vec2 d_half = mix(p1, v, vec2(t));
  6053      float dy = d_half.y / d_half.x;
  6054      float width = extent.y - extent.x;
  6055      dy = abs(dy * width);
  6056      vec4 sides = vec4((dy * 0.5) + y, (dy * (-0.5)) + y, (0.5 - y) / dy, ((-0.5) - y) / dy);
  6057      sides = clamp(sides + vec4(0.5), vec4(0.0), vec4(1.0));
  6058      float area = 0.5 * ((((sides.z - (sides.z * sides.y)) + 1.0) - sides.x) + (sides.x * sides.w));
  6059      area *= width;
  6060      if (width == 0.0)
  6061      {
  6062          area = 0.0;
  6063      }
  6064      fragCover.x = area;
  6065  }
  6066  
  6067  `,
  6068  		GLSL150: `#version 150
  6069  
  6070  in vec2 vTo;
  6071  in vec2 vFrom;
  6072  in vec2 vCtrl;
  6073  out vec4 fragCover;
  6074  
  6075  void main()
  6076  {
  6077      float dx = vTo.x - vFrom.x;
  6078      bool increasing = vTo.x >= vFrom.x;
  6079      bvec2 _35 = bvec2(increasing);
  6080      vec2 left = vec2(_35.x ? vFrom.x : vTo.x, _35.y ? vFrom.y : vTo.y);
  6081      bvec2 _41 = bvec2(increasing);
  6082      vec2 right = vec2(_41.x ? vTo.x : vFrom.x, _41.y ? vTo.y : vFrom.y);
  6083      vec2 extent = clamp(vec2(vFrom.x, vTo.x), vec2(-0.5), vec2(0.5));
  6084      float midx = mix(extent.x, extent.y, 0.5);
  6085      float x0 = midx - left.x;
  6086      vec2 p1 = vCtrl - left;
  6087      vec2 v = right - vCtrl;
  6088      float t = x0 / (p1.x + sqrt((p1.x * p1.x) + ((v.x - p1.x) * x0)));
  6089      float y = mix(mix(left.y, vCtrl.y, t), mix(vCtrl.y, right.y, t), t);
  6090      vec2 d_half = mix(p1, v, vec2(t));
  6091      float dy = d_half.y / d_half.x;
  6092      float width = extent.y - extent.x;
  6093      dy = abs(dy * width);
  6094      vec4 sides = vec4((dy * 0.5) + y, (dy * (-0.5)) + y, (0.5 - y) / dy, ((-0.5) - y) / dy);
  6095      sides = clamp(sides + vec4(0.5), vec4(0.0), vec4(1.0));
  6096      float area = 0.5 * ((((sides.z - (sides.z * sides.y)) + 1.0) - sides.x) + (sides.x * sides.w));
  6097      area *= width;
  6098      if (width == 0.0)
  6099      {
  6100          area = 0.0;
  6101      }
  6102      fragCover.x = area;
  6103  }
  6104  
  6105  `,
  6106  		HLSL: "DXBC\x94!\xb9\x13L\xba\r\x11\x8f\xc7\xce\x0eAs\xec\xe1\x01\x00\x00\x00\\\n\x00\x00\x06\x00\x00\x008\x00\x00\x00\x9c\x03\x00\x00\xfc\b\x00\x00x\t\x00\x00\xc4\t\x00\x00(\n\x00\x00Aon9\\\x03\x00\x00\\\x03\x00\x00\x00\x02\xff\xff8\x03\x00\x00$\x00\x00\x00\x00\x00$\x00\x00\x00$\x00\x00\x00$\x00\x00\x00$\x00\x00\x00$\x00\x00\x02\xff\xffQ\x00\x00\x05\x00\x00\x0f\xa0\x00\x00\x00\xbf\x00\x00\x00?\x00\x00\x80?\x00\x00\x00\x00\x1f\x00\x00\x02\x00\x00\x00\x80\x00\x00\x0f\xb0\x1f\x00\x00\x02\x00\x00\x00\x80\x01\x00\x03\xb0\v\x00\x00\x03\x00\x00\x01\x80\x00\x00\x00\xb0\x00\x00\x00\xa0\v\x00\x00\x03\x00\x00\x02\x80\x01\x00\x00\xb0\x00\x00\x00\xa0\n\x00\x00\x03\x01\x00\x03\x80\x00\x00\xe4\x80\x00\x00U\xa0\x02\x00\x00\x03\x00\x00\x01\x80\x01\x00\x00\x81\x01\x00U\x80\x04\x00\x00\x04\x00\x00\x02\x80\x00\x00\x00\x80\x00\x00U\xa0\x01\x00\x00\x80\x01\x00\x00\x02\x01\x00\x03\x80\x00\x00\xe4\xb0\n\x00\x00\x03\x02\x00\x01\x80\x01\x00\x00\x80\x01\x00\x00\xb0\x02\x00\x00\x03\x00\x00\x02\x80\x00\x00U\x80\x02\x00\x00\x81\v\x00\x00\x03\x03\x00\x01\x80\x01\x00\x00\xb0\x01\x00\x00\x80\x02\x00\x00\x03\x00\x00\x04\x80\x01\x00\x00\x81\x01\x00\x00\xb0X\x00\x00\x04\x03\x00\x02\x80\x00\x00\xaa\x80\x01\x00U\xb0\x01\x00U\x80X\x00\x00\x04\x02\x00\x02\x80\x00\x00\xaa\x80\x01\x00U\x80\x01\x00U\xb0\x02\x00\x00\x03\x00\x00\f\x80\x03\x00\x1b\x80\x00\x00\xe4\xb1\x02\x00\x00\x03\x01\x00\x03\x80\x02\x00\xe4\x81\x00\x00\x1b\xb0\x02\x00\x00\x03\x01\x00\x04\x80\x00\x00\xff\x80\x01\x00\x00\x81\x05\x00\x00\x03\x01\x00\x04\x80\x00\x00U\x80\x01\x00\xaa\x80\x04\x00\x00\x04\x01\x00\x04\x80\x01\x00\x00\x80\x01\x00\x00\x80\x01\x00\xaa\x80\a\x00\x00\x02\x01\x00\x04\x80\x01\x00\xaa\x80\x06\x00\x00\x02\x01\x00\x04\x80\x01\x00\xaa\x80\x02\x00\x00\x03\x01\x00\x04\x80\x01\x00\xaa\x80\x01\x00\x00\x80\x06\x00\x00\x02\x01\x00\x04\x80\x01\x00\xaa\x80\x05\x00\x00\x03\x00\x00\x02\x80\x00\x00U\x80\x01\x00\xaa\x80\x04\x00\x00\x04\x01\x00\x04\x80\x00\x00U\x80\x01\x00U\x80\x02\x00U\x80\x12\x00\x00\x04\x02\x00\x03\x80\x00\x00U\x80\x00\x00\x1b\x80\x01\x00\xe4\x80\x04\x00\x00\x04\x00\x00\x04\x80\x00\x00U\x80\x00\x00\xaa\x80\x00\x00\xaa\xb0\x12\x00\x00\x04\x02\x00\x04\x80\x00\x00U\x80\x00\x00\xaa\x80\x01\x00\xaa\x80\x06\x00\x00\x02\x00\x00\x02\x80\x02\x00\x00\x80\x05\x00\x00\x03\x00\x00\x02\x80\x00\x00U\x80\x02\x00U\x80\x05\x00\x00\x03\x00\x00\x02\x80\x00\x00\x00\x80\x00\x00U\x80#\x00\x00\x02\x00\x00\x02\x80\x00\x00U\x80\x04\x00\x00\x04\x01\x00\x01\x80\x00\x00U\x80\x00\x00U\xa0\x02\x00\xaa\x80\x04\x00\x00\x04\x01\x00\x02\x80\x00\x00U\x80\x00\x00\x00\xa0\x02\x00\xaa\x80\x06\x00\x00\x02\x00\x00\x02\x80\x00\x00U\x80\x02\x00\x00\x03\x00\x00\f\x80\x02\x00\xaa\x81\x00\x00\x1b\xa0\x05\x00\x00\x03\x01\x00\b\x80\x00\x00U\x80\x00\x00\xff\x80\x05\x00\x00\x03\x01\x00\x04\x80\x00\x00U\x80\x00\x00\xaa\x80\x02\x00\x00\x03\x01\x00\x1f\x80\x01\x00\xe4\x80\x00\x00U\xa0\x04\x00\x00\x04\x00\x00\x02\x80\x01\x00\xaa\x80\x01\x00U\x81\x01\x00\xaa\x80\x02\x00\x00\x03\x00\x00\x02\x80\x00\x00U\x80\x00\x00\xaa\xa0\x02\x00\x00\x03\x00\x00\x02\x80\x01\x00\x00\x81\x00\x00U\x80\x04\x00\x00\x04\x00\x00\x02\x80\x01\x00\x00\x80\x01\x00\xff\x80\x00\x00U\x80\x05\x00\x00\x03\x00\x00\x02\x80\x00\x00U\x80\x00\x00\x00\x80\x05\x00\x00\x03\x00\x00\x01\x80\x00\x00\x00\x80\x00\x00\x00\x80\x05\x00\x00\x03\x00\x00\x02\x80\x00\x00U\x80\x00\x00U\xa0X\x00\x00\x04\x00\x00\x01\x80\x00\x00\x00\x81\x00\x00\xff\xa0\x00\x00U\x80\x01\x00\x00\x02\x00\x00\x0e\x80\x00\x00\xff\xa0\x01\x00\x00\x02\x00\b\x0f\x80\x00\x00\xe4\x80\xff\xff\x00\x00SHDRX\x05\x00\x00@\x00\x00\x00V\x01\x00\x00b\x10\x00\x032\x10\x10\x00\x00\x00\x00\x00b\x10\x00\x03\xc2\x10\x10\x00\x00\x00\x00\x00b\x10\x00\x032\x10\x10\x00\x01\x00\x00\x00e\x00\x00\x03\xf2 \x10\x00\x00\x00\x00\x00h\x00\x00\x02\x03\x00\x00\x006\x00\x00\x05\x12\x00\x10\x00\x00\x00\x00\x00\n\x10\x10\x00\x00\x00\x00\x006\x00\x00\x05\"\x00\x10\x00\x00\x00\x00\x00\n\x10\x10\x00\x01\x00\x00\x004\x00\x00\n2\x00\x10\x00\x00\x00\x00\x00F\x00\x10\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x003\x00\x00\n2\x00\x10\x00\x00\x00\x00\x00F\x00\x10\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x00?\x00\x00\x00?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\"\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x80A\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x10\x00\x00\x00\x00\x002\x00\x00\t\x12\x00\x10\x00\x00\x00\x00\x00\x1a\x00\x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x00?\n\x00\x10\x00\x00\x00\x00\x003\x00\x00\a2\x00\x10\x00\x01\x00\x00\x00\x06\x10\x10\x00\x00\x00\x00\x00\x06\x10\x10\x00\x01\x00\x00\x00\x00\x00\x00\b\x12\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x80A\x00\x00\x00\x01\x00\x00\x004\x00\x00\a2\x00\x10\x00\x02\x00\x00\x00\x06\x10\x10\x00\x00\x00\x00\x00\x06\x10\x10\x00\x01\x00\x00\x00\x1d\x00\x00\aB\x00\x10\x00\x00\x00\x00\x00\n\x10\x10\x00\x01\x00\x00\x00\n\x10\x10\x00\x00\x00\x00\x007\x00\x00\tB\x00\x10\x00\x02\x00\x00\x00*\x00\x10\x00\x00\x00\x00\x00\x1a\x10\x10\x00\x01\x00\x00\x00\x1a\x10\x10\x00\x00\x00\x00\x007\x00\x00\tB\x00\x10\x00\x01\x00\x00\x00*\x00\x10\x00\x00\x00\x00\x00\x1a\x10\x10\x00\x00\x00\x00\x00\x1a\x10\x10\x00\x01\x00\x00\x00\x00\x00\x00\br\x00\x10\x00\x02\x00\x00\x00F\x02\x10\x00\x02\x00\x00\x00\xa6\x1b\x10\x80A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\xc2\x00\x10\x00\x00\x00\x00\x00V\t\x10\x80A\x00\x00\x00\x01\x00\x00\x00\xa6\x1e\x10\x00\x00\x00\x00\x00\x00\x00\x00\b\xb2\x00\x10\x00\x01\x00\x00\x00\xa6\x0e\x10\x80A\x00\x00\x00\x00\x00\x00\x00F\b\x10\x00\x02\x00\x00\x008\x00\x00\a\x12\x00\x10\x00\x01\x00\x00\x00\n\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x01\x00\x00\x002\x00\x00\t\x12\x00\x10\x00\x01\x00\x00\x00*\x00\x10\x00\x00\x00\x00\x00*\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x01\x00\x00\x00K\x00\x00\x05\x12\x00\x10\x00\x01\x00\x00\x00\n\x00\x10\x00\x01\x00\x00\x00\x00\x00\x00\a\x12\x00\x10\x00\x01\x00\x00\x00*\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x01\x00\x00\x00\x0e\x00\x00\a\x12\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x01\x00\x00\x002\x00\x00\t\x12\x00\x10\x00\x01\x00\x00\x00\n\x00\x10\x00\x00\x00\x00\x00:\x00\x10\x00\x00\x00\x00\x00*\x00\x10\x00\x01\x00\x00\x002\x00\x00\t\xc2\x00\x10\x00\x00\x00\x00\x00\x06\x00\x10\x00\x00\x00\x00\x00V\r\x10\x00\x01\x00\x00\x00\xa6\x0e\x10\x00\x00\x00\x00\x00\x0e\x00\x00\aB\x00\x10\x00\x00\x00\x00\x00:\x00\x10\x00\x00\x00\x00\x00*\x00\x10\x00\x00\x00\x00\x008\x00\x00\aB\x00\x10\x00\x00\x00\x00\x00\x1a\x00\x10\x00\x00\x00\x00\x00*\x00\x10\x00\x00\x00\x00\x002\x00\x00\t\x82\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x00\x00\x00\x00*\x00\x10\x00\x02\x00\x00\x00:\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\b\x82\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x80A\x00\x00\x00\x01\x00\x00\x00:\x00\x10\x00\x00\x00\x00\x002\x00\x00\t\x12\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x00\x00\x00\x00:\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x01\x00\x00\x00\x00\x00\x00\v2\x00\x10\x00\x01\x00\x00\x00\x06\x00\x10\x80A\x00\x00\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x00?\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x002\x00\x00\r2\x00\x10\x00\x02\x00\x00\x00\xa6\n\x10\x80\x81\x00\x00\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x00?\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x10\x00\x00\x00\x00\x00\x0e\x00\x00\b\xc2\x00\x10\x00\x02\x00\x00\x00\x06\x04\x10\x00\x01\x00\x00\x00\xa6\n\x10\x80\x81\x00\x00\x00\x00\x00\x00\x00\x00 \x00\n\xf2\x00\x10\x00\x01\x00\x00\x00F\x0e\x10\x00\x02\x00\x00\x00\x02@\x00\x00\x00\x00\x00?\x00\x00\x00?\x00\x00\x00?\x00\x00\x00?2\x00\x00\n\x12\x00\x10\x00\x00\x00\x00\x00*\x00\x10\x80A\x00\x00\x00\x01\x00\x00\x00\x1a\x00\x10\x00\x01\x00\x00\x00*\x00\x10\x00\x01\x00\x00\x00\x00\x00\x00\a\x12\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x80?\x00\x00\x00\b\x12\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x80A\x00\x00\x00\x01\x00\x00\x00\n\x00\x10\x00\x00\x00\x00\x002\x00\x00\t\x12\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x01\x00\x00\x00:\x00\x10\x00\x01\x00\x00\x00\n\x00\x10\x00\x00\x00\x00\x008\x00\x00\a\x12\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x00\x00\x00\x00\x1a\x00\x10\x00\x00\x00\x00\x00\x18\x00\x00\a\"\x00\x10\x00\x00\x00\x00\x00\x1a\x00\x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x00\x008\x00\x00\a\x12\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x00?7\x00\x00\t\x12 \x10\x00\x00\x00\x00\x00\x1a\x00\x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x00\x00\n\x00\x10\x00\x00\x00\x00\x006\x00\x00\b\xe2 \x10\x00\x00\x00\x00\x00\x02@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x01STATt\x00\x00\x00)\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEFD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xff\xff\x00\x01\x00\x00\x1c\x00\x00\x00Microsoft (R) HLSL Shader Compiler 10.1\x00ISGN\\\x00\x00\x00\x03\x00\x00\x00\b\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00P\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\f\f\x00\x00P\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x03\x03\x00\x00TEXCOORD\x00\xab\xab\xabOSGN,\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00SV_Target\x00\xab\xab",
  6107  	}
  6108  	shader_stencil_vert = driver.ShaderSources{
  6109  		Name:   "stencil.vert",
  6110  		Inputs: []driver.InputLocation{{Name: "corner", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 1}, {Name: "maxy", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 1}, {Name: "from", Location: 2, Semantic: "TEXCOORD", SemanticIndex: 2, Type: 0x0, Size: 2}, {Name: "ctrl", Location: 3, Semantic: "TEXCOORD", SemanticIndex: 3, Type: 0x0, Size: 2}, {Name: "to", Location: 4, Semantic: "TEXCOORD", SemanticIndex: 4, Type: 0x0, Size: 2}},
  6111  		Uniforms: driver.UniformsReflection{
  6112  			Blocks:    []driver.UniformBlock{{Name: "Block", Binding: 0}},
  6113  			Locations: []driver.UniformLocation{{Name: "_block.transform", Type: 0x0, Size: 4, Offset: 0}, {Name: "_block.pathOffset", Type: 0x0, Size: 2, Offset: 16}},
  6114  			Size:      24,
  6115  		},
  6116  		GLSL100ES: `#version 100
  6117  
  6118  struct Block
  6119  {
  6120      vec4 transform;
  6121      vec2 pathOffset;
  6122  };
  6123  
  6124  uniform Block _block;
  6125  
  6126  attribute vec2 from;
  6127  attribute vec2 ctrl;
  6128  attribute vec2 to;
  6129  attribute float maxy;
  6130  attribute float corner;
  6131  varying vec2 vFrom;
  6132  varying vec2 vCtrl;
  6133  varying vec2 vTo;
  6134  
  6135  void main()
  6136  {
  6137      vec2 from_1 = from + _block.pathOffset;
  6138      vec2 ctrl_1 = ctrl + _block.pathOffset;
  6139      vec2 to_1 = to + _block.pathOffset;
  6140      float maxy_1 = maxy + _block.pathOffset.y;
  6141      float c = corner;
  6142      vec2 pos;
  6143      if (c >= 0.375)
  6144      {
  6145          c -= 0.5;
  6146          pos.y = maxy_1 + 1.0;
  6147      }
  6148      else
  6149      {
  6150          pos.y = min(min(from_1.y, ctrl_1.y), to_1.y) - 1.0;
  6151      }
  6152      if (c >= 0.125)
  6153      {
  6154          pos.x = max(max(from_1.x, ctrl_1.x), to_1.x) + 1.0;
  6155      }
  6156      else
  6157      {
  6158          pos.x = min(min(from_1.x, ctrl_1.x), to_1.x) - 1.0;
  6159      }
  6160      vFrom = from_1 - pos;
  6161      vCtrl = ctrl_1 - pos;
  6162      vTo = to_1 - pos;
  6163      pos = (pos * _block.transform.xy) + _block.transform.zw;
  6164      gl_Position = vec4(pos, 1.0, 1.0);
  6165  }
  6166  
  6167  `,
  6168  		GLSL300ES: `#version 300 es
  6169  
  6170  layout(std140) uniform Block
  6171  {
  6172      vec4 transform;
  6173      vec2 pathOffset;
  6174  } _block;
  6175  
  6176  layout(location = 2) in vec2 from;
  6177  layout(location = 3) in vec2 ctrl;
  6178  layout(location = 4) in vec2 to;
  6179  layout(location = 1) in float maxy;
  6180  layout(location = 0) in float corner;
  6181  out vec2 vFrom;
  6182  out vec2 vCtrl;
  6183  out vec2 vTo;
  6184  
  6185  void main()
  6186  {
  6187      vec2 from_1 = from + _block.pathOffset;
  6188      vec2 ctrl_1 = ctrl + _block.pathOffset;
  6189      vec2 to_1 = to + _block.pathOffset;
  6190      float maxy_1 = maxy + _block.pathOffset.y;
  6191      float c = corner;
  6192      vec2 pos;
  6193      if (c >= 0.375)
  6194      {
  6195          c -= 0.5;
  6196          pos.y = maxy_1 + 1.0;
  6197      }
  6198      else
  6199      {
  6200          pos.y = min(min(from_1.y, ctrl_1.y), to_1.y) - 1.0;
  6201      }
  6202      if (c >= 0.125)
  6203      {
  6204          pos.x = max(max(from_1.x, ctrl_1.x), to_1.x) + 1.0;
  6205      }
  6206      else
  6207      {
  6208          pos.x = min(min(from_1.x, ctrl_1.x), to_1.x) - 1.0;
  6209      }
  6210      vFrom = from_1 - pos;
  6211      vCtrl = ctrl_1 - pos;
  6212      vTo = to_1 - pos;
  6213      pos = (pos * _block.transform.xy) + _block.transform.zw;
  6214      gl_Position = vec4(pos, 1.0, 1.0);
  6215  }
  6216  
  6217  `,
  6218  		GLSL130: `#version 130
  6219  
  6220  struct Block
  6221  {
  6222      vec4 transform;
  6223      vec2 pathOffset;
  6224  };
  6225  
  6226  uniform Block _block;
  6227  
  6228  in vec2 from;
  6229  in vec2 ctrl;
  6230  in vec2 to;
  6231  in float maxy;
  6232  in float corner;
  6233  out vec2 vFrom;
  6234  out vec2 vCtrl;
  6235  out vec2 vTo;
  6236  
  6237  void main()
  6238  {
  6239      vec2 from_1 = from + _block.pathOffset;
  6240      vec2 ctrl_1 = ctrl + _block.pathOffset;
  6241      vec2 to_1 = to + _block.pathOffset;
  6242      float maxy_1 = maxy + _block.pathOffset.y;
  6243      float c = corner;
  6244      vec2 pos;
  6245      if (c >= 0.375)
  6246      {
  6247          c -= 0.5;
  6248          pos.y = maxy_1 + 1.0;
  6249      }
  6250      else
  6251      {
  6252          pos.y = min(min(from_1.y, ctrl_1.y), to_1.y) - 1.0;
  6253      }
  6254      if (c >= 0.125)
  6255      {
  6256          pos.x = max(max(from_1.x, ctrl_1.x), to_1.x) + 1.0;
  6257      }
  6258      else
  6259      {
  6260          pos.x = min(min(from_1.x, ctrl_1.x), to_1.x) - 1.0;
  6261      }
  6262      vFrom = from_1 - pos;
  6263      vCtrl = ctrl_1 - pos;
  6264      vTo = to_1 - pos;
  6265      pos = (pos * _block.transform.xy) + _block.transform.zw;
  6266      gl_Position = vec4(pos, 1.0, 1.0);
  6267  }
  6268  
  6269  `,
  6270  		GLSL150: `#version 150
  6271  
  6272  layout(std140) uniform Block
  6273  {
  6274      vec4 transform;
  6275      vec2 pathOffset;
  6276  } _block;
  6277  
  6278  in vec2 from;
  6279  in vec2 ctrl;
  6280  in vec2 to;
  6281  in float maxy;
  6282  in float corner;
  6283  out vec2 vFrom;
  6284  out vec2 vCtrl;
  6285  out vec2 vTo;
  6286  
  6287  void main()
  6288  {
  6289      vec2 from_1 = from + _block.pathOffset;
  6290      vec2 ctrl_1 = ctrl + _block.pathOffset;
  6291      vec2 to_1 = to + _block.pathOffset;
  6292      float maxy_1 = maxy + _block.pathOffset.y;
  6293      float c = corner;
  6294      vec2 pos;
  6295      if (c >= 0.375)
  6296      {
  6297          c -= 0.5;
  6298          pos.y = maxy_1 + 1.0;
  6299      }
  6300      else
  6301      {
  6302          pos.y = min(min(from_1.y, ctrl_1.y), to_1.y) - 1.0;
  6303      }
  6304      if (c >= 0.125)
  6305      {
  6306          pos.x = max(max(from_1.x, ctrl_1.x), to_1.x) + 1.0;
  6307      }
  6308      else
  6309      {
  6310          pos.x = min(min(from_1.x, ctrl_1.x), to_1.x) - 1.0;
  6311      }
  6312      vFrom = from_1 - pos;
  6313      vCtrl = ctrl_1 - pos;
  6314      vTo = to_1 - pos;
  6315      pos = (pos * _block.transform.xy) + _block.transform.zw;
  6316      gl_Position = vec4(pos, 1.0, 1.0);
  6317  }
  6318  
  6319  `,
  6320  		HLSL: "DXBC\xa5!\xd8\x10\xb4n\x90\xe3\xd9U\xdb\xe2\xb6~I0\x01\x00\x00\x00\x10\b\x00\x00\x06\x00\x00\x008\x00\x00\x00L\x02\x00\x00t\x05\x00\x00\xf0\x05\x00\x00\xf4\x06\x00\x00\x88\a\x00\x00Aon9\f\x02\x00\x00\f\x02\x00\x00\x00\x02\xfe\xff\xd8\x01\x00\x004\x00\x00\x00\x01\x00$\x00\x00\x000\x00\x00\x000\x00\x00\x00$\x00\x01\x000\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xfe\xffQ\x00\x00\x05\x03\x00\x0f\xa0\x00\x00\xc0>\x00\x00\x80?\x00\x00\x80\xbf\x00\x00\x00\xbfQ\x00\x00\x05\x04\x00\x0f\xa0\x00\x00\x00>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x02\x05\x00\x00\x80\x00\x00\x0f\x90\x1f\x00\x00\x02\x05\x00\x01\x80\x01\x00\x0f\x90\x1f\x00\x00\x02\x05\x00\x02\x80\x02\x00\x0f\x90\x1f\x00\x00\x02\x05\x00\x03\x80\x03\x00\x0f\x90\x1f\x00\x00\x02\x05\x00\x04\x80\x04\x00\x0f\x90\x02\x00\x00\x03\x00\x00\x01\x80\x01\x00\x00\x90\x02\x00U\xa0\x02\x00\x00\x03\x00\x00\x04\x80\x00\x00\x00\x80\x03\x00U\xa0\r\x00\x00\x03\x00\x00\x01\x80\x00\x00\x00\x90\x03\x00\x00\xa0\x01\x00\x00\x02\x01\x00\x04\x80\x00\x00\x00\x90\x02\x00\x00\x03\x00\x00\x02\x80\x00\x00\x00\x90\x03\x00\xff\xa0\x02\x00\x00\x03\x02\x00\x03\x80\x02\x00\xe4\x90\x02\x00\xe4\xa0\x02\x00\x00\x03\x02\x00\f\x80\x03\x00\x14\x90\x02\x00\x14\xa0\n\x00\x00\x03\x03\x00\x03\x80\x02\x00\xee\x80\x02\x00\xe1\x80\x02\x00\x00\x03\x03\x00\f\x80\x04\x00D\x90\x02\x00D\xa0\n\x00\x00\x03\x03\x00\x03\x80\x03\x00\xeb\x80\x03\x00\xe4\x80\x02\x00\x00\x03\x01\x00\x03\x80\x03\x00\xe4\x80\x03\x00\xaa\xa0\x12\x00\x00\x04\x04\x00\x06\x80\x00\x00\x00\x80\x00\x00\xe4\x80\x01\x00Ȁ\r\x00\x00\x03\x00\x00\x01\x80\x04\x00U\x80\x04\x00\x00\xa0\v\x00\x00\x03\x00\x00\x02\x80\x02\x00\xff\x80\x02\x00\x00\x80\v\x00\x00\x03\x00\x00\x02\x80\x03\x00\xaa\x80\x00\x00U\x80\x02\x00\x00\x03\x00\x00\x02\x80\x00\x00U\x80\x03\x00U\xa0\x12\x00\x00\x04\x04\x00\x01\x80\x00\x00\x00\x80\x00\x00U\x80\x01\x00U\x80\x02\x00\x00\x03\x00\x00\x0f\xe0\x02\x00\xe4\x80\x04\x00(\x81\x02\x00\x00\x03\x01\x00\x03\xe0\x03\x00\xee\x80\x04\x00\xe8\x81\x04\x00\x00\x04\x00\x00\x03\x80\x04\x00\xe8\x80\x01\x00\xe4\xa0\x01\x00\xee\xa0\x02\x00\x00\x03\x00\x00\x03\xc0\x00\x00\xe4\x80\x00\x00\xe4\xa0\x01\x00\x00\x02\x00\x00\f\xc0\x03\x00U\xa0\xff\xff\x00\x00SHDR \x03\x00\x00@\x00\x01\x00\xc8\x00\x00\x00Y\x00\x00\x04F\x8e \x00\x00\x00\x00\x00\x02\x00\x00\x00_\x00\x00\x03\x12\x10\x10\x00\x00\x00\x00\x00_\x00\x00\x03\x12\x10\x10\x00\x01\x00\x00\x00_\x00\x00\x032\x10\x10\x00\x02\x00\x00\x00_\x00\x00\x032\x10\x10\x00\x03\x00\x00\x00_\x00\x00\x032\x10\x10\x00\x04\x00\x00\x00e\x00\x00\x032 \x10\x00\x00\x00\x00\x00e\x00\x00\x03\xc2 \x10\x00\x00\x00\x00\x00e\x00\x00\x032 \x10\x00\x01\x00\x00\x00g\x00\x00\x04\xf2 \x10\x00\x02\x00\x00\x00\x01\x00\x00\x00h\x00\x00\x02\x04\x00\x00\x00\x00\x00\x00\b\x12\x00\x10\x00\x00\x00\x00\x00\n\x10\x10\x00\x01\x00\x00\x00\x1a\x80 \x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\aB\x00\x10\x00\x00\x00\x00\x00\n\x00\x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x80?\x1d\x00\x00\a\x12\x00\x10\x00\x00\x00\x00\x00\n\x10\x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\xc0>\x00\x00\x00\a\"\x00\x10\x00\x00\x00\x00\x00\n\x10\x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x00\xbf6\x00\x00\x05B\x00\x10\x00\x01\x00\x00\x00\n\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\b2\x00\x10\x00\x02\x00\x00\x00F\x10\x10\x00\x02\x00\x00\x00F\x80 \x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\b\xc2\x00\x10\x00\x02\x00\x00\x00\x06\x14\x10\x00\x03\x00\x00\x00\x06\x84 \x00\x00\x00\x00\x00\x01\x00\x00\x003\x00\x00\a2\x00\x10\x00\x03\x00\x00\x00\xb6\x0f\x10\x00\x02\x00\x00\x00\x16\x05\x10\x00\x02\x00\x00\x00\x00\x00\x00\b\xc2\x00\x10\x00\x03\x00\x00\x00\x06\x14\x10\x00\x04\x00\x00\x00\x06\x84 \x00\x00\x00\x00\x00\x01\x00\x00\x003\x00\x00\a2\x00\x10\x00\x03\x00\x00\x00\xb6\x0f\x10\x00\x03\x00\x00\x00F\x00\x10\x00\x03\x00\x00\x00\x00\x00\x00\n2\x00\x10\x00\x01\x00\x00\x00F\x00\x10\x00\x03\x00\x00\x00\x02@\x00\x00\x00\x00\x80\xbf\x00\x00\x80\xbf\x00\x00\x00\x00\x00\x00\x00\x007\x00\x00\tb\x00\x10\x00\x00\x00\x00\x00\x06\x00\x10\x00\x00\x00\x00\x00V\x06\x10\x00\x00\x00\x00\x00\xa6\b\x10\x00\x01\x00\x00\x00\x1d\x00\x00\a\"\x00\x10\x00\x00\x00\x00\x00\x1a\x00\x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x00>4\x00\x00\a\x82\x00\x10\x00\x00\x00\x00\x00*\x00\x10\x00\x02\x00\x00\x00\n\x00\x10\x00\x02\x00\x00\x004\x00\x00\a\x82\x00\x10\x00\x00\x00\x00\x00*\x00\x10\x00\x03\x00\x00\x00:\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\a\x82\x00\x10\x00\x00\x00\x00\x00:\x00\x10\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x80?7\x00\x00\t\x12\x00\x10\x00\x00\x00\x00\x00\x1a\x00\x10\x00\x00\x00\x00\x00:\x00\x10\x00\x00\x00\x00\x00\x1a\x00\x10\x00\x01\x00\x00\x00\x00\x00\x00\b\xf2 \x10\x00\x00\x00\x00\x00\x86\b\x10\x80A\x00\x00\x00\x00\x00\x00\x00F\x0e\x10\x00\x02\x00\x00\x00\x00\x00\x00\b2 \x10\x00\x01\x00\x00\x00\x86\x00\x10\x80A\x00\x00\x00\x00\x00\x00\x00\xe6\n\x10\x00\x03\x00\x00\x002\x00\x00\v2 \x10\x00\x02\x00\x00\x00\x86\x00\x10\x00\x00\x00\x00\x00F\x80 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x8a \x00\x00\x00\x00\x00\x00\x00\x00\x006\x00\x00\b\xc2 \x10\x00\x02\x00\x00\x00\x02@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x80?>\x00\x00\x01STATt\x00\x00\x00\x16\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RDEF\xfc\x00\x00\x00\x01\x00\x00\x00D\x00\x00\x00\x01\x00\x00\x00\x1c\x00\x00\x00\x00\x04\xfe\xff\x00\x01\x00\x00\xd4\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00Block\x00\xab\xab<\x00\x00\x00\x02\x00\x00\x00\\\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x10\x00\x00\x00\b\x00\x00\x00\x02\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x00\x00_block_transform\x00\xab\xab\xab\x01\x00\x03\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00_block_pathOffset\x00\xab\xab\x01\x00\x03\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00Microsoft (R) HLSL Shader Compiler 10.1\x00ISGN\x8c\x00\x00\x00\x05\x00\x00\x00\b\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x80\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x01\x01\x00\x00\x80\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x03\x03\x00\x00\x80\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\x03\x03\x00\x00\x80\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x03\x03\x00\x00TEXCOORD\x00\xab\xab\xabOSGN\x80\x00\x00\x00\x04\x00\x00\x00\b\x00\x00\x00h\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\f\x00\x00h\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\f\x03\x00\x00h\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x03\f\x00\x00q\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x0f\x00\x00\x00TEXCOORD\x00SV_Position\x00\xab\xab\xab",
  6321  	}
  6322  	shader_tile_alloc_comp = driver.ShaderSources{
  6323  		Name: "tile_alloc.comp",
  6324  		GLSL310ES: `#version 310 es
  6325  layout(local_size_x = 128, local_size_y = 1, local_size_z = 1) in;
  6326  
  6327  struct Alloc
  6328  {
  6329      uint offset;
  6330  };
  6331  
  6332  struct MallocResult
  6333  {
  6334      Alloc alloc;
  6335      bool failed;
  6336  };
  6337  
  6338  struct AnnoEndClipRef
  6339  {
  6340      uint offset;
  6341  };
  6342  
  6343  struct AnnoEndClip
  6344  {
  6345      vec4 bbox;
  6346  };
  6347  
  6348  struct AnnotatedRef
  6349  {
  6350      uint offset;
  6351  };
  6352  
  6353  struct AnnotatedTag
  6354  {
  6355      uint tag;
  6356      uint flags;
  6357  };
  6358  
  6359  struct PathRef
  6360  {
  6361      uint offset;
  6362  };
  6363  
  6364  struct TileRef
  6365  {
  6366      uint offset;
  6367  };
  6368  
  6369  struct Path
  6370  {
  6371      uvec4 bbox;
  6372      TileRef tiles;
  6373  };
  6374  
  6375  struct Config
  6376  {
  6377      uint n_elements;
  6378      uint n_pathseg;
  6379      uint width_in_tiles;
  6380      uint height_in_tiles;
  6381      Alloc tile_alloc;
  6382      Alloc bin_alloc;
  6383      Alloc ptcl_alloc;
  6384      Alloc pathseg_alloc;
  6385      Alloc anno_alloc;
  6386      Alloc trans_alloc;
  6387  };
  6388  
  6389  layout(binding = 0, std430) buffer Memory
  6390  {
  6391      uint mem_offset;
  6392      uint mem_error;
  6393      uint memory[];
  6394  } _92;
  6395  
  6396  layout(binding = 1, std430) readonly buffer ConfigBuf
  6397  {
  6398      Config conf;
  6399  } _305;
  6400  
  6401  shared uint sh_tile_count[128];
  6402  shared MallocResult sh_tile_alloc;
  6403  
  6404  bool touch_mem(Alloc alloc, uint offset)
  6405  {
  6406      return true;
  6407  }
  6408  
  6409  uint read_mem(Alloc alloc, uint offset)
  6410  {
  6411      Alloc param = alloc;
  6412      uint param_1 = offset;
  6413      if (!touch_mem(param, param_1))
  6414      {
  6415          return 0u;
  6416      }
  6417      uint v = _92.memory[offset];
  6418      return v;
  6419  }
  6420  
  6421  AnnotatedTag Annotated_tag(Alloc a, AnnotatedRef ref)
  6422  {
  6423      Alloc param = a;
  6424      uint param_1 = ref.offset >> uint(2);
  6425      uint tag_and_flags = read_mem(param, param_1);
  6426      return AnnotatedTag(tag_and_flags & 65535u, tag_and_flags >> uint(16));
  6427  }
  6428  
  6429  AnnoEndClip AnnoEndClip_read(Alloc a, AnnoEndClipRef ref)
  6430  {
  6431      uint ix = ref.offset >> uint(2);
  6432      Alloc param = a;
  6433      uint param_1 = ix + 0u;
  6434      uint raw0 = read_mem(param, param_1);
  6435      Alloc param_2 = a;
  6436      uint param_3 = ix + 1u;
  6437      uint raw1 = read_mem(param_2, param_3);
  6438      Alloc param_4 = a;
  6439      uint param_5 = ix + 2u;
  6440      uint raw2 = read_mem(param_4, param_5);
  6441      Alloc param_6 = a;
  6442      uint param_7 = ix + 3u;
  6443      uint raw3 = read_mem(param_6, param_7);
  6444      AnnoEndClip s;
  6445      s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
  6446      return s;
  6447  }
  6448  
  6449  AnnoEndClip Annotated_EndClip_read(Alloc a, AnnotatedRef ref)
  6450  {
  6451      Alloc param = a;
  6452      AnnoEndClipRef param_1 = AnnoEndClipRef(ref.offset + 4u);
  6453      return AnnoEndClip_read(param, param_1);
  6454  }
  6455  
  6456  Alloc new_alloc(uint offset, uint size, bool mem_ok)
  6457  {
  6458      Alloc a;
  6459      a.offset = offset;
  6460      return a;
  6461  }
  6462  
  6463  MallocResult malloc(uint size)
  6464  {
  6465      uint _98 = atomicAdd(_92.mem_offset, size);
  6466      uint offset = _98;
  6467      MallocResult r;
  6468      r.failed = (offset + size) > uint(int(uint(_92.memory.length())) * 4);
  6469      uint param = offset;
  6470      uint param_1 = size;
  6471      bool param_2 = !r.failed;
  6472      r.alloc = new_alloc(param, param_1, param_2);
  6473      if (r.failed)
  6474      {
  6475          uint _127 = atomicMax(_92.mem_error, 1u);
  6476          return r;
  6477      }
  6478      return r;
  6479  }
  6480  
  6481  Alloc slice_mem(Alloc a, uint offset, uint size)
  6482  {
  6483      return Alloc(a.offset + offset);
  6484  }
  6485  
  6486  void write_mem(Alloc alloc, uint offset, uint val)
  6487  {
  6488      Alloc param = alloc;
  6489      uint param_1 = offset;
  6490      if (!touch_mem(param, param_1))
  6491      {
  6492          return;
  6493      }
  6494      _92.memory[offset] = val;
  6495  }
  6496  
  6497  void Path_write(Alloc a, PathRef ref, Path s)
  6498  {
  6499      uint ix = ref.offset >> uint(2);
  6500      Alloc param = a;
  6501      uint param_1 = ix + 0u;
  6502      uint param_2 = s.bbox.x | (s.bbox.y << uint(16));
  6503      write_mem(param, param_1, param_2);
  6504      Alloc param_3 = a;
  6505      uint param_4 = ix + 1u;
  6506      uint param_5 = s.bbox.z | (s.bbox.w << uint(16));
  6507      write_mem(param_3, param_4, param_5);
  6508      Alloc param_6 = a;
  6509      uint param_7 = ix + 2u;
  6510      uint param_8 = s.tiles.offset;
  6511      write_mem(param_6, param_7, param_8);
  6512  }
  6513  
  6514  void main()
  6515  {
  6516      uint th_ix = gl_LocalInvocationID.x;
  6517      uint element_ix = gl_GlobalInvocationID.x;
  6518      PathRef path_ref = PathRef(_305.conf.tile_alloc.offset + (element_ix * 12u));
  6519      AnnotatedRef ref = AnnotatedRef(_305.conf.anno_alloc.offset + (element_ix * 32u));
  6520      uint tag = 0u;
  6521      if (element_ix < _305.conf.n_elements)
  6522      {
  6523          Alloc param;
  6524          param.offset = _305.conf.anno_alloc.offset;
  6525          AnnotatedRef param_1 = ref;
  6526          tag = Annotated_tag(param, param_1).tag;
  6527      }
  6528      int x0 = 0;
  6529      int y0 = 0;
  6530      int x1 = 0;
  6531      int y1 = 0;
  6532      switch (tag)
  6533      {
  6534          case 1u:
  6535          case 2u:
  6536          case 3u:
  6537          case 4u:
  6538          {
  6539              Alloc param_2;
  6540              param_2.offset = _305.conf.anno_alloc.offset;
  6541              AnnotatedRef param_3 = ref;
  6542              AnnoEndClip clip = Annotated_EndClip_read(param_2, param_3);
  6543              x0 = int(floor(clip.bbox.x * 0.03125));
  6544              y0 = int(floor(clip.bbox.y * 0.03125));
  6545              x1 = int(ceil(clip.bbox.z * 0.03125));
  6546              y1 = int(ceil(clip.bbox.w * 0.03125));
  6547              break;
  6548          }
  6549      }
  6550      x0 = clamp(x0, 0, int(_305.conf.width_in_tiles));
  6551      y0 = clamp(y0, 0, int(_305.conf.height_in_tiles));
  6552      x1 = clamp(x1, 0, int(_305.conf.width_in_tiles));
  6553      y1 = clamp(y1, 0, int(_305.conf.height_in_tiles));
  6554      Path path;
  6555      path.bbox = uvec4(uint(x0), uint(y0), uint(x1), uint(y1));
  6556      uint tile_count = uint((x1 - x0) * (y1 - y0));
  6557      if (tag == 4u)
  6558      {
  6559          tile_count = 0u;
  6560      }
  6561      sh_tile_count[th_ix] = tile_count;
  6562      uint total_tile_count = tile_count;
  6563      for (uint i = 0u; i < 7u; i++)
  6564      {
  6565          barrier();
  6566          if (th_ix >= uint(1 << int(i)))
  6567          {
  6568              total_tile_count += sh_tile_count[th_ix - uint(1 << int(i))];
  6569          }
  6570          barrier();
  6571          sh_tile_count[th_ix] = total_tile_count;
  6572      }
  6573      if (th_ix == 127u)
  6574      {
  6575          uint param_4 = total_tile_count * 8u;
  6576          MallocResult _478 = malloc(param_4);
  6577          sh_tile_alloc = _478;
  6578      }
  6579      barrier();
  6580      MallocResult alloc_start = sh_tile_alloc;
  6581      bool _489;
  6582      if (!alloc_start.failed)
  6583      {
  6584          _489 = _92.mem_error != 0u;
  6585      }
  6586      else
  6587      {
  6588          _489 = alloc_start.failed;
  6589      }
  6590      if (_489)
  6591      {
  6592          return;
  6593      }
  6594      if (element_ix < _305.conf.n_elements)
  6595      {
  6596          uint _502;
  6597          if (th_ix > 0u)
  6598          {
  6599              _502 = sh_tile_count[th_ix - 1u];
  6600          }
  6601          else
  6602          {
  6603              _502 = 0u;
  6604          }
  6605          uint tile_subix = _502;
  6606          Alloc param_5 = alloc_start.alloc;
  6607          uint param_6 = 8u * tile_subix;
  6608          uint param_7 = 8u * tile_count;
  6609          Alloc tiles_alloc = slice_mem(param_5, param_6, param_7);
  6610          path.tiles = TileRef(tiles_alloc.offset);
  6611          Alloc param_8;
  6612          param_8.offset = _305.conf.tile_alloc.offset;
  6613          PathRef param_9 = path_ref;
  6614          Path param_10 = path;
  6615          Path_write(param_8, param_9, param_10);
  6616      }
  6617      uint total_count = sh_tile_count[127] * 2u;
  6618      uint start_ix = alloc_start.alloc.offset >> uint(2);
  6619      for (uint i_1 = th_ix; i_1 < total_count; i_1 += 128u)
  6620      {
  6621          Alloc param_11 = alloc_start.alloc;
  6622          uint param_12 = start_ix + i_1;
  6623          uint param_13 = 0u;
  6624          write_mem(param_11, param_12, param_13);
  6625      }
  6626  }
  6627  
  6628  `,
  6629  	}
  6630  )