From e73049fe984e60bea9504c5912845a2d365dbdd0 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Mon, 16 May 2022 11:01:03 -0700 Subject: [PATCH 1/2] First cut at split blend stack Split the blend stack into register and memory segments. Do blending in registers up to that size, then spill to memory if needed. This version may regress performance on Pixel 4, as it uses common memory for the blend stack, rather than keeping that memory read-only in fine rasterization, and using a separate buffer for blend stack. This needs investigation. It's possible we'll want to have single common memory as a config option, as it pools allocations and decreases the probability of failure. Also a flaw in this version: there is no checking of memory overflow. For understanding code history: this commit largely reverts #77, but there were some intervening changes to blending, and this commit also implements the split so some of the stack is in registers. Closes #156 --- piet-gpu/shader/coarse.comp | 11 ++ piet-gpu/shader/gen/coarse.dxil | Bin 11628 -> 11632 bytes piet-gpu/shader/gen/coarse.hlsl | 181 ++++++++++++++------------ piet-gpu/shader/gen/coarse.msl | 133 ++++++++++--------- piet-gpu/shader/gen/coarse.spv | Bin 58852 -> 59304 bytes piet-gpu/shader/gen/kernel4.dxil | Bin 15360 -> 15892 bytes piet-gpu/shader/gen/kernel4.hlsl | 140 +++++++++++--------- piet-gpu/shader/gen/kernel4.msl | 116 ++++++++++------- piet-gpu/shader/gen/kernel4.spv | Bin 66476 -> 67556 bytes piet-gpu/shader/gen/kernel4_gray.dxil | Bin 15268 -> 15796 bytes piet-gpu/shader/gen/kernel4_gray.hlsl | 138 +++++++++++--------- piet-gpu/shader/gen/kernel4_gray.msl | 114 +++++++++------- piet-gpu/shader/gen/kernel4_gray.spv | Bin 66232 -> 67312 bytes piet-gpu/shader/kernel4.comp | 39 ++++-- piet-gpu/shader/setup.h | 6 +- piet-gpu/src/lib.rs | 2 - piet-gpu/src/render_ctx.rs | 7 - 17 files changed, 504 insertions(+), 383 deletions(-) diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index 3abb2e0..c93d002 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -151,6 +151,11 @@ void main() { uint part_start_ix = 0; uint ready_ix = 0; + cmd_ref.offset += 4; + // Accounting for allocation of blend memory + uint render_blend_depth = 0; + uint max_blend_depth = 0; + uint drawmonoid_start = conf.drawmonoid_alloc.offset >> 2; uint drawtag_start = conf.drawtag_offset >> 2; uint drawdata_start = conf.drawdata_offset >> 2; @@ -414,6 +419,8 @@ void main() { } Cmd_BeginClip_write(cmd_alloc, cmd_ref); cmd_ref.offset += 4; + render_blend_depth++; + max_blend_depth = max(max_blend_depth, render_blend_depth); } clip_depth++; break; @@ -426,6 +433,7 @@ void main() { uint blend = scene[dd]; Cmd_EndClip_write(cmd_alloc, cmd_ref, CmdEndClip(blend)); cmd_ref.offset += 4 + CmdEndClip_size; + render_blend_depth--; break; } } else { @@ -451,5 +459,8 @@ void main() { } if (bin_tile_x + tile_x < conf.width_in_tiles && bin_tile_y + tile_y < conf.height_in_tiles) { Cmd_End_write(cmd_alloc, cmd_ref); + if (max_blend_depth > BLEND_STACK_SPLIT) { + // TODO: allocate blend memory and write result + } } } diff --git a/piet-gpu/shader/gen/coarse.dxil b/piet-gpu/shader/gen/coarse.dxil index 910925dd080752fe8c34968c6b8992f0dbb8556e..cbebec03be0c79bac892e2aec1896e91f903b842 100644 GIT binary patch delta 7127 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 delta 7123 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 bfb*jW@E`$Z2NU3dIRy9}B^@~GpTGYB*l${k diff --git a/piet-gpu/shader/gen/coarse.hlsl b/piet-gpu/shader/gen/coarse.hlsl index 04529bb..0519a63 100644 --- a/piet-gpu/shader/gen/coarse.hlsl +++ b/piet-gpu/shader/gen/coarse.hlsl @@ -177,7 +177,7 @@ static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); RWByteAddressBuffer _260 : register(u0, space0); ByteAddressBuffer _1005 : register(t1, space0); -ByteAddressBuffer _1372 : register(t2, space0); +ByteAddressBuffer _1378 : register(t2, space0); static uint3 gl_WorkGroupID; static uint3 gl_LocalInvocationID; @@ -681,6 +681,9 @@ void comp_main() uint wr_ix = 0u; uint part_start_ix = 0u; uint ready_ix = 0u; + cmd_ref.offset += 4u; + uint render_blend_depth = 0u; + uint max_blend_depth = 0u; uint drawmonoid_start = _1005.Load(44) >> uint(2); uint drawtag_start = _1005.Load(100) >> uint(2); uint drawdata_start = _1005.Load(104) >> uint(2); @@ -688,11 +691,11 @@ void comp_main() bool mem_ok = _260.Load(4) == 0u; Alloc param_3; Alloc param_5; - uint _1304; + uint _1310; uint element_ix; Alloc param_14; uint tile_count; - uint _1605; + uint _1611; float linewidth; CmdLinGrad cmd_lin; CmdRadGrad cmd_rad; @@ -702,34 +705,34 @@ void comp_main() { sh_bitmaps[i][th_ix] = 0u; } - bool _1356; + bool _1362; for (;;) { if ((ready_ix == wr_ix) && (partition_ix < n_partitions)) { part_start_ix = ready_ix; uint count = 0u; - bool _1154 = th_ix < 256u; - bool _1162; - if (_1154) + bool _1160 = th_ix < 256u; + bool _1168; + if (_1160) { - _1162 = (partition_ix + th_ix) < n_partitions; + _1168 = (partition_ix + th_ix) < n_partitions; } else { - _1162 = _1154; + _1168 = _1160; } - if (_1162) + if (_1168) { uint in_ix = (_1005.Load(20) >> uint(2)) + ((((partition_ix + th_ix) * 256u) + bin_ix) * 2u); - Alloc _1179; - _1179.offset = _1005.Load(20); - param_3.offset = _1179.offset; + Alloc _1185; + _1185.offset = _1005.Load(20); + param_3.offset = _1185.offset; uint param_4 = in_ix; count = read_mem(param_3, param_4); - Alloc _1190; - _1190.offset = _1005.Load(20); - param_5.offset = _1190.offset; + Alloc _1196; + _1196.offset = _1005.Load(20); + param_5.offset = _1196.offset; uint param_6 = in_ix + 1u; uint offset = read_mem(param_5, param_6); uint param_7 = offset; @@ -775,16 +778,16 @@ void comp_main() } if (part_ix > 0u) { - _1304 = sh_part_count[part_ix - 1u]; + _1310 = sh_part_count[part_ix - 1u]; } else { - _1304 = part_start_ix; + _1310 = part_start_ix; } - ix -= _1304; + ix -= _1310; Alloc bin_alloc = sh_part_elements[part_ix]; - BinInstanceRef _1323 = { bin_alloc.offset }; - BinInstanceRef inst_ref = _1323; + BinInstanceRef _1329 = { bin_alloc.offset }; + BinInstanceRef inst_ref = _1329; BinInstanceRef param_10 = inst_ref; uint param_11 = ix; Alloc param_12 = bin_alloc; @@ -794,16 +797,16 @@ void comp_main() } GroupMemoryBarrierWithGroupSync(); wr_ix = min((rd_ix + 256u), ready_ix); - bool _1346 = (wr_ix - rd_ix) < 256u; - if (_1346) + bool _1352 = (wr_ix - rd_ix) < 256u; + if (_1352) { - _1356 = (wr_ix < ready_ix) || (partition_ix < n_partitions); + _1362 = (wr_ix < ready_ix) || (partition_ix < n_partitions); } else { - _1356 = _1346; + _1362 = _1352; } - if (_1356) + if (_1362) { continue; } @@ -816,7 +819,7 @@ void comp_main() if ((th_ix + rd_ix) < wr_ix) { element_ix = sh_elements[th_ix]; - tag = _1372.Load((drawtag_start + element_ix) * 4 + 0); + tag = _1378.Load((drawtag_start + element_ix) * 4 + 0); } switch (tag) { @@ -829,11 +832,11 @@ void comp_main() { uint drawmonoid_base = drawmonoid_start + (4u * element_ix); uint path_ix = _260.Load(drawmonoid_base * 4 + 8); - PathRef _1397 = { _1005.Load(16) + (path_ix * 12u) }; - Alloc _1400; - _1400.offset = _1005.Load(16); - param_14.offset = _1400.offset; - PathRef param_15 = _1397; + PathRef _1403 = { _1005.Load(16) + (path_ix * 12u) }; + Alloc _1406; + _1406.offset = _1005.Load(16); + param_14.offset = _1406.offset; + PathRef param_15 = _1403; Path path = Path_read(param_14, param_15); uint stride = path.bbox.z - path.bbox.x; sh_tile_stride[th_ix] = stride; @@ -889,16 +892,16 @@ void comp_main() } } uint element_ix_1 = sh_elements[el_ix]; - uint tag_1 = _1372.Load((drawtag_start + element_ix_1) * 4 + 0); + uint tag_1 = _1378.Load((drawtag_start + element_ix_1) * 4 + 0); if (el_ix > 0u) { - _1605 = sh_tile_count[el_ix - 1u]; + _1611 = sh_tile_count[el_ix - 1u]; } else { - _1605 = 0u; + _1611 = 0u; } - uint seq_ix = ix_1 - _1605; + uint seq_ix = ix_1 - _1611; uint width = sh_tile_width[el_ix]; uint x = sh_tile_x0[el_ix] + (seq_ix % width); uint y = sh_tile_y0[el_ix] + (seq_ix / width); @@ -907,9 +910,9 @@ void comp_main() { uint param_21 = el_ix; bool param_22 = mem_ok; - TileRef _1657 = { sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u) }; + TileRef _1663 = { sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u) }; Alloc param_23 = read_tile_alloc(param_21, param_22); - TileRef param_24 = _1657; + TileRef param_24 = _1663; Tile tile = Tile_read(param_23, param_24); bool is_clip = (tag_1 & 1u) != 0u; bool is_blend = false; @@ -918,27 +921,27 @@ void comp_main() uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); uint scene_offset = _260.Load((drawmonoid_base_1 + 2u) * 4 + 8); uint dd = drawdata_start + (scene_offset >> uint(2)); - uint blend = _1372.Load(dd * 4 + 0); + uint blend = _1378.Load(dd * 4 + 0); is_blend = blend != 3u; } - bool _1692 = tile.tile.offset != 0u; - bool _1701; - if (!_1692) + bool _1698 = tile.tile.offset != 0u; + bool _1707; + if (!_1698) { - _1701 = (tile.backdrop == 0) == is_clip; + _1707 = (tile.backdrop == 0) == is_clip; } else { - _1701 = _1692; + _1707 = _1698; } - include_tile = _1701 || is_blend; + include_tile = _1707 || is_blend; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1723; - InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1723); + uint _1729; + InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1729); } } GroupMemoryBarrierWithGroupSync(); @@ -962,14 +965,14 @@ void comp_main() uint element_ref_ix = (slice_ix * 32u) + uint(int(firstbitlow(bitmap))); uint element_ix_2 = sh_elements[element_ref_ix]; bitmap &= (bitmap - 1u); - uint drawtag = _1372.Load((drawtag_start + element_ix_2) * 4 + 0); + uint drawtag = _1378.Load((drawtag_start + element_ix_2) * 4 + 0); if (clip_zero_depth == 0u) { uint param_25 = element_ref_ix; bool param_26 = mem_ok; - TileRef _1800 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; + TileRef _1806 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; Alloc param_27 = read_tile_alloc(param_25, param_26); - TileRef param_28 = _1800; + TileRef param_28 = _1806; Tile tile_1 = Tile_read(param_27, param_28); uint drawmonoid_base_2 = drawmonoid_start + (4u * element_ix_2); uint scene_offset_1 = _260.Load((drawmonoid_base_2 + 2u) * 4 + 8); @@ -984,11 +987,11 @@ void comp_main() Alloc param_29 = cmd_alloc; CmdRef param_30 = cmd_ref; uint param_31 = cmd_limit; - bool _1848 = alloc_cmd(param_29, param_30, param_31); + bool _1854 = alloc_cmd(param_29, param_30, param_31); cmd_alloc = param_29; cmd_ref = param_30; cmd_limit = param_31; - if (!_1848) + if (!_1854) { break; } @@ -998,11 +1001,11 @@ void comp_main() float param_35 = linewidth; write_fill(param_32, param_33, param_34, param_35); cmd_ref = param_33; - uint rgba = _1372.Load(dd_1 * 4 + 0); - CmdColor _1871 = { rgba }; + uint rgba = _1378.Load(dd_1 * 4 + 0); + CmdColor _1877 = { rgba }; Alloc param_36 = cmd_alloc; CmdRef param_37 = cmd_ref; - CmdColor param_38 = _1871; + CmdColor param_38 = _1877; Cmd_Color_write(param_36, param_37, param_38); cmd_ref.offset += 8u; break; @@ -1012,11 +1015,11 @@ void comp_main() Alloc param_39 = cmd_alloc; CmdRef param_40 = cmd_ref; uint param_41 = cmd_limit; - bool _1889 = alloc_cmd(param_39, param_40, param_41); + bool _1895 = alloc_cmd(param_39, param_40, param_41); cmd_alloc = param_39; cmd_ref = param_40; cmd_limit = param_41; - if (!_1889) + if (!_1895) { break; } @@ -1027,7 +1030,7 @@ void comp_main() float param_45 = linewidth; write_fill(param_42, param_43, param_44, param_45); cmd_ref = param_43; - cmd_lin.index = _1372.Load(dd_1 * 4 + 0); + cmd_lin.index = _1378.Load(dd_1 * 4 + 0); cmd_lin.line_x = asfloat(_260.Load((di + 1u) * 4 + 8)); cmd_lin.line_y = asfloat(_260.Load((di + 2u) * 4 + 8)); cmd_lin.line_c = asfloat(_260.Load((di + 3u) * 4 + 8)); @@ -1043,11 +1046,11 @@ void comp_main() Alloc param_49 = cmd_alloc; CmdRef param_50 = cmd_ref; uint param_51 = cmd_limit; - bool _1953 = alloc_cmd(param_49, param_50, param_51); + bool _1959 = alloc_cmd(param_49, param_50, param_51); cmd_alloc = param_49; cmd_ref = param_50; cmd_limit = param_51; - if (!_1953) + if (!_1959) { break; } @@ -1058,7 +1061,7 @@ void comp_main() float param_55 = linewidth; write_fill(param_52, param_53, param_54, param_55); cmd_ref = param_53; - cmd_rad.index = _1372.Load(dd_1 * 4 + 0); + cmd_rad.index = _1378.Load(dd_1 * 4 + 0); cmd_rad.mat = asfloat(uint4(_260.Load((di + 1u) * 4 + 8), _260.Load((di + 2u) * 4 + 8), _260.Load((di + 3u) * 4 + 8), _260.Load((di + 4u) * 4 + 8))); cmd_rad.xlat = asfloat(uint2(_260.Load((di + 5u) * 4 + 8), _260.Load((di + 6u) * 4 + 8))); cmd_rad.c1 = asfloat(uint2(_260.Load((di + 7u) * 4 + 8), _260.Load((di + 8u) * 4 + 8))); @@ -1077,11 +1080,11 @@ void comp_main() Alloc param_59 = cmd_alloc; CmdRef param_60 = cmd_ref; uint param_61 = cmd_limit; - bool _2059 = alloc_cmd(param_59, param_60, param_61); + bool _2065 = alloc_cmd(param_59, param_60, param_61); cmd_alloc = param_59; cmd_ref = param_60; cmd_limit = param_61; - if (!_2059) + if (!_2065) { break; } @@ -1091,30 +1094,30 @@ void comp_main() float param_65 = linewidth; write_fill(param_62, param_63, param_64, param_65); cmd_ref = param_63; - uint index = _1372.Load(dd_1 * 4 + 0); - uint raw1 = _1372.Load((dd_1 + 1u) * 4 + 0); + uint index = _1378.Load(dd_1 * 4 + 0); + uint raw1 = _1378.Load((dd_1 + 1u) * 4 + 0); int2 offset_1 = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); - CmdImage _2098 = { index, offset_1 }; + CmdImage _2104 = { index, offset_1 }; Alloc param_66 = cmd_alloc; CmdRef param_67 = cmd_ref; - CmdImage param_68 = _2098; + CmdImage param_68 = _2104; Cmd_Image_write(param_66, param_67, param_68); cmd_ref.offset += 12u; break; } case 5u: { - bool _2112 = tile_1.tile.offset == 0u; - bool _2118; - if (_2112) + bool _2118 = tile_1.tile.offset == 0u; + bool _2124; + if (_2118) { - _2118 = tile_1.backdrop == 0; + _2124 = tile_1.backdrop == 0; } else { - _2118 = _2112; + _2124 = _2118; } - if (_2118) + if (_2124) { clip_zero_depth = clip_depth + 1u; } @@ -1123,11 +1126,11 @@ void comp_main() Alloc param_69 = cmd_alloc; CmdRef param_70 = cmd_ref; uint param_71 = cmd_limit; - bool _2130 = alloc_cmd(param_69, param_70, param_71); + bool _2136 = alloc_cmd(param_69, param_70, param_71); cmd_alloc = param_69; cmd_ref = param_70; cmd_limit = param_71; - if (!_2130) + if (!_2136) { break; } @@ -1135,6 +1138,8 @@ void comp_main() CmdRef param_73 = cmd_ref; Cmd_BeginClip_write(param_72, param_73); cmd_ref.offset += 4u; + render_blend_depth++; + max_blend_depth = max(max_blend_depth, render_blend_depth); } clip_depth++; break; @@ -1145,11 +1150,11 @@ void comp_main() Alloc param_74 = cmd_alloc; CmdRef param_75 = cmd_ref; uint param_76 = cmd_limit; - bool _2158 = alloc_cmd(param_74, param_75, param_76); + bool _2169 = alloc_cmd(param_74, param_75, param_76); cmd_alloc = param_74; cmd_ref = param_75; cmd_limit = param_76; - if (!_2158) + if (!_2169) { break; } @@ -1159,13 +1164,14 @@ void comp_main() float param_80 = -1.0f; write_fill(param_77, param_78, param_79, param_80); cmd_ref = param_78; - uint blend_1 = _1372.Load(dd_1 * 4 + 0); - CmdEndClip _2181 = { blend_1 }; + uint blend_1 = _1378.Load(dd_1 * 4 + 0); + CmdEndClip _2192 = { blend_1 }; Alloc param_81 = cmd_alloc; CmdRef param_82 = cmd_ref; - CmdEndClip param_83 = _2181; + CmdEndClip param_83 = _2192; Cmd_EndClip_write(param_81, param_82, param_83); cmd_ref.offset += 8u; + render_blend_depth--; break; } } @@ -1198,21 +1204,24 @@ void comp_main() break; } } - bool _2228 = (bin_tile_x + tile_x) < _1005.Load(8); - bool _2237; - if (_2228) + bool _2241 = (bin_tile_x + tile_x) < _1005.Load(8); + bool _2250; + if (_2241) { - _2237 = (bin_tile_y + tile_y) < _1005.Load(12); + _2250 = (bin_tile_y + tile_y) < _1005.Load(12); } else { - _2237 = _2228; + _2250 = _2241; } - if (_2237) + if (_2250) { Alloc param_84 = cmd_alloc; CmdRef param_85 = cmd_ref; Cmd_End_write(param_84, param_85); + if (max_blend_depth > 4u) + { + } } } diff --git a/piet-gpu/shader/gen/coarse.msl b/piet-gpu/shader/gen/coarse.msl index 55812d4..578fa37 100644 --- a/piet-gpu/shader/gen/coarse.msl +++ b/piet-gpu/shader/gen/coarse.msl @@ -677,7 +677,7 @@ void Cmd_End_write(thread const Alloc& a, thread const CmdRef& ref, device Memor write_mem(param, param_1, param_2, v_260, v_260BufferSize); } -kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device Memory& v_260 [[buffer(0)]], const device ConfigBuf& _1005 [[buffer(1)]], const device SceneBuf& _1372 [[buffer(2)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) +kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device Memory& v_260 [[buffer(0)]], const device ConfigBuf& _1005 [[buffer(1)]], const device SceneBuf& _1378 [[buffer(2)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) { threadgroup uint sh_bitmaps[8][256]; threadgroup Alloc sh_part_elements[256]; @@ -713,6 +713,9 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M uint wr_ix = 0u; uint part_start_ix = 0u; uint ready_ix = 0u; + cmd_ref.offset += 4u; + uint render_blend_depth = 0u; + uint max_blend_depth = 0u; uint drawmonoid_start = _1005.conf.drawmonoid_alloc.offset >> uint(2); uint drawtag_start = _1005.conf.drawtag_offset >> uint(2); uint drawdata_start = _1005.conf.drawdata_offset >> uint(2); @@ -720,11 +723,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M bool mem_ok = v_260.mem_error == 0u; Alloc param_3; Alloc param_5; - uint _1304; + uint _1310; uint element_ix; Alloc param_14; uint tile_count; - uint _1605; + uint _1611; float linewidth; CmdLinGrad cmd_lin; CmdRadGrad cmd_rad; @@ -734,24 +737,24 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M { sh_bitmaps[i][th_ix] = 0u; } - bool _1356; + bool _1362; for (;;) { if ((ready_ix == wr_ix) && (partition_ix < n_partitions)) { part_start_ix = ready_ix; uint count = 0u; - bool _1154 = th_ix < 256u; - bool _1162; - if (_1154) + bool _1160 = th_ix < 256u; + bool _1168; + if (_1160) { - _1162 = (partition_ix + th_ix) < n_partitions; + _1168 = (partition_ix + th_ix) < n_partitions; } else { - _1162 = _1154; + _1168 = _1160; } - if (_1162) + if (_1168) { uint in_ix = (_1005.conf.bin_alloc.offset >> uint(2)) + ((((partition_ix + th_ix) * 256u) + bin_ix) * 2u); param_3.offset = _1005.conf.bin_alloc.offset; @@ -803,13 +806,13 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } if (part_ix > 0u) { - _1304 = sh_part_count[part_ix - 1u]; + _1310 = sh_part_count[part_ix - 1u]; } else { - _1304 = part_start_ix; + _1310 = part_start_ix; } - ix -= _1304; + ix -= _1310; Alloc bin_alloc = sh_part_elements[part_ix]; BinInstanceRef inst_ref = BinInstanceRef{ bin_alloc.offset }; BinInstanceRef param_10 = inst_ref; @@ -821,16 +824,16 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } threadgroup_barrier(mem_flags::mem_threadgroup); wr_ix = min((rd_ix + 256u), ready_ix); - bool _1346 = (wr_ix - rd_ix) < 256u; - if (_1346) + bool _1352 = (wr_ix - rd_ix) < 256u; + if (_1352) { - _1356 = (wr_ix < ready_ix) || (partition_ix < n_partitions); + _1362 = (wr_ix < ready_ix) || (partition_ix < n_partitions); } else { - _1356 = _1346; + _1362 = _1352; } - if (_1356) + if (_1362) { continue; } @@ -843,7 +846,7 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M if ((th_ix + rd_ix) < wr_ix) { element_ix = sh_elements[th_ix]; - tag = _1372.scene[drawtag_start + element_ix]; + tag = _1378.scene[drawtag_start + element_ix]; } switch (tag) { @@ -913,16 +916,16 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } } uint element_ix_1 = sh_elements[el_ix]; - uint tag_1 = _1372.scene[drawtag_start + element_ix_1]; + uint tag_1 = _1378.scene[drawtag_start + element_ix_1]; if (el_ix > 0u) { - _1605 = sh_tile_count[el_ix - 1u]; + _1611 = sh_tile_count[el_ix - 1u]; } else { - _1605 = 0u; + _1611 = 0u; } - uint seq_ix = ix_1 - _1605; + uint seq_ix = ix_1 - _1611; uint width = sh_tile_width[el_ix]; uint x = sh_tile_x0[el_ix] + (seq_ix % width); uint y = sh_tile_y0[el_ix] + (seq_ix / width); @@ -941,26 +944,26 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); uint scene_offset = v_260.memory[drawmonoid_base_1 + 2u]; uint dd = drawdata_start + (scene_offset >> uint(2)); - uint blend = _1372.scene[dd]; + uint blend = _1378.scene[dd]; is_blend = blend != 3u; } - bool _1692 = tile.tile.offset != 0u; - bool _1701; - if (!_1692) + bool _1698 = tile.tile.offset != 0u; + bool _1707; + if (!_1698) { - _1701 = (tile.backdrop == 0) == is_clip; + _1707 = (tile.backdrop == 0) == is_clip; } else { - _1701 = _1692; + _1707 = _1698; } - include_tile = _1701 || is_blend; + include_tile = _1707 || is_blend; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1723 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&sh_bitmaps[el_slice][(y * 16u) + x], el_mask, memory_order_relaxed); + uint _1729 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&sh_bitmaps[el_slice][(y * 16u) + x], el_mask, memory_order_relaxed); } } threadgroup_barrier(mem_flags::mem_threadgroup); @@ -984,7 +987,7 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M uint element_ref_ix = (slice_ix * 32u) + uint(int(spvFindLSB(bitmap))); uint element_ix_2 = sh_elements[element_ref_ix]; bitmap &= (bitmap - 1u); - uint drawtag = _1372.scene[drawtag_start + element_ix_2]; + uint drawtag = _1378.scene[drawtag_start + element_ix_2]; if (clip_zero_depth == 0u) { uint param_25 = element_ref_ix; @@ -1005,11 +1008,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_29 = cmd_alloc; CmdRef param_30 = cmd_ref; uint param_31 = cmd_limit; - bool _1848 = alloc_cmd(param_29, param_30, param_31, v_260, v_260BufferSize); + bool _1854 = alloc_cmd(param_29, param_30, param_31, v_260, v_260BufferSize); cmd_alloc = param_29; cmd_ref = param_30; cmd_limit = param_31; - if (!_1848) + if (!_1854) { break; } @@ -1019,7 +1022,7 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M float param_35 = linewidth; write_fill(param_32, param_33, param_34, param_35, v_260, v_260BufferSize); cmd_ref = param_33; - uint rgba = _1372.scene[dd_1]; + uint rgba = _1378.scene[dd_1]; Alloc param_36 = cmd_alloc; CmdRef param_37 = cmd_ref; CmdColor param_38 = CmdColor{ rgba }; @@ -1032,11 +1035,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_39 = cmd_alloc; CmdRef param_40 = cmd_ref; uint param_41 = cmd_limit; - bool _1889 = alloc_cmd(param_39, param_40, param_41, v_260, v_260BufferSize); + bool _1895 = alloc_cmd(param_39, param_40, param_41, v_260, v_260BufferSize); cmd_alloc = param_39; cmd_ref = param_40; cmd_limit = param_41; - if (!_1889) + if (!_1895) { break; } @@ -1047,7 +1050,7 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M float param_45 = linewidth; write_fill(param_42, param_43, param_44, param_45, v_260, v_260BufferSize); cmd_ref = param_43; - cmd_lin.index = _1372.scene[dd_1]; + cmd_lin.index = _1378.scene[dd_1]; cmd_lin.line_x = as_type(v_260.memory[di + 1u]); cmd_lin.line_y = as_type(v_260.memory[di + 2u]); cmd_lin.line_c = as_type(v_260.memory[di + 3u]); @@ -1063,11 +1066,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_49 = cmd_alloc; CmdRef param_50 = cmd_ref; uint param_51 = cmd_limit; - bool _1953 = alloc_cmd(param_49, param_50, param_51, v_260, v_260BufferSize); + bool _1959 = alloc_cmd(param_49, param_50, param_51, v_260, v_260BufferSize); cmd_alloc = param_49; cmd_ref = param_50; cmd_limit = param_51; - if (!_1953) + if (!_1959) { break; } @@ -1078,7 +1081,7 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M float param_55 = linewidth; write_fill(param_52, param_53, param_54, param_55, v_260, v_260BufferSize); cmd_ref = param_53; - cmd_rad.index = _1372.scene[dd_1]; + cmd_rad.index = _1378.scene[dd_1]; cmd_rad.mat = as_type(uint4(v_260.memory[di + 1u], v_260.memory[di + 2u], v_260.memory[di + 3u], v_260.memory[di + 4u])); cmd_rad.xlat = as_type(uint2(v_260.memory[di + 5u], v_260.memory[di + 6u])); cmd_rad.c1 = as_type(uint2(v_260.memory[di + 7u], v_260.memory[di + 8u])); @@ -1097,11 +1100,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_59 = cmd_alloc; CmdRef param_60 = cmd_ref; uint param_61 = cmd_limit; - bool _2059 = alloc_cmd(param_59, param_60, param_61, v_260, v_260BufferSize); + bool _2065 = alloc_cmd(param_59, param_60, param_61, v_260, v_260BufferSize); cmd_alloc = param_59; cmd_ref = param_60; cmd_limit = param_61; - if (!_2059) + if (!_2065) { break; } @@ -1111,8 +1114,8 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M float param_65 = linewidth; write_fill(param_62, param_63, param_64, param_65, v_260, v_260BufferSize); cmd_ref = param_63; - uint index = _1372.scene[dd_1]; - uint raw1 = _1372.scene[dd_1 + 1u]; + uint index = _1378.scene[dd_1]; + uint raw1 = _1378.scene[dd_1 + 1u]; int2 offset_1 = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); Alloc param_66 = cmd_alloc; CmdRef param_67 = cmd_ref; @@ -1123,17 +1126,17 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } case 5u: { - bool _2112 = tile_1.tile.offset == 0u; - bool _2118; - if (_2112) + bool _2118 = tile_1.tile.offset == 0u; + bool _2124; + if (_2118) { - _2118 = tile_1.backdrop == 0; + _2124 = tile_1.backdrop == 0; } else { - _2118 = _2112; + _2124 = _2118; } - if (_2118) + if (_2124) { clip_zero_depth = clip_depth + 1u; } @@ -1142,11 +1145,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_69 = cmd_alloc; CmdRef param_70 = cmd_ref; uint param_71 = cmd_limit; - bool _2130 = alloc_cmd(param_69, param_70, param_71, v_260, v_260BufferSize); + bool _2136 = alloc_cmd(param_69, param_70, param_71, v_260, v_260BufferSize); cmd_alloc = param_69; cmd_ref = param_70; cmd_limit = param_71; - if (!_2130) + if (!_2136) { break; } @@ -1154,6 +1157,8 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M CmdRef param_73 = cmd_ref; Cmd_BeginClip_write(param_72, param_73, v_260, v_260BufferSize); cmd_ref.offset += 4u; + render_blend_depth++; + max_blend_depth = max(max_blend_depth, render_blend_depth); } clip_depth++; break; @@ -1164,11 +1169,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_74 = cmd_alloc; CmdRef param_75 = cmd_ref; uint param_76 = cmd_limit; - bool _2158 = alloc_cmd(param_74, param_75, param_76, v_260, v_260BufferSize); + bool _2169 = alloc_cmd(param_74, param_75, param_76, v_260, v_260BufferSize); cmd_alloc = param_74; cmd_ref = param_75; cmd_limit = param_76; - if (!_2158) + if (!_2169) { break; } @@ -1178,12 +1183,13 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M float param_80 = -1.0; write_fill(param_77, param_78, param_79, param_80, v_260, v_260BufferSize); cmd_ref = param_78; - uint blend_1 = _1372.scene[dd_1]; + uint blend_1 = _1378.scene[dd_1]; Alloc param_81 = cmd_alloc; CmdRef param_82 = cmd_ref; CmdEndClip param_83 = CmdEndClip{ blend_1 }; Cmd_EndClip_write(param_81, param_82, param_83, v_260, v_260BufferSize); cmd_ref.offset += 8u; + render_blend_depth--; break; } } @@ -1216,21 +1222,24 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M break; } } - bool _2228 = (bin_tile_x + tile_x) < _1005.conf.width_in_tiles; - bool _2237; - if (_2228) + bool _2241 = (bin_tile_x + tile_x) < _1005.conf.width_in_tiles; + bool _2250; + if (_2241) { - _2237 = (bin_tile_y + tile_y) < _1005.conf.height_in_tiles; + _2250 = (bin_tile_y + tile_y) < _1005.conf.height_in_tiles; } else { - _2237 = _2228; + _2250 = _2241; } - if (_2237) + if (_2250) { Alloc param_84 = cmd_alloc; CmdRef param_85 = cmd_ref; Cmd_End_write(param_84, param_85, v_260, v_260BufferSize); + if (max_blend_depth > 4u) + { + } } } diff --git a/piet-gpu/shader/gen/coarse.spv b/piet-gpu/shader/gen/coarse.spv index 6d33ee70c7b65cf2d8b8fef43e5b5ea63b20cbdf..718acca0287508aca55cfb92fbea460da37502b4 100644 GIT binary patch literal 59304 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 diff --git a/piet-gpu/shader/gen/kernel4.dxil b/piet-gpu/shader/gen/kernel4.dxil index da6c56306152a11db46427763591ff31027185e4..5617c51f09394a8e0ee635e97c2f4c02c863eded 100644 GIT binary patch literal 15892 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 NNJzbft=!P-zW^*rCpQ29 literal 15360 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 diff --git a/piet-gpu/shader/gen/kernel4.hlsl b/piet-gpu/shader/gen/kernel4.hlsl index 5d6f839..30779b7 100644 --- a/piet-gpu/shader/gen/kernel4.hlsl +++ b/piet-gpu/shader/gen/kernel4.hlsl @@ -162,7 +162,7 @@ struct Config static const uint3 gl_WorkGroupSize = uint3(8u, 4u, 1u); RWByteAddressBuffer _297 : register(u0, space0); -ByteAddressBuffer _1749 : register(t1, space0); +ByteAddressBuffer _1725 : register(t1, space0); RWTexture2D image_atlas : register(u3, space0); RWTexture2D gradients : register(u4, space0); RWTexture2D image : register(u2, space0); @@ -477,10 +477,10 @@ void fillImage(out float4 spvReturnValue[8], uint2 xy, CmdImage cmd_img) int2 uv = int2(xy + chunk_offset(param)) + cmd_img.offset; float4 fg_rgba = image_atlas[uv]; float3 param_1 = fg_rgba.xyz; - float3 _1721 = fromsRGB(param_1); - fg_rgba.x = _1721.x; - fg_rgba.y = _1721.y; - fg_rgba.z = _1721.z; + float3 _1697 = fromsRGB(param_1); + fg_rgba.x = _1697.x; + fg_rgba.y = _1697.y; + fg_rgba.z = _1697.z; rgba[i] = fg_rgba; } spvReturnValue = rgba; @@ -918,12 +918,6 @@ float4 mix_compose(float3 cb, float3 cs, float ab, float as, uint mode) break; } case 13u: - { - float rev_as = 1.0f - as; - float rev_ab = 1.0f - ab; - return max(0.0f.xxxx, float4((cs * rev_as) + (cb * rev_ab), rev_as + rev_ab)); - } - case 14u: { return min(1.0f.xxxx, float4((cs * as) + (cb * ab), as + ab)); } @@ -992,16 +986,18 @@ CmdJump Cmd_Jump_read(Alloc a, CmdRef ref) void comp_main() { - uint tile_ix = (gl_WorkGroupID.y * _1749.Load(8)) + gl_WorkGroupID.x; - Alloc _1764; - _1764.offset = _1749.Load(24); + uint tile_ix = (gl_WorkGroupID.y * _1725.Load(8)) + gl_WorkGroupID.x; + Alloc _1740; + _1740.offset = _1725.Load(24); Alloc param; - param.offset = _1764.offset; + param.offset = _1740.offset; uint param_1 = tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); - CmdRef _1773 = { cmd_alloc.offset }; - CmdRef cmd_ref = _1773; + CmdRef _1749 = { cmd_alloc.offset }; + CmdRef cmd_ref = _1749; + uint blend_offset = _297.Load((cmd_ref.offset >> uint(2)) * 4 + 8); + cmd_ref.offset += 4u; uint2 xy_uint = uint2(gl_LocalInvocationID.x + (16u * gl_WorkGroupID.x), gl_LocalInvocationID.y + (16u * gl_WorkGroupID.y)); float2 xy = float2(xy_uint); float4 rgba[8]; @@ -1014,7 +1010,9 @@ void comp_main() float df[8]; TileSegRef tile_seg_ref; float area[8]; - uint blend_stack[128][8]; + uint blend_stack[4][8]; + uint base_ix_1; + uint bg_rgba; while (mem_ok) { Alloc param_3 = cmd_alloc; @@ -1035,8 +1033,8 @@ void comp_main() { df[k] = 1000000000.0f; } - TileSegRef _1867 = { stroke.tile_ref }; - tile_seg_ref = _1867; + TileSegRef _1854 = { stroke.tile_ref }; + tile_seg_ref = _1854; do { uint param_7 = tile_seg_ref.offset; @@ -1072,8 +1070,8 @@ void comp_main() { area[k_3] = float(fill.backdrop); } - TileSegRef _1987 = { fill.tile_ref }; - tile_seg_ref = _1987; + TileSegRef _1974 = { fill.tile_ref }; + tile_seg_ref = _1974; do { uint param_15 = tile_seg_ref.offset; @@ -1162,10 +1160,10 @@ void comp_main() int x = int(round(clamp(my_d, 0.0f, 1.0f) * 511.0f)); float4 fg_rgba = gradients[int2(x, int(lin.index))]; float3 param_29 = fg_rgba.xyz; - float3 _2321 = fromsRGB(param_29); - fg_rgba.x = _2321.x; - fg_rgba.y = _2321.y; - fg_rgba.z = _2321.z; + float3 _2308 = fromsRGB(param_29); + fg_rgba.x = _2308.x; + fg_rgba.y = _2308.y; + fg_rgba.z = _2308.z; float4 fg_k_1 = fg_rgba * area[k_9]; rgba[k_9] = (rgba[k_9] * (1.0f - fg_k_1.w)) + fg_k_1; } @@ -1188,10 +1186,10 @@ void comp_main() int x_1 = int(round(clamp(t_2, 0.0f, 1.0f) * 511.0f)); float4 fg_rgba_1 = gradients[int2(x_1, int(rad.index))]; float3 param_33 = fg_rgba_1.xyz; - float3 _2431 = fromsRGB(param_33); - fg_rgba_1.x = _2431.x; - fg_rgba_1.y = _2431.y; - fg_rgba_1.z = _2431.z; + float3 _2418 = fromsRGB(param_33); + fg_rgba_1.x = _2418.x; + fg_rgba_1.y = _2418.y; + fg_rgba_1.z = _2418.z; float4 fg_k_2 = fg_rgba_1 * area[k_10]; rgba[k_10] = (rgba[k_10] * (1.0f - fg_k_2.w)) + fg_k_2; } @@ -1205,9 +1203,9 @@ void comp_main() CmdImage fill_img = Cmd_Image_read(param_34, param_35); uint2 param_36 = xy_uint; CmdImage param_37 = fill_img; - float4 _2474[8]; - fillImage(_2474, param_36, param_37); - float4 img[8] = _2474; + float4 _2461[8]; + fillImage(_2461, param_36, param_37); + float4 img[8] = _2461; for (uint k_11 = 0u; k_11 < 8u; k_11++) { float4 fg_k_3 = img[k_11] * area[k_11]; @@ -1218,13 +1216,26 @@ void comp_main() } case 9u: { - for (uint k_12 = 0u; k_12 < 8u; k_12++) + if (clip_depth < 4u) { - uint d_2 = min(clip_depth, 127u); - float4 param_38 = float4(rgba[k_12]); - uint _2537 = packsRGB(param_38); - blend_stack[d_2][k_12] = _2537; - rgba[k_12] = 0.0f.xxxx; + for (uint k_12 = 0u; k_12 < 8u; k_12++) + { + float4 param_38 = float4(rgba[k_12]); + uint _2523 = packsRGB(param_38); + blend_stack[clip_depth][k_12] = _2523; + rgba[k_12] = 0.0f.xxxx; + } + } + else + { + uint base_ix = ((blend_offset >> uint(2)) + (((clip_depth - 4u) * 16u) * 16u)) + (8u * (gl_LocalInvocationID.x + (8u * gl_LocalInvocationID.y))); + for (uint k_13 = 0u; k_13 < 8u; k_13++) + { + float4 param_39 = float4(rgba[k_13]); + uint _2566 = packsRGB(param_39); + _297.Store((base_ix + k_13) * 4 + 8, _2566); + rgba[k_13] = 0.0f.xxxx; + } } clip_depth++; cmd_ref.offset += 4u; @@ -1232,32 +1243,41 @@ void comp_main() } case 10u: { - Alloc param_39 = cmd_alloc; - CmdRef param_40 = cmd_ref; - CmdEndClip end_clip = Cmd_EndClip_read(param_39, param_40); - uint blend_mode = end_clip.blend >> uint(8); - uint comp_mode = end_clip.blend & 255u; + Alloc param_40 = cmd_alloc; + CmdRef param_41 = cmd_ref; + CmdEndClip end_clip = Cmd_EndClip_read(param_40, param_41); clip_depth--; - for (uint k_13 = 0u; k_13 < 8u; k_13++) + if (clip_depth < 4u) { - uint d_3 = min(clip_depth, 127u); - uint param_41 = blend_stack[d_3][k_13]; - float4 bg = unpacksRGB(param_41); - float4 fg_1 = rgba[k_13] * area[k_13]; - float4 param_42 = bg; - float4 param_43 = fg_1; - uint param_44 = end_clip.blend; - rgba[k_13] = mix_blend_compose(param_42, param_43, param_44); + base_ix_1 = ((blend_offset >> uint(2)) + (((clip_depth - 4u) * 16u) * 16u)) + (8u * (gl_LocalInvocationID.x + (8u * gl_LocalInvocationID.y))); + } + for (uint k_14 = 0u; k_14 < 8u; k_14++) + { + if (clip_depth < 4u) + { + bg_rgba = blend_stack[clip_depth][k_14]; + } + else + { + bg_rgba = _297.Load((base_ix_1 + k_14) * 4 + 8); + } + uint param_42 = bg_rgba; + float4 bg = unpacksRGB(param_42); + float4 fg_1 = rgba[k_14] * area[k_14]; + float4 param_43 = bg; + float4 param_44 = fg_1; + uint param_45 = end_clip.blend; + rgba[k_14] = mix_blend_compose(param_43, param_44, param_45); } cmd_ref.offset += 8u; break; } case 11u: { - Alloc param_45 = cmd_alloc; - CmdRef param_46 = cmd_ref; - CmdRef _2615 = { Cmd_Jump_read(param_45, param_46).new_ref }; - cmd_ref = _2615; + Alloc param_46 = cmd_alloc; + CmdRef param_47 = cmd_ref; + CmdRef _2665 = { Cmd_Jump_read(param_46, param_47).new_ref }; + cmd_ref = _2665; cmd_alloc.offset = cmd_ref.offset; break; } @@ -1265,9 +1285,9 @@ void comp_main() } for (uint i_1 = 0u; i_1 < 8u; i_1++) { - uint param_47 = i_1; - float3 param_48 = rgba[i_1].xyz; - image[int2(xy_uint + chunk_offset(param_47))] = float4(tosRGB(param_48), rgba[i_1].w); + uint param_48 = i_1; + float3 param_49 = rgba[i_1].xyz; + image[int2(xy_uint + chunk_offset(param_48))] = float4(tosRGB(param_49), rgba[i_1].w); } } diff --git a/piet-gpu/shader/gen/kernel4.msl b/piet-gpu/shader/gen/kernel4.msl index 796043b..6325914 100644 --- a/piet-gpu/shader/gen/kernel4.msl +++ b/piet-gpu/shader/gen/kernel4.msl @@ -528,10 +528,10 @@ spvUnsafeArray fillImage(thread const uint2& xy, thread const CmdImag int2 uv = int2(xy + chunk_offset(param)) + cmd_img.offset; float4 fg_rgba = image_atlas.read(uint2(uv)); float3 param_1 = fg_rgba.xyz; - float3 _1721 = fromsRGB(param_1); - fg_rgba.x = _1721.x; - fg_rgba.y = _1721.y; - fg_rgba.z = _1721.z; + float3 _1697 = fromsRGB(param_1); + fg_rgba.x = _1697.x; + fg_rgba.y = _1697.y; + fg_rgba.z = _1697.z; rgba[i] = fg_rgba; } return rgba; @@ -985,12 +985,6 @@ float4 mix_compose(thread const float3& cb, thread const float3& cs, thread cons break; } case 13u: - { - float rev_as = 1.0 - as; - float rev_ab = 1.0 - ab; - return fast::max(float4(0.0), float4((cs * rev_as) + (cb * rev_ab), rev_as + rev_ab)); - } - case 14u: { return fast::min(float4(1.0), float4((cs * as) + (cb * ab), as + ab)); } @@ -1059,15 +1053,17 @@ CmdJump Cmd_Jump_read(thread const Alloc& a, thread const CmdRef& ref, device Me return CmdJump_read(param, param_1, v_297); } -kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1749 [[buffer(1)]], texture2d image [[texture(2)]], texture2d image_atlas [[texture(3)]], texture2d gradients [[texture(4)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) +kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1725 [[buffer(1)]], texture2d image [[texture(2)]], texture2d image_atlas [[texture(3)]], texture2d gradients [[texture(4)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) { - uint tile_ix = (gl_WorkGroupID.y * _1749.conf.width_in_tiles) + gl_WorkGroupID.x; + uint tile_ix = (gl_WorkGroupID.y * _1725.conf.width_in_tiles) + gl_WorkGroupID.x; Alloc param; - param.offset = _1749.conf.ptcl_alloc.offset; + param.offset = _1725.conf.ptcl_alloc.offset; uint param_1 = tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); CmdRef cmd_ref = CmdRef{ cmd_alloc.offset }; + uint blend_offset = v_297.memory[cmd_ref.offset >> uint(2)]; + cmd_ref.offset += 4u; uint2 xy_uint = uint2(gl_LocalInvocationID.x + (16u * gl_WorkGroupID.x), gl_LocalInvocationID.y + (16u * gl_WorkGroupID.y)); float2 xy = float2(xy_uint); spvUnsafeArray rgba; @@ -1080,7 +1076,9 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 spvUnsafeArray df; TileSegRef tile_seg_ref; spvUnsafeArray area; - spvUnsafeArray, 128> blend_stack; + spvUnsafeArray, 4> blend_stack; + uint base_ix_1; + uint bg_rgba; while (mem_ok) { Alloc param_3 = cmd_alloc; @@ -1226,10 +1224,10 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 int x = int(round(fast::clamp(my_d, 0.0, 1.0) * 511.0)); float4 fg_rgba = gradients.read(uint2(int2(x, int(lin.index)))); float3 param_29 = fg_rgba.xyz; - float3 _2321 = fromsRGB(param_29); - fg_rgba.x = _2321.x; - fg_rgba.y = _2321.y; - fg_rgba.z = _2321.z; + float3 _2308 = fromsRGB(param_29); + fg_rgba.x = _2308.x; + fg_rgba.y = _2308.y; + fg_rgba.z = _2308.z; float4 fg_k_1 = fg_rgba * area[k_9]; rgba[k_9] = (rgba[k_9] * (1.0 - fg_k_1.w)) + fg_k_1; } @@ -1252,10 +1250,10 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 int x_1 = int(round(fast::clamp(t_2, 0.0, 1.0) * 511.0)); float4 fg_rgba_1 = gradients.read(uint2(int2(x_1, int(rad.index)))); float3 param_33 = fg_rgba_1.xyz; - float3 _2431 = fromsRGB(param_33); - fg_rgba_1.x = _2431.x; - fg_rgba_1.y = _2431.y; - fg_rgba_1.z = _2431.z; + float3 _2418 = fromsRGB(param_33); + fg_rgba_1.x = _2418.x; + fg_rgba_1.y = _2418.y; + fg_rgba_1.z = _2418.z; float4 fg_k_2 = fg_rgba_1 * area[k_10]; rgba[k_10] = (rgba[k_10] * (1.0 - fg_k_2.w)) + fg_k_2; } @@ -1281,13 +1279,26 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 } case 9u: { - for (uint k_12 = 0u; k_12 < 8u; k_12++) + if (clip_depth < 4u) { - uint d_2 = min(clip_depth, 127u); - float4 param_38 = float4(rgba[k_12]); - uint _2537 = packsRGB(param_38); - blend_stack[d_2][k_12] = _2537; - rgba[k_12] = float4(0.0); + for (uint k_12 = 0u; k_12 < 8u; k_12++) + { + float4 param_38 = float4(rgba[k_12]); + uint _2523 = packsRGB(param_38); + blend_stack[clip_depth][k_12] = _2523; + rgba[k_12] = float4(0.0); + } + } + else + { + uint base_ix = ((blend_offset >> uint(2)) + (((clip_depth - 4u) * 16u) * 16u)) + (8u * (gl_LocalInvocationID.x + (8u * gl_LocalInvocationID.y))); + for (uint k_13 = 0u; k_13 < 8u; k_13++) + { + float4 param_39 = float4(rgba[k_13]); + uint _2566 = packsRGB(param_39); + v_297.memory[base_ix + k_13] = _2566; + rgba[k_13] = float4(0.0); + } } clip_depth++; cmd_ref.offset += 4u; @@ -1295,31 +1306,40 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 } case 10u: { - Alloc param_39 = cmd_alloc; - CmdRef param_40 = cmd_ref; - CmdEndClip end_clip = Cmd_EndClip_read(param_39, param_40, v_297); - uint blend_mode = end_clip.blend >> uint(8); - uint comp_mode = end_clip.blend & 255u; + Alloc param_40 = cmd_alloc; + CmdRef param_41 = cmd_ref; + CmdEndClip end_clip = Cmd_EndClip_read(param_40, param_41, v_297); clip_depth--; - for (uint k_13 = 0u; k_13 < 8u; k_13++) + if (clip_depth < 4u) { - uint d_3 = min(clip_depth, 127u); - uint param_41 = blend_stack[d_3][k_13]; - float4 bg = unpacksRGB(param_41); - float4 fg_1 = rgba[k_13] * area[k_13]; - float4 param_42 = bg; - float4 param_43 = fg_1; - uint param_44 = end_clip.blend; - rgba[k_13] = mix_blend_compose(param_42, param_43, param_44); + base_ix_1 = ((blend_offset >> uint(2)) + (((clip_depth - 4u) * 16u) * 16u)) + (8u * (gl_LocalInvocationID.x + (8u * gl_LocalInvocationID.y))); + } + for (uint k_14 = 0u; k_14 < 8u; k_14++) + { + if (clip_depth < 4u) + { + bg_rgba = blend_stack[clip_depth][k_14]; + } + else + { + bg_rgba = v_297.memory[base_ix_1 + k_14]; + } + uint param_42 = bg_rgba; + float4 bg = unpacksRGB(param_42); + float4 fg_1 = rgba[k_14] * area[k_14]; + float4 param_43 = bg; + float4 param_44 = fg_1; + uint param_45 = end_clip.blend; + rgba[k_14] = mix_blend_compose(param_43, param_44, param_45); } cmd_ref.offset += 8u; break; } case 11u: { - Alloc param_45 = cmd_alloc; - CmdRef param_46 = cmd_ref; - cmd_ref = CmdRef{ Cmd_Jump_read(param_45, param_46, v_297).new_ref }; + Alloc param_46 = cmd_alloc; + CmdRef param_47 = cmd_ref; + cmd_ref = CmdRef{ Cmd_Jump_read(param_46, param_47, v_297).new_ref }; cmd_alloc.offset = cmd_ref.offset; break; } @@ -1327,9 +1347,9 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 } for (uint i_1 = 0u; i_1 < 8u; i_1++) { - uint param_47 = i_1; - float3 param_48 = rgba[i_1].xyz; - image.write(float4(tosRGB(param_48), rgba[i_1].w), uint2(int2(xy_uint + chunk_offset(param_47)))); + uint param_48 = i_1; + float3 param_49 = rgba[i_1].xyz; + image.write(float4(tosRGB(param_49), rgba[i_1].w), uint2(int2(xy_uint + chunk_offset(param_48)))); } } diff --git a/piet-gpu/shader/gen/kernel4.spv b/piet-gpu/shader/gen/kernel4.spv index b145245533171d27c8272c481f98a9d7bfa57cfc..978e0a20cc2a1b22230672728a59f33bab1069ff 100644 GIT binary patch literal 67556 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 b|9QdHSvT5neg4Wd_V(K}Sbz2+Y%k6M+*|`C literal 66476 zcmbWA2Y_8w`Rz}bNeCUJ_uiZI-XWm`2)&76(gSIv&|3iMASfW9AiYVKj&u~1j?$DO zpmae5>E-=?_ntM`bKZM@pYQ0-UTb~d{=VH#xp&SC9n&m6ZB_NErmy-|drx1rj@hbd zP^xN%s!yx#KVYW;D@~j5!v0Hl-5{Ra%{zy0?82W&BD$oTPtCQdqd^sqsrM~xjeXy~X3!-h;6 zb-*zF`WAkp#ts=hd1&d-8;`ONa)-0Y=+WbbQ1_vi_3)~3!-r2CHmO3Hmi|}O*kK0_ z>e6qS$*Zi#{|B$K9=6VEMr>1kJFA)C6Gt6FZ*1GiJTT^AV+M`ePdf5kBPqi3)voS+=nlxeDe#3Sg zHXPcTUv-bEZF^Ts!n=LJefXc6$D~m#^n|o;>+X+{U89E&I&jp`Nh9ssY}K-8-7#p; zHS~X<+}0fAx0U&Bl!$H^Bke ze>IP({qJ3^2`7KcPn+wY<}qQ!;I2VKjL`1ux@htJkDX2Cy0^~t+O$t!*D-!;uKQH$ zx8n{NHMakRuA!~zZuM8)qwMd7aQaaDw)dBs$EdMGhaE)iSk;{G*7X80n%9?>cJNfq zt5!?ng5bW|6h1Y_e;jGu7y4a{bz@>=teb!{*3H|ockCM4bFAtf-Cs42 zsblS|)Ew)Wu1T$N${puHqY*f~+NwFuA#9RxuZt7tq;sRax10`8wdP>}_0;_TaUQ0Q zshEeYiII8O2Hc*9-qm*P*jtV18qvB`*atO_at?NY(}$LyHvQB*rp`fIa}K7qoweEp zp0@w7_vuN|_nl~;zV8f9-*;=r-DLFmkzK5Mt50ekQ}g$(_JEVW<)_WQt9f+UnA&T= z-qi8?kNr&6qMv&iuNAAK`T=$J+MssaEyfPrZ1kw{_O#sxb&s;Iwxh~XeJ2iLFU+=r=uW>W4BigaIo;;@AS?5d5V`^VJt5I%p?(XAga64{iHLe}EHJSEL?osw{e>k~!?xORaYjTfC z2)2>;q6{D1HDV%lZ=N6~Q`2S;KL68AjJ)k`+DF@F9zD_9eVnB_q>knN;y(_)J7Rm> zUOy9)OJsML$DFk~t&Uk==>LnT?KwTAhT)Yb0KEL}^H-aY)nJ{eF*kukFzS?@0);V!K z`jElx`MyES1;WoVw~2j>8#Htr9bRVmD(mt8w%;v9n_G)EcXhWJJbA*{?k24~cNA^z zEZW=)9@#ZvC?C>BjGWZ7Z+91M?kUbAX4^@Nx^V*A;)?dE=Zyzu!Wm=A-462}SC=jm>rj_Mh( z_lDlpbk(10fBH3O)Y!4ZCe%|lb*?+B=WIKs{aM)0iO;vWw?JZaRxh-8mzUsHt{17j z#`k82y&|SR8F%{g5_)@F9o5U-{(Y;zfyazGXi)3k-Mti3Ki9oxyLzv@E^h6W&gu=@ zjT`E1p1jjn@5_lZWZanX<0cO4j?^C4)Oc^-T&Uzr|?PRChpjO)2ZwHZ!|vJ z;NPeE0z7=exG_^b%+pzYjy_Q*4*kBNo;-FupWa%Ytq$q;b?w(aPx)S?S5z9RV*L)+F-^~N@;Y!03&MvWN(@2F;jceUbnR`Y|$cTMQ>IZ59Id+?5G zN%#S^ZE5hf!^Vu8KwLi`$~{`&an#?LMAxJ~Y{CRDmw5MX`A^ff6In_>mIzL+7`|hBz8x&8#sCQ0+)Gz*rQ!% zwNHZ&Zu@uV9oDdq=)pUxec{PF37otKfy=yy_Gs5x9o~a?R7b%R=QwcUoCGf8oZ6#Z zXZ7O-Kcns6-TyNi_Ol!OoVNd}nde_L>=!ing>C=U;(uwwet8exQC$Vkxb6UFTz7-Z zaoyLWU1#gN!g7B+)b{Tl*TW6}-#7T9ZU63ZJ<+f~)!@&x{kzBYY{UM1gTL7JUp@2i za>M>=gTL1HUnBm1Z`j{z@ORq&YsUW{4f}@;{!!b1t@!`DVgIbbzi9if9sjQz_HP^9 zFCJL0b>iO%FW09}gZFLwui^>s`9EXBK64MwH4L78vL-nDWLwxQsKgN4w5yau427 z9RyFDBfyDsG`NiOqaN)#tK)m{j_M?MJ5HbKbTFSk2X&1dI%w)=)6VM59&I|Svm5-< z2EV+)uWRrd8vOPKzq7#~Xz+&`{ILdqqQReQ@E02VuMPfsgTLG0?>G1-4gP5l-cfxC z&-#1|F4w15N6+)4qrrQ_@$cTJeH-@a8+^vLfA{rlmWF+{2A{p{zgo`Mxf=F)8hpOC zfA{rl!G?X|24A%8-+et>qG4aE2j{r}-rkR$)d4+hoz+1-ct>?2+=plH<&T1g*Z5iR zfckp!T%*m4a6a0#+Pn_-VcYA@oIIkH*Qxm%e1itxxWPAT@O}-xTZ8Y};CnatJ`KKa zgO6$O@eMw)!H;e5;~V^>20yjIFKFc&@M(JY+&g_6e1-;}rNO_~;Bz(jybZo^gD=|P zOE&n@4Zco;uixMsHu%O3zFC8B-r)TkeCq}u(BRuO_zn%eV}tL~;JY{Yo(;ZtgYVPe zgL`nk`-KnhYF{Hpi`jTyBQ5|>7HGEU7d{atv;=Mus-#7^Ml%-ceCl@qoz)-U zll)mX4+pNf??;RnJ!rRa6ZY#rVcg{LTW#LX{WN;{zJlDN{4Vnuw9Uqi9X_h{GlxEv z++*yZVWWqQ88&tj`^wMg>b+X}_^wGKCl13Mb=sCb4Y>8=b-uwGWXD=<+BR;L)yQFf zuQ%10cw7$K+(y*l{r=)^zBT zCUlLRSQ`>+`a0I2!Gp&g)NSkA8s`kyhVoD~X583uqlPBp)cKhad+Ynb?(wweV5aDU zM{&}&Um)qj`zOxn%&|?J#CJroPMzCXV(-zPcHCL9*`J<$ZQEw6ZKK8xFUH=xmGgVp zSSUx&JhipiTbi?I?zT2ZOLIh1`!gq6d)~5(w6(`F7dC$$-rftPz1^p|v75oq3bAJ1 z=c#S%tpCk6FE+>de`+^hZ5!G(sVfaVul~r~w)gd>lZWHunAALmu-~n{Ej|o{O)cmFN9i4gPk6zgx#>f9Kv=eE>h`;6al|jh#e>zODC|I9CUZ8`3p;tFZ@A zO&T?BtY>VyKi{_e+qf4SyM0aRtfm7`y$1BIW`?)++R$O++wZk>RtmXrk<5-}!8^^ns6<&^2^a`}W<6H#1r}ck{H{bdO^dI89oIAfUvo;sG!>M(fO@8jC`y5GI4U&?)7!5>z%=BBf{u+iq? z9-QYhc>8A??1LV*&g#k@yrcRRJY)Sen7(z-+2h?d?jzv#+V-wq2Dg5G#=EE7)LV1< zHrmv2@be`&=iQ+8-L<{%KI`GrS$)xi_pZK%x8vryohKz8Senn>ebCx{?x&;DPuhpn?(yup`j@KqXowH~~q+5kSPUYjk%KJV6i%O1X+)piB% z&z||zMdc9t^EVIi7j4+WpBLDlw|VH(dSI=wKM(Wh&-H65Ft=Gy#rtdRpEGG&+yDTjUAs=$7BiN0-tw=1xpXX3MC zfp;nJt_9wszEwG=Hl6QE4M-WjmyVt}%UyJ>0=^?(Yz_%CpjspAH zGyV@2_~CBc+4}rB15Q4Rd+y|Orss)=+B3C(Q{xoragOO%o?~h2xNPfZtZ1H>YJLui z=4VH>ISS3xYR*CYc(iG03ly5?w0?^e8kgLbwnU+EiE3%f6q@6=?FxlvU)B5>Rr2~- zP;K=>^E05@+J)xlKDG4=&2g%2TxfpIQ`@}I{CuajWudtj)CLrqbEGz~(ENO-wsWER zxlV2OLi4kn+7AlN`BmGe(ERMCHnh;(Cu$>GT4(p?GW)nC*UfxR%X)>|#>2g<*3rV9 zt~m%E z`b-&oc!7^7@R0>RuE56^_@n}#T;LxU_>2Poq`*Hd@R*uz4?Bgt8EMm!#HD%^XWns~OLB z##){_vAjPTOU*f1k$MqIFN*P2qSja4cq>z@8PB%H^WK?w{(#tcYTDMUZMIztEVr$G z+P$Bq?FL}msx5@-@BV0WEGfp>2(HaIwlU7;)QPhN*f?r)GlqWDw(qQY|C+lG7GhPl zq_(Yo+G4kj`L?3g$9%>%-*(i=w>{W=YUcC)?R>T4ceZ}dMPGH}?MS@?#dx+g-fq;1 z=Y8FHYTEXoPG9x}%WbQlc7G2fZTA7&R!v(MwKnq(rk2}wABy%7)M+~sY+E&LqiUON z_XW#stDp99)M+~&Y+E(=&HlA5xhKHYY_G2|52Vgsigp-U_G`2$Xc=>~+lzll5p1FzNFVQk)HOG7@b;f)d*fFcQUoWTbUl-R)-Em$)t<8M4 zagSU>t&i6uuNT)+8%y0b*VS0vqR+3X^|75kH`iF*vM4^ktu@=oAEP#AoA<7sDtNoi zwAHg{?$yLe?e*=ig}*V(zbNO-o7DX%YL>LoZeKs37VBf24{NL*oBjK$*4uGAtMA}_ zY9HsRqgR{TKm9x5YRS{L#%kuBuI8@q@^E8KkJguZ0r(7H`=sU^&Pc6h9NXGvMeN@L zdo0Te*>;}VX1v8~+k)8g-Ni!0^1BD^7Ipix47GjNwqDKs9zrd-maDn`E7aH+>3=^o z{$FVy0C4P{BWXXdu#c+kE7ktvYVMe9e`L))cM|_RwDiZk7sInJudMw&uafVk+Mf1* zfp-@1-hlTm_T?sXvjJs0geHmd&1Fj4mJ^4jjXxs{X0p}%}! ziyyU7`2KDC#^Fb{`9>=+OP;Go!PQbc52nD~hq}h^7>K!2q92Q9&XnXi1&!#Ng#Wn3 zH{K-ePKT?d#P7^@yN%;_7F;bQe&@CQHjLlT;c6-Idra-zb2kis9KONyb9c|r6Y%T$ zzqUc*JPEgre%e-G#``gnOIhTMJ#}oiV9WSZC*Mcd4qx!}rR469-fT|iR_;EXn}56x zxxSl&U0>%v?fauGu+p~crGHz()l%ZO4cd;kZ`VD)1K?^Y@f(P?!Su&>um28kwUqen zgm%Er&vwu6&TzGq`0a*vUH`7``P&_?mJ+|gXm4J(WVhcCxLQj5Mx&i~?!4XWKL)Or zGB0QE4RH5*FG_iEsxXV~xx5h{4}HBB%Ka|P!@0f>>|A?2cF#Ww*UZ$n?2kc=uWoz! zx(XR~s+b`o2qC7VZB(rHt`^!#*qcorvF`*|$GYI~Qv9UGDcHYR-sPL@jB;yZeu3W_3%Dt`%U1^t$NmVbMP|z zjomKocYymn!U|kH`%~`=&owAMm!r*yEio42#JPK|5W&`rU*_+Aj~E zqu}SlzhCg@;YY$9!;4_YDjQFDwhQPaIjJ^B6o>EXHRzVUOR@w{hw zUtN>2W{>LUUi%!y`-d@%_XpZp%YBCPy@Zm#R&e#V8r*jh;y)hyy9M{TxeD@&S+IJ7a8G7rzgK%r#I|#S`zIzaEe|+~K+~*75JqXv|cMrn#_uYeV zYu`Nxcb{!q@XN6K4npkSFManQ+}igKO78my;f}}m55nz_?;nI4-}eu~oj>0{2)Ev+ z;M#rvptSq`LAcMczJCyI?K=qJj?eER!+qZJJ%n)k=X(g@&X?~Ygj@R_Lb&tcy9nXd zzK>9H-$w{{K71b`+&)?<0gee&0z5xAvWcaP7X6P;%c%D7o(?l-&0c zO76P};m)V;CzO1V2KW7h((XG7CHFmrlKZYgxb=_*_nn2dJ~_ZGrkAKzOD zxAwh-aG#eiDY)%@cOiD$`|d)xpKbhJIo#U!7fSB?3*q|veRH_a+rGmPZa&{*2sfYa zF@!t6zQ+)5{YJrEPv2)K?Y_$pZhPNl2>0`X?=pnjKfjj_zZULy%;DPo4msTCb>CeG zxBtGs5N`i{e<9r3_ZPzLukSE~TW?Zu`|CRlvCDmrq2z-L?s$BkA$I%gchBLD$M2uR zwfp^YxSt7qry<<&Tv%|&b8*4FKKng!{Jp+kUU1|2PDAY0zS9tHe!ou+xAwh;lKXB$ zxc5BYZwR-&-vx*JdB%4e!tKBBHH6#$FAA>yb%Xn1EdJKM&rovTX$UvJ-#>?2`))(H zcE5)%x$ifW-1i&8t(Ppg{rCNb*zLdXH-uaJenZK9ry<<+_IqggCfwzHW_*(3bEMA$ z8*q;YR!`OXCNMvfKL_`D&F=;LydJ;j(X<^)EUM}S{;{ok;=c$szTX?9-Jjv=N7e2A z0=BLChCGG%%%K+lSHNn?^H;E%&xrQX=fgKB>7&n*w)J`OZ?$cQI@jN8jqbMk=v=&s z=5vhWGrwFvvClK+6ZkI%>8<~)Cbrk;8GH`wQ7_00XJU}I@Ztk1yaEBD0b zaP|0n0XARh^Cet8`Mv_1Pd)j*1{+J;K<1}|Ir#=`KeRc1p9$5REA8Kb)yBj7GgnTk zn!Y|S%Edk_I!9md3_A_jXIbk{Y1c{Jo8qCpPi?o(noJ8e#trm~+d$P9tmZTGm&A~F zP>f}4aoSD~wypEyc|HT!XH|9kCigSDx$Q^mIh#7|X9U|m^E4A!&F{A|HnnnW_CuS` zz>eG8p0BgQm!-CC;?IVresw*z?}629XN+0EYQ~?P+WuKPcXLwDMe)!+cWt*ezH>DX z*ci@}cn*r~j3d_1b7p?9=YlzX7ME-D99R(S-q+@HxqKbY@BOhY1fEQ78*MqC7Y1wd zu$|BQY8m$;V6}{UQLvih{tW-c!5;Qo+hW=%_FL?DGY<8{T@q|uW2{2$@fAODQ+&pRJam?xbFpnypYRNA31qo|^wxEAWqVxgs^Up=u>+=WJzaf7bSWYWro} z%;)Oh%%`7K)|sCT!N$nBv=LY>=aPI~im{9>PTS4Ewsk-IjI#xJQ;NEMll%GI-1fuv)@k1l zZ2O!`{lRKEm$a$bK4Y^V=A){%;veUtyk2h&SND2-DL&hP)$Grf)N9!_|$yBeh(-3-t~Z$Le0$4eWWR&CiPR+@E&WhL7!Sr(M52 zsI?ixvFrslzqUQ8X=R^2g;q*hBG$Aj&owsF+*b!gkc#bAGMAL^D~_iF;0 zdipsLY|Qj?5?D>YXJC|n=)6Y4mJ zfsLhYMs}aE4+ndV^JnPV{Vv+?obBgixOQ`TojU^Tyo4WFbLZak{3!UQ6m@-!KLxCw zejg1^zqKC&H_vIr=np>@tdDxy{0QuPWc`i<>!&^=Ju}YnV8^j3Mf;4^v@QLFTKAf1 zU-V0VPXyav$K`nC`nz}C$L>GtjQ1q4JWUyMUOWM?IpL4@~Y`)9Le~P}8o9L)9 zFGV{Qu5SJ)+pfuv;p)G_$Lq=IU^UNC?}_pOlWBE@h#xk!sZO;SSHtXA&SAf0mm+O2bntEbh1y;M9 zl6F^v)6Ra%^)t^Z)b?{}YWwMP$#vj7dt3{aYx7y|25_D|t_RD#r>unSM(`ojw$Wy; zYpB)5H&JJA{TgguYxmYI)VESR?AL9z-8%DkJJ=Z6TX%rfvbW?nQ;cP7aoXMqwyksG z_a}FO?OXPiKdbl+Tzwqv|OtJxo~0dnI#L~Vbpo!{S4KTPq^{@dDaoqT@)H?Jd) zqNyAI_tbLnW7IoP9IMxtC&07Rw#TXEd0u%^8$PzTopxh9MXk*kmtubgY<_J|Q_J(b z@<*`GE4I<5&m+|8;y+PmZ#@fk?ADI`dFmG^9*+IR+HRe-`ZL%V*;{`Bt7UJ=pQ9Md z*karEC+5pwpFa}oRk*S2*DKWWJSY4W>~n&8KKH%`R-eM&>`%Pc!NycK#!J*{u9MGY ze*-)A?2G=i`8!-aeR>mYyWAV!0_&r0%r~gj;{OgVj2Vi67y9Cdv58>+Z`6t+RrO!uj^?~(#{0nS5^=Kc1^Yig&pJ=b2Q@n=v zC*Qx(at$|*?ew$1|De{MzI+N+b00Y`_V+WmdVD^weailRfu?>N{qMF%+RS@yjXU0dSy z2CG?oKI~81K44>NbKbrowp#kx7i>Svd7BPRJwDTeUFXtg1~m2f%m_Ai=`$0WdhW?H zgI!PWH|8*gK8Z04xY?Ik(bVHJ8@Sn*@1d#3XLhiCDd%bqH1+glPH_5S4rAz(xtt4Z zfAw?T{27v3a?Ar(E5|!8Ts=PX)jnlE=0{V{v+M$3`{A>!?X}0YU}4kG^CQnZ3&XYh z^KSd+&$QH%dr@$+e~Y21$7k`{r|jPnXzJ<1l3@F{48``^&9?}(ww!BAgVoY*8F0p> zEuTO9*_yVrTMn$2cFTj4Pn*{X^Z7G4ZE3e6*fFQwO5n89mUjNEPFvc2A8fwxRlxd$ zuUhjTasGG>Sq-j_dVE#~+n?|?YMwT0!u3(ldaVUEmbUn<4ffer+mt%rI$-;#E%Da{ zJJ!Tn53HYheAWj$|KS^e%QhRr^-<4f$Bn?o(&ildb4)d3_&H=_u=m2m+yt&q_Rpr^ z<~4USH1+swUi*}LYzs8?jHe&icIug%{$TTIORO!y=h7ehl|F3+R?qxx4OVNlXHLC- zZUav{$0^s(=ZRd)tuyWc*c^ARzuUrd{VmV;?a;O5^Xm3s_n>p9E&Uz{eu;SH9PEIm z9-ke-=2(sZ8QV^1>Y1mV!M0P+cy|G-dw%8GwkzCz`1xOZKKo>DcSEzU`X&GFVCTrO zC;uK`_2k+UtY-VP+Y6j_&aGTO=ho*o?~~S<+aF+aZu4BdH(V{x)!Ni-pJzdz+sxoXzJ$Q5}VxiJ~Nx&+V)h{KG^ih^OtMYg{Gd*+k?SsuC@1lxzFN0 zha1n@TtjLfa}5P+v-Y`lIQ0mMhxU=R-8yqI3T%uU=o?kFFaN0Jxm7-lVk~2e({?|w zZNo>`JnJ$B?z*V!I#wW*b3vmcqKAAvJZiFq8FdSV_AR`VUTv^xQw zcJ@=QpLsIB%Q6mQ`n|*{*z&!^$zZuQzn3@-Y%JrP3YPoX(RZMK3_h0HHrn(#iCSHJ zI(63W46yTK?b`j6`b>(4{W`0*TW73igN>23`x#g*YbXB+#aPA`r|mgl+h*;~1>3h= zTb3a2d2sdk{9Mkw*w+5b^|62U)g0Ez@e8myvKHrq)v~_Y)NG&e+t;kq1>mexV*V0M zJuxo?t2yShy9l0k_EWB3xxUL4>w6ittnZ~@x%ph*E5KRb%fWKj*LVJ}1fNK48*S#g zgjzj)`4w0#^XfJG8o0XtS5wRVoZb)HwP63wgSz&ssMW;RQD?tg4|cw--7hy%-$e0n zoWHK^)|tDT!N$mbxdp72{UX1CVk~2eZEL@71KXFxx*cq+?2S9X?hSQ)+&_1M)%`Br z7}ez*UvR@J)B4DjOk&pW6b`21gw^G zLYtcHv&OE6`AAd!9-O_Mn14W1Ps~TbYUMfc7(DIlr(D1CoLHU&#`K!^6t+mVqcIuhW&%ox>mRO&I%~!7b7jX6Xd+8=3I>Fk^ z`z^8L=DmT%pBC)z1jzO63)aW+daala?wpkOp6Sul53AeE09G4Fn}M{M5o{cF|7#%q z&}IUgOPl@h9ac5-YWHs=sBK^MZT-%be;+|De>0&qCj4yc`>xvEXa0Vce?Q?1YW1ws z_rS(;U-({*=hW=*{H+D!=%bc4bAWB*+NRB%aNC&QHu|Wg&0JvH_&a-PGdJ8ezHeh2 zebh46dBL`kd;ZM__8dyg`QhFN)%CIO3xL&gukmj{7)RY4zVoY=mbPxjq0$@TNPw3%xaYIU*iY3I7XHrV;G_PW0=^?DQ!`?Y>;x6W8M02?FM{SCEIa^07&Lot@I z#kTEF%#Fe2&y6;P8_RzAez-jMfz80)2h?*P*c`0xelXq^U}LHq!*|ZrvN!sH9eeHt z?$`cs_3c?rV{8dlvv_#^+1~HKwn8&zd7s!CuI|3I{Wf4@s3-3La5L|=XzIzk9azoc zb%N8OJMZ>r<}L3R1L5k)y93x5>Y0xn!S+X+eeq{!JAv&>?oal4XSllOqkI>zZPhc6 zYFW44!1gCGcLy6Y&mP9u1FoL;ZuSJ*PTiQhQmYxmx%~my82;X`dAwfj4OdUzAA-#r zKB(r&u@77y_1s6hz{b&LUVpDZEjfmO?MwL3ny39RxIXIf84fm%^K3syfb~<)eRL$) zbzHc%r|l?o^X1yNFIZpo%*B3S=fdB4PP@@?^|TuUwynD38ceMg|8ZcoJPV8m+aJHr z)Yg0!*dMLs(`wUxcW6T0#&+8CEHDwQ&Ael&<>vKSU^2K*&3zU)0IZK=n-+c`*s+z* z0tdm>^DJ;MSS`;2hk%Wvo@aqW!RFFtKPFMD*$>a_!@+8K7B~W|X7O-Lp4+xP3{88U z1&##!ETEn>ISOpN@>yUCTwf34=%bc4M}uusJ_{TJw~hI2qmNqJ91FHh`7H1wxNXv3 zebh46WTRau-dtlv^yW1cJ@=QU->MsA_EY?p%1 zp|*`SbN!N9-S!=<%N1aMCqdigV7WHiUj^1*+m+OEWBa?^SA%Dvwv9G@E~8c#|B5=# z8P|ZFJ8PdauA{!5;^CNYsO{F~c2D03Hb$N^ZUU?2IYWLe#aPA`r|r#P+h$+f0=94J z`nZ2?1*@mcZQ!)={&YLsb4Xnu&!IcO>e;7vf{ml@n14;JmY8>ejT!!%nx|iP!`-jy z`q-~~!0P(gk9)z!y|_4s?t`o69J(LuIi#MxJpeYAw#0rAY^*8uIrI=%KlSwKw_y8Z z-yM@&KiA1MbFQs3rr&`bWA^*QV6~h>+SF{Hec+mzk2KXI;G7GI`Fk|=#QXzTt^8TV zqwut|pK|@mb7& zV~f-FIq=N%!=DqmuU~+(l&!z%rR{l&eSDT$TiU$>RttX>Y#+k^TJx;iYjD?1T_5+- z>tOYK#(V>;<`M00wPv59{k_(_|3rJU)_hJK$XJa37Md}QVHz7KYc>iWws?cH8C*U-7QPWyj=ZJ&Mg0az`2 zQ=6LWo_*mOru~Ot*Dme<30F&dZED%eAAz$c6XRcK>WT3&SgriI&?oS;b6j%$%DucY zxs2)k;B#!bAAAOuYx92aCD>TT`2sBWn%#x%EAaW$w$Y}~r_|~h!#7~H@_FrBxcUS2 zdVU91^KY&g<7=>5V)UYu%^1_5sXtuD=m4wDUB_@>YMHlAu=9I#?cW=&R?fYe`Tbqi zoZr)e-3Qj5-_ub~Pw{X*XQ=Jg$u%R`7&*UZ0;}cxmiMI?%h=+yodsN;-?PGVerwD5 z?eEuWOS|uZ)xu{7+lQPVbAmlT^wSoxQo)%95d&A&aVo_mjff6_SW_QT&5R!hu9 zz{X5Y|3;;K)z{x6mdEDbthBv0f2UZUeYO<1xzCnHQ`dh*c{}*`M0fY@a>p{z>0g0Oy=f%oWkp6LTf7 zn)@*AR)(jY{gmrhUMs%OIE;y0t;#>SR`@&Da&2BKRtM)=;qPC|y;h9Ewg&iOYTIb@ zKESD3tqIoV;XB#JSqrXie~c$jf7b@5zZvH`XzKA<7i=HB<`_e+PdO%kJ}#e&+O@Ej z&tCI6scq};jptghAy{8)uLT=ZZ$j~~?WVQeI(^$rOv$xibFf;j1@et3#xl0pwtg1w z2i~IQ9gL+v*k|j+-bx$Aer`!E&-YzhgZ;is-SxNqHeh3D^Ru$wlMeu^C+4$BVfGrE z)4$hbf99gLy?+Za?b)KOzcWw8-|U*&-oGQ2vCRv%y?^gJeKd#1i9Ma@2o9kbU3 zxq9+04>qrR+21)|k>c;1FGtZ9zm>q+?4RS3$F?$9%^c#)t82Ch#lyb|oOM~S#?IYB z1@^ncR)49pCsrk%{^j%7YG~@ozdG1B+23ox^-=d4Z9mootJ_C$`sn*=%Thd+qNI;Y z*LZR2WhnM*IqIyn|DE`9?Kdd6dvD`{>$hoxZ(eZyw=B5+TNm8FXSHq3GcW7H?N>Q3 z>!GRVIdy%onrrF0*=M!P+lFAZ%-cp_HTQ`=&f6wn=fd`mNiKFg`nyLxe>MaAH~96@ zrjK)?o_t$?%Y6OeYWbeud|Sbj&pDAB%lXhh`L+R@PakdiIH&5#x1E@hIolrWJUVCk z%UeE-)iLY!AF7jt$F5acewp3_t+k2 z>e*v^g4MFe?6X?d;0Iu}?6JMUYULgq1a~f66UQVMJ0AVB=3QXdTpw-vI4A1KHw0Yf z8wyt|_tuuCC*Mf0`Sj7Ik8`S?eEWgzL*{HW*m=wzlj{@zF<@ilyZ^CZ zHQSG)9#64-_Ly8B+q;kUukG$JarT(+#jQ*6SgTdq_rSGlyax3;6!+MA)Y(&$h*9pb zg9`4RIke#V9bWJw!AI3RrjKJ(PrfN&wT$6tu;a=a%JtFTc|NALy9VN{f$w2$O7Yl; zlJk7y8gD?o3B@(oj5=#@95Ko@IH};S!Knq;@5c>(M#1$zv*7xl-QedGT>oDbT>lFi z{KA6ke`&$>zr5gAg0HH1=JR;?CisY>YS|OciCWg^WUyNH#3^94a!;HF z->`F;W}^ZgXA*01*QUUe2Y`J8jPv7B%HlkaC> z^Xa2aAJ}Kh@yR6kPvj3$Fk34gO-m^?$kG`oG%XuN7SXzZYEp zw;KGNg6sc}g6scbgMUz*9F)A+XiPjyVplvh zuK&yh_wQBCR`Z-+caq-g zz&$7zyZ`jhHR3_A*9d*I>Ej+&Prl!R%Y46stM#jWye2&YPCoar+*s~k{gdwxVDsst zO&`wz_2hdDT;_Wmu2x=ipM)o$=YZT;?tlH0?`g34^wFk|=a72x{SjQ|`x9L4;@ZdY zJqJ!c&mp<7Jb(00z8Ape(?^>=o`dSi_h)dK?`Jcs4R^8D35`Q8SbPakdicnwfbzIVZ8zW3p3 z@6|r$`v9DLUIXOD^8D97`ThwupFZ03@fxC@eE$NM`96WGeO&vP?^AH{c@2>p%j<{! z$@e+feEMk9$7_&!@_h*|^L+(Zo4)oj-#6go`x-1a*0n+{y&n*pxoe>)@jW&$Ul z*Fd?ky#DE*e6xVfr;j#$yoRbL-}k_GGu~VyXNP;;^ctzZT%Y*Q0rr}aXMj23YO&7+ z_8gCWZn#?P^ME}kW1knU7W;hQ7YqCRaJ78ry8zgn#`|kJL3xe(YK-$}Px&Dd0 z5ZLo2xfh13#l8sG{T=(FaJ7NN?@#>2z_w90=i<~$P|Uepol~w~VlD}G4=3hQaJAT% z2D|5CUk0w0oXdi3qn@10fz5eSol~w~Vy*yoUnS;>U^UzOoVXI$_P%H7JjwM*`|pF@ zCuzS5SS{^W1>4?t6KyZo$M!zUtp?WabDlWQc{^a+h2r6VD=W`=JJoo5>YXV*=j}?J z=ejkC;r%^)-GciZutCA~+o-`eDY*Wd7hL~-1)q*N-LmG6SNmFU`{g;2Ia(V{J6reP92k6?0EFgdA%{%^I9Km`Zy=*$+s!E%(od_ zt$c3S0-k)%iQHJuhyKaeA8bB-wCUrVswdx8VEd3c+ZyaV<~kzRC;r=jjqwn3?Dve@ zg4G64+;_e=x*b^kL44%fgVpp&oPl8Dq|FXswY1q0tY#a}se#1V32ZEF_SgS*&@L4F zn`?($Kl8Y6cdhO2X>s=S9@zG#ce*jj?9<>i@nadx7)v`wifz`@A+68xP?g9HK7u!Gm zvuB2Y-81@V)5kHYC*N?eTCOuAz-o@k>(ofFtlQ8eN=6CO~hG~E^Nan9)l@a zlOZ+Uhk7W*H5pEwH5pBea!tk;+%=h4aQ!A1{6O$QHP4!ift#mXld)*(S(9;KwXBJK zP|FXOaQBuYcdJ$*qmegC>Ps5{j(+qfL#-PwCUp*)sydFuv*4&2-tCD4dnXh z?>rw`+g$^3*1-1##!x)=rDP5EtMN$c(G=HUEOpl42x63LaCE_4gC7-KzvByjBKV}5 zr~gO7%~P(yQE2K}gDGIOtbu({%bXkoR?8Y33sx)F;5fKrb58A}Tx|dJ&l;Qnb`A8= zrjKJ(Prj4EY8k^RV8@j;kn5wr^L%P;cMZf@gZ;5hrg-?@Y0Mf-tnqm2Nfg)M0P3v4 z>BPtyIOk^;T>b2tr+;U_jZ@C?Ptepe$3F$DImh zXw%0&s%Os50juR*vh%=d=ThSHbFe{+Gbj zGoP1%?ThncPPy28`Z}ME;R>)nd(%go<5bHy{kffgKik9qZfC}Mc#R$B5fsOH6m`aV z9WgS_#nEr5dB%A)+;-(Se}$%=ab5#f%QzRq|5~_u#(6#1zBo2>%Eji>*Ks*m0gf zahxYnXPgfZBjfaEWe?Rn(dIbSGETo^K8@mWG9}|YrN)l)REp#LF?GiI7%?)=4bY#cdB*t&+;-(S ze~+e~asC0UmT|6+|D$mAjPr4@eQ|8&l#9)$uj6zKPl7k4)<>J;RLeO1jP+BB$LW-e z^Nboh&Yw^m=b6+Q=X1o!IJZE5q2?LqGjQ9Lz8RuV#k#YK&^7Wc$ zoG-y`SB~>#H1&-06|h>yxgGwm!qqd**TDA0v6)jYHlMzZ(=ogO_H(a3+8n1^#_4m^ z`4o@yC>iI^YwS3GL2;ZHP-mR)5+mc>2mSq;XPj@sZC8%-Ej0Cv^KGzN#yJT8ci`$7 z=X+rL;@He77n@IC$LSdU0Uk!Jk2c4tmT~&5axul@mz0e2!Wuiyiztrs66%ce6JlhX zBhf#tdB*uqxb4bueuSo;asCUemT`{2|6{m%#`$mXh3JmWoN}@G^mUw$;WMz$w)$vu zoN5{8<=C#Kcw9lrIIpbnWz<(u9Otj79jD{_k{B7M^|u9|4c@Dxr@f=Wdly{)z6Cel z^bI~^!S$b|;QG(j;IkK8|G5gT|2z#oU%~ZXu;BVH+~A8AT>m8suK!X6_rI^VY|XO| zzGA+d*K!|xji#PwzHh*4dDeH%)!YMq5AhvXE&GP$Z)xST{xoQ=rF+9Qk&9gq{oNID1Ts*g5(TvPSr>jN(HO$%2mzo(fFo_wyU+*qyk1Sj7NVDsstO&|A!dh*Q#F7wR{ zS39rQ)bn6gc=EX?J8=%0Mw1Dj7DZTh&U)RS)xaG7sTxZ1@-;KJIDtQu;-HJjXCA|CFb|Ru4`hh0#=KCRj}(2`)XjdUVqmE+y16{%yNBf z@AZ5A+U~VooNN0v*lwhFTu1TRel7L&1-=37wf!b)=Y0Ka5+!M_9XnmH{UmtU- zo74V%hlkiX5SMd(7i~StxxNFQdA}2E+uu;9uX__mpUlY*;cA(aeZU^hiMBzM!4%_& z%Q;a`+#z7|CGJqTTGntl*u%KmhEYaRj4LkJP(5)+f$eYRc3-%CRgcepU~^}#N5l0~ z&s>iImvgO8VvYqHQy=>ww_o--^Y6Tr^Y6KEFU6xgPw$31|DLn=P>gdQwa;K`2N1_+ zjqrnN?pTaD0d6~guT4G?uC_mAAa{MWN#dg9+?dkq+0L^ha&yLyn`nq47BkjraOR#+jzYy-+W-cy* ztGQ1y7Z-!o&6{?YfQ=n~DcHDaa~WJ8^~~4hU}I^^d|d&yPuddeN^sf7tKelHuZF9Y zef$;N{%K2`Yrw`y{%hg-smJHK+9&T|JyiYw$@%Swz=g05Bo*$1;`z+)A`*zx?=QE0J z??6+J&z-eTKax8ReeOb2kI!#vpL`b3=WaChT&M2=+y7*QO%0B)UO+Eei9oRlDNwK~5*d8uy=GWJ?cC3$p9fLluhrC>m zKj7n0uE+1;uE(R)xn4a=JFi!sm*OWW**i~xZ4>@9T%R-RK0E`~N8LWi(+970Pf$D_ zqhwD!4z>?ZQridj#Iv+3?_Fa+{(8;Rujk>$bquzZ`}?2H(+gndLS4JL)Url@ z2HUpWkAFc^kIzfBPr24Fqp8Q|mD;CV>sQg#vz~tiXRU3oJ+{{hoB8#%zm8p7^1K0V z_V;gS>hbw|?Nj#mO*HlRyjA;@{e2rvJ$-ryob$)_+GBgSu$f<9`|H|h%X#}A*fHGB zdiXs4K3Hul%4hh0K<(kPoVI^Z)Z8QD#Q6~H+GWlE33eW0|ERX-x#nMRwUk^VKSr~y z_O$&3Z0y``{teboJwBg;liz*y8QgK@eEb}&k9zv>1z0`BXG+hDFVW1QJ-%Oo9b?Lr z+V^WTZMJcK9kZIh>zjG9PCvf^y9RgG^ZhMYZ6L+@W|~`v^R4YWikkB+PMlt78Lxew z242p0M{Q64JK<_6neX0cw$+~4eZa=f+)WF&f9hF-zF^yGOS|d7jxBt8co}B~xIXIX z*NkBGl&rx_Xy(u!-6UF5<@sH>pPf>DB ze7eS7>z<*w7Js77HF{2Bl-I}kYo2_w!;O)7nFDT|*ypP4_T5Tddveh zhPKSjykPZ|%*}jg=GSg~`=*xPzh40CeL&s$kY_%az3R^tk7p^)hjZ{;fuAq%3k7}= z>^%L2I^$lL*!qMo0ykF9g+<}|sCzCfPVM2jplvbAN)+RY6K4sq{Rm$YZrse*QgD6L zLEV%6Na_}Fc@2)Axb)LsoBh#N{w)Fb_$w5Tav#40&l;-+f3W9?Hut)G9cI|;;+9~qjrPer zw$&$Xw-Qs**R8=BoAKl=ALe8U;%oyqPW%UeGdBI@`Xv6gU~|TQJFxzaO@FyQUNfA3 z=h``s|3Gm1lbAc8smEu>+NYeaozT>?);oi3r|w$sO6}oVYukk~iei3oV($)a=HCNN z-Tr$mk;i{8aK@MZ{s2u~f3G$2`2P^Bf4P?jp{eWdwMd>=UEr+sK45v)dNA0vwom4< ztv+cx1gtH&hk`RUbIJ9I|1hv|;y)amvFR_@C;lVA=8XSHaK@&;Tp!ok`FF0J^Z4%v zPW;3ijizpUueYv;T? z&phAcUUyxK!>AMQaB%V`=MiY?@j0^gDbKs3(A0C@O#$0Z-Sh4kY7fslZAVkirkG!x z*gpbiJjs6?n!4jVmRcVF6Tr>>o`|Nd|MArF_@4~czwG-dXzKc(L@iJ5)4q>Ce`U@v8_I7do@^Fa{mgPv6)M*PyDX|8z=tPf-^S#<@&_`IT4*z}j{6aV|c=8XRX;EYXw zxjyAwJLlzj=J_UHgW9#QHol*I9t0cD&$Hrup4Ij@ipO6mYmw_(>emYVdX4=Y^ajP) zf2Yo8{ofHUpOI|)a)ZCx;BPee-wWIzNrQjh;9oWPcMU#G@2UMWe%}V4p}}Wq z@b5MFTn#>N!5#m?4ZdiDFWKNrH~2aYzJ9^&|AqxO-^LBTS;1S+_yyO$e}ivbaQz1q zT>tGFe20STzhlAm-=)EKFS!1D7F_?m8+@OF>p!^Wo(Jx=WB6?EzV3tVVYqwJd%z1| zkFTmlTl({GzYBhZ+RrDyr>1H32WtLbJ<30Xt{$T{*5lOf<0q*7%=jerbkt8#`(D%2 z)H6^&Lp>w)AE{@e{uA}g)X!4SLj4@I=ZN`p{tY9M=TXKW_guBl`r60%z6kdG3;#3R zw)r{QU*P(vC!Sgv&#|WcD`4a4>$xe9?XTeU%kxy8pNYQ)_GjX@(Ux55WiID4@%{!* zJkN7^Y;S_o56^jda=iuieFEEPOD^>?mur@I?|{pBdKYePzwh_D_8z<9+}y<9-M?u0NyGS9{`WE91JSa!vmi*tq4h!N+Low)eUxkN>~H<}Lj{ zMN`+`>!RE_Tmrw(z`lQE9Bqm71=zgh=e{q|)Q#iyR387Y!R9Ufzd=*i-|MYBdA|jl z*Ere|$CJyv<#SvwGgC#ao+tNo*qUoIJ({}hy=TbdKO?xgHZ!5A>+d~9p1#fu_I)MeXiJ<~!OgXq4NcuR z-ize%pB>y>n>oxxe<7ms;EC_Zk?3X^ab#2tkwei}U^KlVu_Elf+t@79w1KTfc-e=|Z!SjD{u-6pZ zXiF~jGMCr)#9InmaxDp#$F>YOxx8n~lWSSg{eQ8a&e(D*+T43XAOJCK>zIq=`-gU8=S6`olkn?CMq z^>VB}Dhns71*(=$A24e`sy>A+&lxQ^-o{61v^%Kw59#_;I!WkEKk0H zV8^O%%pItWBi@l(d*bf|cC7kn%UIRRvHCoe+`D2+?p?t0p zqb+?=FZ<#%Ut*8M=05RrnK+-z`Vr@SipQIjd@g&dz;D<1*VOM6_}v=&Ec+hC=gWUk z=Vw~`kw;tj=mx)_!7pm?M;iRGg8MxGRLvc~x$-kR^N1b0&)Z|*_RnYc!@(Y3@s^?b zVU%9*vDDL0kE8b4eLOYORqapB|Emf7W2}kPj%gCL&+e0{eRe;9dV1;useN`ohj)ZO+9K`hweT#s;6W z;O1Mf!PjW;wF+*3*J<$e3vRxRYVNuMtJfKi^Kv!UvcA-Bz|}5hfqZuRJJ`dYy=nU! zMa_8>8>b)kH^I*PCd9EHZ^4~=<75xLji#RGn0LTl^VPj38|PiHv9u-jdthU^*YtTG zuAjPlLT-QTSMq-dZsz|dntJx^zrboAQSv_9$6))U&GW+jp_ab<8*JSCw|_o`t64nU z*Y4wt`7?B5h z`t9PYSv;Ek?uFeL>Gw2n+o&7g^FYn`nmYN%eU#r7?*muMf78zML`{FMYtw-pyRke+ z{#|Su$qT|)bii(^ID)5|9Qb` zIalWctGQP^R~G<#c&=)jpRzi|b3<&Le%KcRmwRDhxSGYI+zZa@BIx!#^Rp+Ae@t<#=$SrV+4yi0+bd6!00kIypT=GrZbrXHW=z|A-O6~V^RHib3wKDZLtK4{B5Ze_52_lWlWT665tR;jh}zPBox?e*7g ze6MlpuA}Rj`B_t2eV%w!GQ;4&FoL@!tU4oUaYh)b;ls z)8h5DU}L!ZRGar3`8s@J@5k6T0l!aef9;pKY_Ff=)b2Rl%gx_O{giedk5RnWdw={l zMgPyJy@zj3yDcc?J$dT}-@fLVtA23f+{2nqVa>OKt8Gbf48~K7|F&TL-4~u8+rbA= z)b%%?TKsne>z|)p?E-fn%tz6-GbOQh1@A!7$GvF$J;3U_Q;cu_)e?VCusOr`0_!7p zJU;+ChWw7?-e5KTZ0o$M<+;k7Ur;>Cx&9pPTz^TOx!#9%hnG{GP-JxSI2=zxmYSKMJhB=cnV?7p~^qCB}YWb>}&2G8UXQ(LRP^ zeEY90@yCJ989pAYkKDQ5AM6-1*Au{M`q|dGR?A%XqmSQEJiem1ubt1YDbDq`)Xuff zwUcRA&h^1HH#e|4fPZY~&lCDl9|(6$8&kAxU!Q{qfwfuaGFjSwRIM?aM<3(%Lpubl zmS=}U!DZ9SqLRcq#p zHl^0eYv|Evw%1>~v7LAI%sa5^Wgw34D9*cc>|mVtX{hs=;72$+@0pL|T8*d9$MJBr zmfjB0Js-B!p7}Td>~%~%^Kl~ByybkHgr=Txo(#6FN3>IF&0$14wbsh{I1SDA`fE3~ zYh_Mt8P|`&YS|~J!__R!ec~R|{S5vw|5_CNooBVoa|gygI&gGSXMgtwJI~Wno8MSx z@{jt7>>c@8{G;a2jPs0iHe7xBqTSEnwmYtFcMe>wY z_YB0Fh2k+Iwf*i(JyVVSTh}vF9K)>C?iKgQ`NYUMx-*M#S;5t>D7gFW`ht5uyS3o= zf$y)m>t$@;7w|i{3&7^K_P@n?A@xNR5A7G%cI(XVC17LRz&!a`?^3XubLlgq{FfAC z8Cz^y*YI+%V^6Fr;l{FGj!Etw*Y_&0Yp#A&tz8W^hBp5$%|P=13asvV;9Ok;c251f zHs;aiS~PXz$gcz2PTkzjubTchQ2&~8Q_c0i8LZD>+V_Ls0@g>}_RhbW?fYTB4Xl=H z-R)pCiw9j}X4-9CEA2VA?*MzPQ_s15C)jwdTh7tD;QD&l2YuAi<~Ly5_>M-}+zq#l z`E8?*TH4$LwvBr}ZSIBJCjHe%Eo=Ay*fq@99|Rl2nC{Jo!0tc&%qiE${pDVBk60(( lZ^6cMt*ENs@sC>mPLVdXa{s#5Z14H@FxY&ai(=2k{{?MLcC7#a diff --git a/piet-gpu/shader/gen/kernel4_gray.dxil b/piet-gpu/shader/gen/kernel4_gray.dxil index abe1d225b002617025777d5c355ec77cbff70d71..37fe62c58f87c9d28bebc66f43a9d47c2cbbe0fc 100644 GIT binary patch literal 15796 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 F{|DrQ2bBN- literal 15268 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 MU&tw7&D^j51N`RITmS$7 diff --git a/piet-gpu/shader/gen/kernel4_gray.hlsl b/piet-gpu/shader/gen/kernel4_gray.hlsl index f402268..5bd7b3b 100644 --- a/piet-gpu/shader/gen/kernel4_gray.hlsl +++ b/piet-gpu/shader/gen/kernel4_gray.hlsl @@ -162,7 +162,7 @@ struct Config static const uint3 gl_WorkGroupSize = uint3(8u, 4u, 1u); RWByteAddressBuffer _297 : register(u0, space0); -ByteAddressBuffer _1749 : register(t1, space0); +ByteAddressBuffer _1725 : register(t1, space0); RWTexture2D image_atlas : register(u3, space0); RWTexture2D gradients : register(u4, space0); RWTexture2D image : register(u2, space0); @@ -477,10 +477,10 @@ void fillImage(out float4 spvReturnValue[8], uint2 xy, CmdImage cmd_img) int2 uv = int2(xy + chunk_offset(param)) + cmd_img.offset; float4 fg_rgba = image_atlas[uv]; float3 param_1 = fg_rgba.xyz; - float3 _1721 = fromsRGB(param_1); - fg_rgba.x = _1721.x; - fg_rgba.y = _1721.y; - fg_rgba.z = _1721.z; + float3 _1697 = fromsRGB(param_1); + fg_rgba.x = _1697.x; + fg_rgba.y = _1697.y; + fg_rgba.z = _1697.z; rgba[i] = fg_rgba; } spvReturnValue = rgba; @@ -918,12 +918,6 @@ float4 mix_compose(float3 cb, float3 cs, float ab, float as, uint mode) break; } case 13u: - { - float rev_as = 1.0f - as; - float rev_ab = 1.0f - ab; - return max(0.0f.xxxx, float4((cs * rev_as) + (cb * rev_ab), rev_as + rev_ab)); - } - case 14u: { return min(1.0f.xxxx, float4((cs * as) + (cb * ab), as + ab)); } @@ -992,16 +986,18 @@ CmdJump Cmd_Jump_read(Alloc a, CmdRef ref) void comp_main() { - uint tile_ix = (gl_WorkGroupID.y * _1749.Load(8)) + gl_WorkGroupID.x; - Alloc _1764; - _1764.offset = _1749.Load(24); + uint tile_ix = (gl_WorkGroupID.y * _1725.Load(8)) + gl_WorkGroupID.x; + Alloc _1740; + _1740.offset = _1725.Load(24); Alloc param; - param.offset = _1764.offset; + param.offset = _1740.offset; uint param_1 = tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); - CmdRef _1773 = { cmd_alloc.offset }; - CmdRef cmd_ref = _1773; + CmdRef _1749 = { cmd_alloc.offset }; + CmdRef cmd_ref = _1749; + uint blend_offset = _297.Load((cmd_ref.offset >> uint(2)) * 4 + 8); + cmd_ref.offset += 4u; uint2 xy_uint = uint2(gl_LocalInvocationID.x + (16u * gl_WorkGroupID.x), gl_LocalInvocationID.y + (16u * gl_WorkGroupID.y)); float2 xy = float2(xy_uint); float4 rgba[8]; @@ -1014,7 +1010,9 @@ void comp_main() float df[8]; TileSegRef tile_seg_ref; float area[8]; - uint blend_stack[128][8]; + uint blend_stack[4][8]; + uint base_ix_1; + uint bg_rgba; while (mem_ok) { Alloc param_3 = cmd_alloc; @@ -1035,8 +1033,8 @@ void comp_main() { df[k] = 1000000000.0f; } - TileSegRef _1867 = { stroke.tile_ref }; - tile_seg_ref = _1867; + TileSegRef _1854 = { stroke.tile_ref }; + tile_seg_ref = _1854; do { uint param_7 = tile_seg_ref.offset; @@ -1072,8 +1070,8 @@ void comp_main() { area[k_3] = float(fill.backdrop); } - TileSegRef _1987 = { fill.tile_ref }; - tile_seg_ref = _1987; + TileSegRef _1974 = { fill.tile_ref }; + tile_seg_ref = _1974; do { uint param_15 = tile_seg_ref.offset; @@ -1162,10 +1160,10 @@ void comp_main() int x = int(round(clamp(my_d, 0.0f, 1.0f) * 511.0f)); float4 fg_rgba = gradients[int2(x, int(lin.index))]; float3 param_29 = fg_rgba.xyz; - float3 _2321 = fromsRGB(param_29); - fg_rgba.x = _2321.x; - fg_rgba.y = _2321.y; - fg_rgba.z = _2321.z; + float3 _2308 = fromsRGB(param_29); + fg_rgba.x = _2308.x; + fg_rgba.y = _2308.y; + fg_rgba.z = _2308.z; float4 fg_k_1 = fg_rgba * area[k_9]; rgba[k_9] = (rgba[k_9] * (1.0f - fg_k_1.w)) + fg_k_1; } @@ -1188,10 +1186,10 @@ void comp_main() int x_1 = int(round(clamp(t_2, 0.0f, 1.0f) * 511.0f)); float4 fg_rgba_1 = gradients[int2(x_1, int(rad.index))]; float3 param_33 = fg_rgba_1.xyz; - float3 _2431 = fromsRGB(param_33); - fg_rgba_1.x = _2431.x; - fg_rgba_1.y = _2431.y; - fg_rgba_1.z = _2431.z; + float3 _2418 = fromsRGB(param_33); + fg_rgba_1.x = _2418.x; + fg_rgba_1.y = _2418.y; + fg_rgba_1.z = _2418.z; float4 fg_k_2 = fg_rgba_1 * area[k_10]; rgba[k_10] = (rgba[k_10] * (1.0f - fg_k_2.w)) + fg_k_2; } @@ -1205,9 +1203,9 @@ void comp_main() CmdImage fill_img = Cmd_Image_read(param_34, param_35); uint2 param_36 = xy_uint; CmdImage param_37 = fill_img; - float4 _2474[8]; - fillImage(_2474, param_36, param_37); - float4 img[8] = _2474; + float4 _2461[8]; + fillImage(_2461, param_36, param_37); + float4 img[8] = _2461; for (uint k_11 = 0u; k_11 < 8u; k_11++) { float4 fg_k_3 = img[k_11] * area[k_11]; @@ -1218,13 +1216,26 @@ void comp_main() } case 9u: { - for (uint k_12 = 0u; k_12 < 8u; k_12++) + if (clip_depth < 4u) { - uint d_2 = min(clip_depth, 127u); - float4 param_38 = float4(rgba[k_12]); - uint _2537 = packsRGB(param_38); - blend_stack[d_2][k_12] = _2537; - rgba[k_12] = 0.0f.xxxx; + for (uint k_12 = 0u; k_12 < 8u; k_12++) + { + float4 param_38 = float4(rgba[k_12]); + uint _2523 = packsRGB(param_38); + blend_stack[clip_depth][k_12] = _2523; + rgba[k_12] = 0.0f.xxxx; + } + } + else + { + uint base_ix = ((blend_offset >> uint(2)) + (((clip_depth - 4u) * 16u) * 16u)) + (8u * (gl_LocalInvocationID.x + (8u * gl_LocalInvocationID.y))); + for (uint k_13 = 0u; k_13 < 8u; k_13++) + { + float4 param_39 = float4(rgba[k_13]); + uint _2566 = packsRGB(param_39); + _297.Store((base_ix + k_13) * 4 + 8, _2566); + rgba[k_13] = 0.0f.xxxx; + } } clip_depth++; cmd_ref.offset += 4u; @@ -1232,32 +1243,41 @@ void comp_main() } case 10u: { - Alloc param_39 = cmd_alloc; - CmdRef param_40 = cmd_ref; - CmdEndClip end_clip = Cmd_EndClip_read(param_39, param_40); - uint blend_mode = end_clip.blend >> uint(8); - uint comp_mode = end_clip.blend & 255u; + Alloc param_40 = cmd_alloc; + CmdRef param_41 = cmd_ref; + CmdEndClip end_clip = Cmd_EndClip_read(param_40, param_41); clip_depth--; - for (uint k_13 = 0u; k_13 < 8u; k_13++) + if (clip_depth < 4u) { - uint d_3 = min(clip_depth, 127u); - uint param_41 = blend_stack[d_3][k_13]; - float4 bg = unpacksRGB(param_41); - float4 fg_1 = rgba[k_13] * area[k_13]; - float4 param_42 = bg; - float4 param_43 = fg_1; - uint param_44 = end_clip.blend; - rgba[k_13] = mix_blend_compose(param_42, param_43, param_44); + base_ix_1 = ((blend_offset >> uint(2)) + (((clip_depth - 4u) * 16u) * 16u)) + (8u * (gl_LocalInvocationID.x + (8u * gl_LocalInvocationID.y))); + } + for (uint k_14 = 0u; k_14 < 8u; k_14++) + { + if (clip_depth < 4u) + { + bg_rgba = blend_stack[clip_depth][k_14]; + } + else + { + bg_rgba = _297.Load((base_ix_1 + k_14) * 4 + 8); + } + uint param_42 = bg_rgba; + float4 bg = unpacksRGB(param_42); + float4 fg_1 = rgba[k_14] * area[k_14]; + float4 param_43 = bg; + float4 param_44 = fg_1; + uint param_45 = end_clip.blend; + rgba[k_14] = mix_blend_compose(param_43, param_44, param_45); } cmd_ref.offset += 8u; break; } case 11u: { - Alloc param_45 = cmd_alloc; - CmdRef param_46 = cmd_ref; - CmdRef _2615 = { Cmd_Jump_read(param_45, param_46).new_ref }; - cmd_ref = _2615; + Alloc param_46 = cmd_alloc; + CmdRef param_47 = cmd_ref; + CmdRef _2665 = { Cmd_Jump_read(param_46, param_47).new_ref }; + cmd_ref = _2665; cmd_alloc.offset = cmd_ref.offset; break; } @@ -1265,8 +1285,8 @@ void comp_main() } for (uint i_1 = 0u; i_1 < 8u; i_1++) { - uint param_47 = i_1; - image[int2(xy_uint + chunk_offset(param_47))] = rgba[i_1].w.x; + uint param_48 = i_1; + image[int2(xy_uint + chunk_offset(param_48))] = rgba[i_1].w.x; } } diff --git a/piet-gpu/shader/gen/kernel4_gray.msl b/piet-gpu/shader/gen/kernel4_gray.msl index 9647001..2b550b8 100644 --- a/piet-gpu/shader/gen/kernel4_gray.msl +++ b/piet-gpu/shader/gen/kernel4_gray.msl @@ -528,10 +528,10 @@ spvUnsafeArray fillImage(thread const uint2& xy, thread const CmdImag int2 uv = int2(xy + chunk_offset(param)) + cmd_img.offset; float4 fg_rgba = image_atlas.read(uint2(uv)); float3 param_1 = fg_rgba.xyz; - float3 _1721 = fromsRGB(param_1); - fg_rgba.x = _1721.x; - fg_rgba.y = _1721.y; - fg_rgba.z = _1721.z; + float3 _1697 = fromsRGB(param_1); + fg_rgba.x = _1697.x; + fg_rgba.y = _1697.y; + fg_rgba.z = _1697.z; rgba[i] = fg_rgba; } return rgba; @@ -985,12 +985,6 @@ float4 mix_compose(thread const float3& cb, thread const float3& cs, thread cons break; } case 13u: - { - float rev_as = 1.0 - as; - float rev_ab = 1.0 - ab; - return fast::max(float4(0.0), float4((cs * rev_as) + (cb * rev_ab), rev_as + rev_ab)); - } - case 14u: { return fast::min(float4(1.0), float4((cs * as) + (cb * ab), as + ab)); } @@ -1059,15 +1053,17 @@ CmdJump Cmd_Jump_read(thread const Alloc& a, thread const CmdRef& ref, device Me return CmdJump_read(param, param_1, v_297); } -kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1749 [[buffer(1)]], texture2d image [[texture(2)]], texture2d image_atlas [[texture(3)]], texture2d gradients [[texture(4)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) +kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1725 [[buffer(1)]], texture2d image [[texture(2)]], texture2d image_atlas [[texture(3)]], texture2d gradients [[texture(4)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) { - uint tile_ix = (gl_WorkGroupID.y * _1749.conf.width_in_tiles) + gl_WorkGroupID.x; + uint tile_ix = (gl_WorkGroupID.y * _1725.conf.width_in_tiles) + gl_WorkGroupID.x; Alloc param; - param.offset = _1749.conf.ptcl_alloc.offset; + param.offset = _1725.conf.ptcl_alloc.offset; uint param_1 = tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); CmdRef cmd_ref = CmdRef{ cmd_alloc.offset }; + uint blend_offset = v_297.memory[cmd_ref.offset >> uint(2)]; + cmd_ref.offset += 4u; uint2 xy_uint = uint2(gl_LocalInvocationID.x + (16u * gl_WorkGroupID.x), gl_LocalInvocationID.y + (16u * gl_WorkGroupID.y)); float2 xy = float2(xy_uint); spvUnsafeArray rgba; @@ -1080,7 +1076,9 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 spvUnsafeArray df; TileSegRef tile_seg_ref; spvUnsafeArray area; - spvUnsafeArray, 128> blend_stack; + spvUnsafeArray, 4> blend_stack; + uint base_ix_1; + uint bg_rgba; while (mem_ok) { Alloc param_3 = cmd_alloc; @@ -1226,10 +1224,10 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 int x = int(round(fast::clamp(my_d, 0.0, 1.0) * 511.0)); float4 fg_rgba = gradients.read(uint2(int2(x, int(lin.index)))); float3 param_29 = fg_rgba.xyz; - float3 _2321 = fromsRGB(param_29); - fg_rgba.x = _2321.x; - fg_rgba.y = _2321.y; - fg_rgba.z = _2321.z; + float3 _2308 = fromsRGB(param_29); + fg_rgba.x = _2308.x; + fg_rgba.y = _2308.y; + fg_rgba.z = _2308.z; float4 fg_k_1 = fg_rgba * area[k_9]; rgba[k_9] = (rgba[k_9] * (1.0 - fg_k_1.w)) + fg_k_1; } @@ -1252,10 +1250,10 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 int x_1 = int(round(fast::clamp(t_2, 0.0, 1.0) * 511.0)); float4 fg_rgba_1 = gradients.read(uint2(int2(x_1, int(rad.index)))); float3 param_33 = fg_rgba_1.xyz; - float3 _2431 = fromsRGB(param_33); - fg_rgba_1.x = _2431.x; - fg_rgba_1.y = _2431.y; - fg_rgba_1.z = _2431.z; + float3 _2418 = fromsRGB(param_33); + fg_rgba_1.x = _2418.x; + fg_rgba_1.y = _2418.y; + fg_rgba_1.z = _2418.z; float4 fg_k_2 = fg_rgba_1 * area[k_10]; rgba[k_10] = (rgba[k_10] * (1.0 - fg_k_2.w)) + fg_k_2; } @@ -1281,13 +1279,26 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 } case 9u: { - for (uint k_12 = 0u; k_12 < 8u; k_12++) + if (clip_depth < 4u) { - uint d_2 = min(clip_depth, 127u); - float4 param_38 = float4(rgba[k_12]); - uint _2537 = packsRGB(param_38); - blend_stack[d_2][k_12] = _2537; - rgba[k_12] = float4(0.0); + for (uint k_12 = 0u; k_12 < 8u; k_12++) + { + float4 param_38 = float4(rgba[k_12]); + uint _2523 = packsRGB(param_38); + blend_stack[clip_depth][k_12] = _2523; + rgba[k_12] = float4(0.0); + } + } + else + { + uint base_ix = ((blend_offset >> uint(2)) + (((clip_depth - 4u) * 16u) * 16u)) + (8u * (gl_LocalInvocationID.x + (8u * gl_LocalInvocationID.y))); + for (uint k_13 = 0u; k_13 < 8u; k_13++) + { + float4 param_39 = float4(rgba[k_13]); + uint _2566 = packsRGB(param_39); + v_297.memory[base_ix + k_13] = _2566; + rgba[k_13] = float4(0.0); + } } clip_depth++; cmd_ref.offset += 4u; @@ -1295,31 +1306,40 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 } case 10u: { - Alloc param_39 = cmd_alloc; - CmdRef param_40 = cmd_ref; - CmdEndClip end_clip = Cmd_EndClip_read(param_39, param_40, v_297); - uint blend_mode = end_clip.blend >> uint(8); - uint comp_mode = end_clip.blend & 255u; + Alloc param_40 = cmd_alloc; + CmdRef param_41 = cmd_ref; + CmdEndClip end_clip = Cmd_EndClip_read(param_40, param_41, v_297); clip_depth--; - for (uint k_13 = 0u; k_13 < 8u; k_13++) + if (clip_depth < 4u) { - uint d_3 = min(clip_depth, 127u); - uint param_41 = blend_stack[d_3][k_13]; - float4 bg = unpacksRGB(param_41); - float4 fg_1 = rgba[k_13] * area[k_13]; - float4 param_42 = bg; - float4 param_43 = fg_1; - uint param_44 = end_clip.blend; - rgba[k_13] = mix_blend_compose(param_42, param_43, param_44); + base_ix_1 = ((blend_offset >> uint(2)) + (((clip_depth - 4u) * 16u) * 16u)) + (8u * (gl_LocalInvocationID.x + (8u * gl_LocalInvocationID.y))); + } + for (uint k_14 = 0u; k_14 < 8u; k_14++) + { + if (clip_depth < 4u) + { + bg_rgba = blend_stack[clip_depth][k_14]; + } + else + { + bg_rgba = v_297.memory[base_ix_1 + k_14]; + } + uint param_42 = bg_rgba; + float4 bg = unpacksRGB(param_42); + float4 fg_1 = rgba[k_14] * area[k_14]; + float4 param_43 = bg; + float4 param_44 = fg_1; + uint param_45 = end_clip.blend; + rgba[k_14] = mix_blend_compose(param_43, param_44, param_45); } cmd_ref.offset += 8u; break; } case 11u: { - Alloc param_45 = cmd_alloc; - CmdRef param_46 = cmd_ref; - cmd_ref = CmdRef{ Cmd_Jump_read(param_45, param_46, v_297).new_ref }; + Alloc param_46 = cmd_alloc; + CmdRef param_47 = cmd_ref; + cmd_ref = CmdRef{ Cmd_Jump_read(param_46, param_47, v_297).new_ref }; cmd_alloc.offset = cmd_ref.offset; break; } @@ -1327,8 +1347,8 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 } for (uint i_1 = 0u; i_1 < 8u; i_1++) { - uint param_47 = i_1; - image.write(float4(rgba[i_1].w), uint2(int2(xy_uint + chunk_offset(param_47)))); + uint param_48 = i_1; + image.write(float4(rgba[i_1].w), uint2(int2(xy_uint + chunk_offset(param_48)))); } } diff --git a/piet-gpu/shader/gen/kernel4_gray.spv b/piet-gpu/shader/gen/kernel4_gray.spv index 2dd46c0c42af01cab37314c1ccd977a619948efb..bacd9a8acae5321469a15f256283bf14aeee2c84 100644 GIT binary patch literal 67312 zcmbTf2cTV5)wR9Dy$PX%6zM&5kltG;2_-=2O$awVkVXmwq=gQGq99E{K)Ql}bOdRN z3Id`um5v}ydT;;poU_Nxy8HXy*Ux|JVvRB8Tyw6r+c_sm$4tx2TvffQS*yO)$+K3i zW1eazl&Z2`gL<~APm2#6wCkYNCQli@+S==^uH&3lhgHiqS2c6h8{A15*EMFm`b~YR z>IKT&v{#>p(w8DOeh2@XiTYkhCp{QAXvn~wb{aTn>mkD?P8>3M%3)(i3>iCS{D>jL z$4nYAY|5BJM(EeK@EbFJ*x0GVONZWglzospto~!iP8derhhEmhtR{>cIeEmC3T5VM zE^OmR96F>+zZIsgu@V0ty2eJ>I;+{S&G7B4=73Kgb2z=RZ71`KXm%td@Y!7@s2`v^Br#9y8kZuKK~deZhVBpPI*%F)Z|?v~TO~kI`LYM-Dl3%uGWQ_jN`3r zzctr=s*T%m2aOp&a8lRs)^xY}tL{iK#b<~ zrKKGg^D;~d5&3HQ17_UZd>;PidZcHI7BCywr7)mwd1^O%vpceOX1{4GCi_Fc`R z%f{4R1NNhi-+%09vKIZ^*Lba19o4s~v)6{S<8D2E_?BbGOth!%KB#+?eYHJ(sD0ah zY92$!ju=0j+H=F3+zh|}*xMPoi~f4wO@ED>c^%b`z1`Gt?an%1Y92HC+F6Z((+B-p zb1L`ne%+2WcQp=P`~1gF)(Pt#I?j%YTX%OK$Aa5&JF5xpxUI>we{zqqe+R?Ky;~QZ z_gs^EOhK@XyccEU*sf8NseAJTF_oG&L-6_EZerwZchf%FHuLC--tOaE)!}t4?-&1Z z@ZAyHas|2pmuinu@QjyqR%ZXLIE zN&7FNx>jcwG0*9aId^qI9kV{6|BI;YIrwoA_b1(P=c+EL<9ZJMH$m;|MMcbuyJPmQ zE(Pz#Gvux#Ms=U3Y98fzdO5uIYn_*Jj|r2;jPi}eb5+fA^$=b-d=84{{q?XRBZiOS zf*8&F>-Z7VTK8P9>sQ0;`2YLRW^}g4HRwv(=UluB+&;hiRM&$i51TY%#P}5s8M)R* zmex7(OY~tw+w*;$m0Lcwo33^O zV5?8R)84|pt3OhYojR`70btAi2kN%HPxY{vJ7W9Uw(aJA`cvWa7ceh_LlVac)926K zJ{{F#VDAmRt68eQ)&BHr$e8itM@*`xY{p!7R!`V=T>D+v_rxdL+*=?qI;*Ezyvs{) zE7#N1UgLYS!=4q>pNu>G`3HJ?TpiUj-Tr;6m%-!4OdHa=cXuzvjQ6@1Y*+7<7sai; z(pkM^y9vX+&69W5>PNRjzo#%CNo#zd3 zndg0Z`degMo9(@}FW=aGFMEf&=Q~tK^)A}vNyD&qR___7yZ^nbkKj`#Ox|VS7BklQ zLp0uP@b6Q73LZIW!nhe8=IN|HL7%J>hkjpDPaQvzx3`vOt3&#IQTw&eQ$82zRaMcUvvm>ieF{pvnX5kd4I4dm{6Rz7S0q1TXxlof-q^;p{ARD_0*~ZA-ny2raLCj( zH=6NA+tRpVta`|pHFG}Cf&Vma-1cowbMQP+;s};AiS_C|?Yf_ibN%}6< zgLhQ@;D^+<<-t3Q7&l=OaeY6Od$c~|s6R7_u1S5wq)A>b@$TL7pQ)|4V%V1z>loq< zz+>3;_G1(9q^?7Kt!?qm;blL!Xz;Dt{%gd4n}&V69=xO40nQdAc1N`*IC=L4mwET^ z(XO*PpuvZ>{k!vyXxK;f;2qV0@Z_BWPTpzYGVgbKwCk*n?7=&#W8jH%A~=JHGcSz8Skc@)mc5-bXI3K z_@xbgd4pfu;MXJzKV6U#v>pItA{-v-k1`!6R$@ zICxNfJ$a(h=4m*ucC9uqf_>Qbx-&nIXytWkkp|zS!8dR4EgO75gYVhk`!x7|4Sqm_ zAK2jI8hm1dPj2wz8~mgOKefS6Z}1Bn{Ne_`w85`v@ar4=#sCuN!=(-aYqD-v*zp!RKo5Z#4J<4Zcu=FVWyj zHF&=UU%tUNXz-02eA5Qsyur6@@U0qrV1sYh;DZ``#|GcI!FOr!-5Y$b2H&T__iOM2 z8hmIE&S$^ykzMU;#8@#K&uheW;I7F-G`0AR@}WaC!#k>5;lubq*!R>Yz+=WAGKBZi zA#MMT>L1#9 zK@Z-$`V#KDd>yitvv;5LoA*F)8E=UOU#h{EZSdtAd{y|csZ)5#b$p%Gn((0`#!fi2 zp2PLvT|+1MResC9O~ZeOhX3G(|9<+nzoKll?}C^8AJ>C-R42gO@75jF>ENlnnu>{zQ!+s3W18a=|#?PeGgkIP+q9QBVA zqO+B%p@hnB7NXm=iBpD+jUoAGR&VzzrtUuX#nv@`{Dc@1YZmk=le)%Ft__JbYaMII z(4iBib=&&3#yK0d;XE{rn=pRDnBj>yV}54G-unEndpzwqm?QeoF`TsRABgnf_a)Bh zoUu)w!e>CS&Y0V|V(-zPcHFtK*`J<$ZQJIlZDYodEXLlumGc|eSSUx&JhioXTbi?I z?zT2xOLIgs`ZGUTd)~5(w6({w05-qxZtsQC-tN;kv75nnfmk!|3)VJv*8gE!2%F>l zzqMPqwhix^(v^muS9dVC?R~w))RFi&CN+;??00Lgi+9$VZSDvAxmNa_=i(pG%Jcq_ z27k1{AFE^JGxaCn?Q3mD+&(v-N1t}skf~$FPa$*P*6)`%hX+j<)-`t9@rO`N88czL zXL7rr@3j2e_VWN7Wd;Ugxtf6vlc&4kwaOpPxe9rNsP<`T?r zjKJmi=4$YMa6TF2hd1qhFW0cI(1UkWE5rSc(>&{dhmREZsWt+)u30XylT-U_iSE_J zzHALH`?5`gZ`^Lp@(>L>7#quS%Upkcchp8371>t~PJweHWg0&riVRv&N_J zQIoock7?i5Tk(2vBP{1`HaKm%$FVG&CN1B74d3N^@Q!LFc;;hGaJk>sZuo8s_gf3s ze@F1J8t)Fy-s%EpETh0P#=`F<;AOuLYuoF7_pW{@_jd|@Nzs~{&g#rYn;-Sy9o4z; z_IDcWgC4fd>c>5JM|B}QW4#<)&e{Flw%*kv;P&;ub%SrsUBCy>@#uAk0^WxvR^)OK{>>J=jI{) zv<+MMlLGr4n}Ju3gK4xs`${ezVs8Zb{oR{)Z!)P1H(1pMTXjy;?c^ z9*az^xPBkCG}yyD@}=6e<-3|mIqcgS1@?U=`Z@((x4^#R#Am|-Z&Kh*3*5iJTNHT9 z0&iX5Z3{f8z`i>r?~VoDsldKZ#b@UN?^57h3%o~x_bl*U1>UE?zMmz&?`FY63p}jA z!wWpJz@rL0y1-)!d|-in?@O-n1)fmgi3Ofi;K>D^QsAitKBT~h7I<2L4=b?mlkNU= zw%#Sny>>n}_gZ@|cC_q1=eyUm`OGc$ebYny(*j>q;EN0F`)K@sUf^GL1;Up zeD1lEcTdj~54GEC|E9(%(&HS{uRO=n)^XX^_pWH3mukKnMe}`9ZN5S?wVHDfKOSXT z+MQ1=Th# zG{>p7d7=64r?yq0`Oc@dO`*9L)CLurbEG!7(0u1p+pW-i*Hhc8(0spB`*xu@ziI~* zn(uRJ!wb!QqBgpvb#}k2*~e|TZsy%B>lJPr5BIKGM+NjU7opaORlcxZu#71-y?w7sanK2Ju!y1>^I z_}T*BP~aO2d{cpMF7Pb{zO}$UGq&?~Rz5G5b0~KXJ;xlYJl7MkYoqQnrH6Q?0(TU+ zv%o%c#((w#&sE^L3p`(e7bx&I3%p=~7b@_=1@@UTd3~M?o><_63p}a7K5xeV@B$xM z;G+tBY=Mt2@CgMzvA`!4_~ZinjGDX`6xe6b=vNi^7X`kiz}FY}R|USYz&926<^tbR z;J+5w=i2n)>jL`>8{Oy2;B5=+vt{%h3Ou;LI~RDj0`Jj{J1d_Z%RMW1&(1_~KgzRb z#a@flj{|#nZ8!<+wL#mww6yI~_;_s*&ySDyk0mJ{OTxVzSk&jki_@W{I}Pgc#fe}V zeU{?C=8&hYzQ*$Ut)^`$?vq}-Z696DYpro+XniX0TegX240Adk?f!PQuCeNB3t;me zwj^b7^7f#VU>rcNyHYsOM@PFAH}lG2M}yw#}nRX5(ZsMU;TTjP1p zOFX~KHJ+Nbb!(e#*8|IKtDko7gK4`7*tTkmqx$D`v^ka(<7@`kW*plXXDjN&*&1vd zwQn+p0o1ndtogv2yAKv;RkoqFt$x~Kw~hI>rPjxM#x~!M)XBFK*nDc{^Sc-oJdS{C9Y-_wdsT0rpvGLTj?M;snDRzL0jnT@nP0Bl<|ZC%vb%sZ4? zZrcMW+DB2R?P#!V)wGSNZMHoSEVr$G+9yz_?L@F`)!a7+*S6%I1Xr`YzQ#P1I(sSF z5op=3(Wawi%+XFn%U+81U9{|rXlI~h?V|k%ZD&f^m-FG7oA~_{En`-5%$HJU%$I>3 zvzq($a_WI~alOmWsoUn-8mn9M`4zQ3w$tav8mn8D z!soZOW*hlK)W&S{-qoW8Z?~DbdK}HYnmDPwzCB;~8^iodan8I#J%FNSNgM6<_21ND zeT?&Vjn!kbf1lTSJ8oz7HM~#l<2-frYIFOiekuDRz<;-8O} z{+Ra?c=qL$wZG?8^4(C|)Bf-9&LZAR@ZJS~1742jeYj&t`NKBwtH@F>*R6hFCX0E$7~jUaNE9l_|a{?*(%JE=jt(VwG_{T>2UXD5?Uif$b^C1(S4)ZC zZfNJ9w@~*Q?+#Z>S%@?AT)6wW7o|Kn9hk-TT%L!IhrV9#^DM;uWoy}zl~6{{mnI|YTb|hOsb6+Ykd|aE{pd6Kc$TEKVhE-{Jg@?w(Q%l zshtZo`!4r03pMB2efV2A|L@+14@j6i+yAllwZ9p=pK&;L+w1x=|M6OubKpyO&i~Zj z=hkA9T`TW%#$FrlysKx;*8{I`(D)q_dn>r_|EqBI97w$%JlCN3oQF0$w#1l+lj_d( zPFyGa15dJJzTPrx?`H}gX}>rZ`uPfe8hmxQeSQe+811wCPjEHwFOK11FzH*m`|(h2 z693bFoC`nOO!G#mEu?z74B1@|8KPQmqmzu=x@pBG%azbUY`zf5B_ zQ^D2!Jwfb_$KMo$+dqF(5biTbzk=)UZwg}9-`^C3Tl<@WaQC90&xK!x-QO03dr$Q@ z1>x3PH@Lqmh~4q{yMl20jqmRY!ks^VR}gOPZwkV-`@4d0>!AhrS=Zkcly-kx z5bpT=oH5*IGJjtXZvQSSxbt;M!S%bW;LeA?F;I8?to@xq$^D%{xbty$!OiFI3}Saa z{GCC#wZAh6cl`d=Al%yD8iZ^2w+1Emw+1DDzQO&yL236l2jR}AzdIcu?-zkJ! z`x}LD+rLzB-zof!LhSa>&z!@rf&2M!xOP7u4)>Yf-z0?Fe}9({ZvXvVLb$cRO9;2W z{x%`p+TSLG+h2d1P;!5tP;!5x5bk*VokF<%^>gKL$Kz+q;oAM|INbL}f2$Dgc>JA0 zxa0A63gKR#{R}wV>$|^I2sfU;RS38Cw+i9r_p{<~Yk#j0?tRkVEQIUt=ept6{$8Qv z{$3$me?RXH_npY!EQC8gf3Fbk`24*>xV67mD7n8^D7n8`2sfXfDTiD8yM=J=ezsh4 zf4fj}f4dNF?Qa*t?XSOG2)Dofb|Ku_-!7Eg-z&)bbJzEo^A?KFp*|mM!ZjFJ-CFDY zVZOKD1^0Q+&klU2kKb?5v>i_@s_Jh3V_WsazXxo5KU+wrb^tcUygQE*?hnxyJFCU#_3n z=Nt2heYP>@2FxJSSp6BiB(-hz)2^S-Oxm0SSHHI&*VAA%*C*@tH~5NhHSNj$cd#~d`8+01u77}=xt>8&&w4!zR`a>(A2Z`uY!G7P)~pU1vZwp#Ci>EzH(o` z4p)!Q8({O5K5xR+lkY9C`P7r|-(X{D8_f7Rn1{E)_CuTFf1X;+IoJL!SZyMFAnW}e zSWRD_dF5iCcb%h8c`p9|?DM(xN3{Eh`eTZR_D^cNb=LM%uraQqU);K?&%kQF2Yf~h z`G*u^8C#sTUx01v{CI8p3heW?x_y&>Ninzmu)THKe+{;M=E=>k=I3}Bn_4+G`=QO} zc*kvSuQ?rX_pWUdzY|UU>UwOw!D_ZMhR^nYMEf;S?y%oi=x>vRXd){gDeOI1)?Dk+k^RT_`wCgvB zTAMK(%Z}jI7_jXCmb*_b$F>vrYHHhPv;CIT>h|B~?w!GEx!w%Ke;2sA{)4IIV&AE= zuXY1FSJuwe9@KkMJe;e&YP)sTc5kpTvaj|5t7Tuwcc&Q3*kaobB<8ol-Y=%pZ~6Xk zH9ynJScZTdOV(l_eh0wSkE`2tfo-eqnD(VsOCN`U?W4A#)bb5z+rhGtjQ2>eJD6m?tOWM?IpL4@~Y(77qIU4NVyn&7y z^HQ{9;Ogezh+1y@EvU_JZF{O}I{(opd)qZR7Owtte7v3<2UhbO^`0o-jMATCJZp0u zPo4AlgxY59d3+M}$rKO!a!PHt&Rm=dHb&0l?}F8G9?MUp7|Xokv^^bc+pNR)!2Kw> z{!;M};>)PBw=M^p*V?^xCG}Ml5Bqg>ZMV++{TytJ?5$sb)v~wbS5S;)Y;oFN1GcSm z;%7kDg6&)OmfzR>60Sah{Y)S-T*dd*5+4WwXC-` zHQQ%C?0eSjMzDP>*ZU^8dY)Hq2CLa0uK{x7-9l}DtexN6sBfouXuq|#TPNS0;O2GY zE;M!H|C(AZ{tfk36vyiIzVc_IbrN+Vr`DT3!4Ab@tZp!H(V9vHy|!L5hcCf2g)wXRZDOHb(Z=!(g@SE%_fP z#xl0pwgZXzDA?zZ#Ci;FEc^9mYI&X${sQ(nK|Rk2e+8>gXKxN9-s50nsvF}GYBkr% z=dvfkjy?NgAZ?z4tEW#-gKd|4z)n`~C}HW9G92#T>hXCAY`fCuWw`p_dOrRMww-#kSHSrWG}^1$>*o}& z;RDI{FSK04jbl6g?C9+{?B22%PmS`~ESy zw#54ctY-1~a3F0z1shYF^Y#w4TKf4p*nXDt_61x$K3{@e=hEjZxO#lP1{=HdaYEH| zPwoYGJ-y$U!x;J`#!TR5Upmm#DmK?Kz)ynbCj;0=;IclG>A9JFq=UH|xu>J5^*7n+Co4c^-=lPLmo^Qal z`@O#X^Lsh9hW2i_9^@KO*HlNVL`C{TY+MG?dJ1)KW#bJ76z-O-6G(O zOIzMQ{C-ed+ARiFOS{Fv$*0Zhg!%j)QCr$A33kkBw-h+-w56TjH)>0}Wx(bOUly!S zc)yyT!1?1fWI4D#>hW0~Y=6R6sCn9~2-inF>$MWtSlZ&ZGT3KdZPV*~tAOpJw!~i* z>{t_PHL!l_@%a|m`43+mT((&Qu8(@&9oGaKOPh1-cd=^5@I7QLu=m2mTpO-W_Rl)t z<~4U+H1+tbSNoKEY<)EKjAsL|?bI_j8-mTJEwMHNpGJS|SNgOuSUvN%30TecX}2jj z?Hs3EKc6RZEw|3NH^b(*bN$^Meh1w9X?ec)N7t73)h)p8LFZ0e@^1-#g!bheY=x#C zpRK{>Scw1`+W<86%+o-y?bI{gZNTcDU%9qz3%4J>|7*{?Pv&+zH2bPw@^24zjvRaP z4+5(v*A8Gc+o#=*;IwmY<@!0dKDT+Fw9ee_gw46lbM;`jTAr)5so6fyfwXCCjJjGbX7N_kLux&HHQ^C%! zx_y&7|K_$Iwzp3EL%_DrTpS8k%lv9nE5~L(GEdXMnWw}&3{5>T4+pE2-;aI=o_6+A zuAg}_zl$;sWBR$o(b)32#8F_mHb0k`4mOr?jseSkcl5X3$AXWiwv9G@j-*x>A4i?F zJ09%(Si5#7QlCWeuwN(FcI%Aw6tFR}cBg{XvUc(lD8@3jIBmZRwr$q#G_ZZkwPjiI zo(@-!&-diai*4<{Tp#;qU(I2i9N!066@z+V`Xpr0_@&U*T?;H4OrdJ(v5K~ z*f{Er=PGKo#QY`LnBmve+#G%fem&gpz}59J<_%!=^y61x<6gpkNI!0btLItdCa~8f z_4Ms#u(7ly_AOvzO|ScZD_B4E^yxOReX{S4Nv@x3;CeWZ))~|7V8@vKdk0u8=Y%#j z+h>hk5A!j-)vv+X+lhH6ntEd11y(E1iQmA}&VI`EE6<6=i*w>WY&j?H1{Lb&d-=nsTHgnxWt)4adJy^{#8`Hh=2e^8C{s{K7E%$qT9z;{mv*1Hu z+o`ABpTNdmsc82wTs=OIfQ?-~(>{u(p4fi|+fIEtb8jCX1DjJ@V*LedzC6?E_gA=j z+C2`ot-AB^0JWO<3F@5FPlDYq)}GT(Q~!(C&0yMm4K|Lt|3b+CG=Dr|E^YSX z6KXa4q20f`L2ak1Z|l#N`S&-dSv(w*zhAMfzuDF9KJ(9^b%HCetoO9TW74RgN>2v{u*GlT=(UxP>f}4v26zub1iWB zz0o>wW7#i%<1WvAU|q2H0rlJm)&r}%AB?v?*qG|ZSd&^Udt(EzW6!<7{kkDseJ57a z7#o4rEFPYJw)Z=PjnRx*-X}JJtGjP)zbV)l>dCtqxS4lzH1*`|4_32yo#1rn&btMg zdCU97mT>jt-3n|B^~}fCVEfau(LcXC8vwU2xj)(GfpB%tNBK5j+p1?C)v|8ef$fju zGv@YSW9Hez7=z&I`Q6P9VB4u1b6aY)%!*4Qw23=G~E6Ejji8+n4Y?Yo7Ld!Szv(&)#6;IM4QTAFzJvxsUD(b{&_f?P>dM zbo1rfw;xzv^~}ZoVCTX=+nshp;Oc320NA$bj%#;nwfGMOtL0f>7});!d8W4Jv%qjP zeadHn5p^5eY0tC3NU%2Zc2UdC>$AXUaQQ4S2Ck1|o0&KVf*o7=EN~E9JyUCTwf3SppRPGOayUS+&1a2K57~3;b7ayS%T_2 z;FTzec?8&J0d;-cvqyr}bH6fy zAIE`>dkKS2KaPj1XJ4NH_E|tZeLE3sENzK>64+SN$#1Tc!TPDEPp5$GlYMtga{auQ ztw!zr$U0*>73>&u-~KLGEzbhl)NH>pwe44>HlKU@ba3wJiTOP=^~C%>SnV`Q+MNMT zJNqfuuY49*k_5)|bHKB(p2bOEI{ZGL9Yx^;^+}Qs4_6xvsQQJnFKIc-ai!Y?kbH-1>&YiW-85dJu zLh*3SKdbH5=B7K*G1}3$S|j=`~>Es5|D%snrtmTCg$0e_8YN>pHmmRb3zZbv;;JANz3w z*tnMz=g_a<>N$sQ1bYstr*AibjioKIZw4D{dVLPv0@hDGeYzEFpX|G1lI!O>xn|C_ zb;fiX*fD0m-wsyGIiyX^_SpxnnfW}2?f~apNX%cOsVC;0V72nQio4)xXFuiomFLh> z^*O|Fs=KlEf@eS716T9&d4IEVAK1h1uC(1td4b}1#pbx5I(z!JwawZ+{Q&jvDIWIW z54GJoGmxVQcaR?j=< z<6t$9XiwA{)6%UyS!>>p;`dao`P@2~l{Eg-XvQ>#ZS-;8{zk3M`>kv7cW^HfsQZ1f z``{noM<|ZdvDr>d-;D7Yuw%{`p9MQcb^Yb}vq`Rnb7-CR&w*{9ef2z8Eqhg)n(LSK zbuHxX597Hf67MDO6XegIzk3<3mS=6p`cJs)c5FTNSKw;yyZrgGSK;a}(;(Wv;Oc7W z?`v|3Hs|1GY_Efxf2QsYH1+trS^MOD!hXGlrk;HN2D=Z{lkaV?v9!hS9k71d;`c7t zzG-tEUZhqNzek;O=6$epXze-kp*6+BIsUk|TW5|x0UIOd%%}QLa?Z#8;{sOFzdVIbF>yth9m3AgfU7rE;^=q(t&INDMY97&g)f!XPt<6+x<$2Um zYvp;=iDpb=*hU}cvNyH1oJW1Yo=58W^PV$<^XEMspY7E2%^3TF%Q4OZcZ}-#%X1#N zKF+Ik+Rs|I&pgfsSIc>1Y&F+3Ywr4#=aJ`A;?0h)=Sbqs0ar^rZECKG*NQp8x%MZ< zTxjZvF*jJP{Qh+wc-lEmxqkL5-@h(R0%Iaq^YfoPcll?+<=TAi`X<;|#_`XG%Y8QL z!nPpz0&3f6)5kw!uAcrb1TL=&3&YjQF{{OYk=j4!!J=@r+`kqFdwBoSwirdtwG$`K zlHl^1wG>>fyk;#8FZ;F(T&=ujEelsKuUY-z>g6?SIk-8r<$AO{xOvT50ZlzVE7m^c zHESg_^<0Zq274V)&$_PyHkP*dtqRspTl`i7+c#~lkAJ3L&ApI$v)1OH@6R=Cb+B`4 z?KNyo>a{2ywq3inTW8MK0UIN0w=P&M*D(1S6k{1%oVM$MU5m6`AFh^l-w^EKx@+5j zvN^>#;>6h)Y@F~-;Pxr^-%Y{ZfA!NAzsG+XHNSZM##;b8XxU?6s!+yk&2=y8e4o%l)$oj%^?C`_$$zmUd(Lj=wM1 zxv+1xmFw?1xaVDe>x|*sV8@X4-VdynYnnDS+vhxT&!_MEgL8dO%pqv%iFp86&2uO1 zy5MPNKjr$FC)f35itGAtY`Lxv1Ix|lb$ui_*Yy!#x!3hE*hYabp|*`S@AXViH5#nV z!#}5DoH1~9`(r$L`goh&kz0X@EEXqVonDe(`$_9=dob-vHB&% z(9d)9IJmaFzZ?%%E6Xr^9fLWvJ4eo!@*Y>Z7D^B0|3XH!)yM6fgecK=Z?wNUOY)=2~JNvT$we9_TWz(MNZ~a>v zRQ%nDGur!i@?~rbfo<=#DIWg)>RFe?YV6!CUSPkUX!Vymdty!E>0jP6)YZ$ON4?Kdg7dvEiC z>$gRNZ&h&pw<);(+ZEiu_iu-qXI?gh+plt7HbPU+JO9RDwUsEYn|)Txylo0r%e-v{ zR&$@|dCh?xXd>Yu9oL$^KA=HKIcSk zEayZ2K7F+5ah^XQ!EFK_uUR>!b2+!$WFy$0_BRRrLM z&vjF-kNMn3yVZ90m^gcEHEe5AJibNA9$US}t5B~&agVJe*xafYq|c?6X?d;M-ue?6Lj8YULgq z0(UN46UQVMJ0AVB=3QXdTpw-vI4A1KHw;|n8xB`1_t;2y@;N7RV>uuCC*NqW`Sj7I zk8`S?d>BE$O&`aoo_y26 zY8k_^V8@j;lO*!j{wd*TeRdqN*=`Z(w6 z$@fEWneR-v+JM@}d)1G?$>*HQjpcmnpM2+l&8LqxeOxp3s=KC>R?flxud>4R| z&oz@9%k|Pf`F;vEpFZ03an03}?_zM7?`LqeOKKnUT?S4**IaI_%c=EGzAM1y(?^>= z?iuyuyBh2qXHWbb>^{jkCf6tazW_T&xffppR%h%m?Or3qxkhY*Z4kv{TS~4G z+tqk$>g_3BBX*$9HR3j6c&>%tS#ZzEy9=)0y$ybU!S#Qj;QIfe!5=KR{tp*i|3@4A zv4ZRWc)|65vcaD&xc<)+T>s}9{Dp$+|IdQ!|7wH3R&f2_D!Be{H~6~+*Z;$U>;G|s ze_C+;zbLr=Uo|+(*}Z=HcNSd#J`LWt;QG&AaQ){jxPPzjJT=exbvyapN1k8V(|3T? zbItuVSS{y(drU3dE(8 zaGCFSaJ2!okJqH%gOkraEH{?>SO4VuBiMZUXw%1YKt1^$0+;#z1XnAsxsSk;&vQU- zEcd_u$@gcl`Sj7IkLQqj^8E!|=KCvL?ULHZ@jU@fKF=Y!u{?kDPrj$X=F>-;KAwZ> z$@e#KneQKPwZGRs=6e>Le4c}HV|o7RpM1}Q&8LqxeV(RPPretyWxki;YA@A3=6eO4 ze4fK{V|o7SpM3uUn@=BY`gjdcPrlc|WxhAzYH!p&=KD7|`Md_mjpg~TfAYNpHlIG) z^zj;^o_z0t%X}Ze)!wgt%=ZyE`Mie6jpg-2|K$4wY(9Oo>Eks>J^4NZm-#-2tIb;b znD0w)@_hl88|y1-{gdx&u=(`Srq8F;>dDuOYe<=|1Fkj`MIZC^1}C4_FuAe3e(9fl zGlR{ik2ZZ;*FbRc%>pj-%?4NV-yurAIl#&1HBfFWuYdX{-&|nx>7z{_uc7M6_YLr! zj5pWFdEs6+y+-OU*C+n-fxTwr8DM_6TI>seJ;!7JCR{D{1;L(^u`dKyi+y46(}jHz zxLQ8*T@-9ir#g9PIg$+)KdKVqX&M{*HYqxY}Ui40N9&`h=ec16uv+$keO8PAMqsr(H*5@6E1w%Sg*z9{ zsbi9h9gqGwuQvyKUhAVxALm3p`L+O;`L=|smCp@Z!;{ZBksHhT&_DSGg3YIoHhr8^ z_2kk#D9CRG45xM{hVKbR_Sb)hZFh?O&9y_WpLyK3d(?LKv^aZuZ*2QfJocev zPw!jfy{NxUaZm40ojtraG0Hu?U%}m@2NYbtp#>if9#Qkm_dam*lzVhvH1+J!Z-dpc zN9}`J=5l|qTK4D=uv)oCyWoz^JzyW@V*96m_RKJ_dqy8^`Zz}Q3}IV<;tSGOWf2P!FfLCL^h{CS!?FuF1rLyC#zh zuHV#x9}1pU^Q_4@xOvJo8IPu(HJJcb%bM5+wan4MV708tB(Pe!CR5;!%{jJ@a zKWlOb*fr5dn?8ms zu7Nmfa4@#16c7K++pNLl8c(F2LU9caq0SndL5!?{bADFA)z7YZ`u794amqRVA)0#T z_)M^xb8NqTZvGM6zBmWwkc*A4f9C8Quydx5Hht`)dgkn0u-XG$JG`Hq4^}&m5}zM~ z^+}(80#+MD@!sHkT>!SNHs@2G`SiPn!zmvAd%>B{X*G5}52HAr-=TIsoxe+ok@@s{ zt;=hk`MU^iyK??6MpMt8y9BJ}d#c~xu8jZB;Od#r%fR-<`7x(lY(9ORPseZt*zex- z(dIbSGETp@^Y7^Q@ZUhrIFGEc<2;JuIFF&uIIkr}#<>jobv4g8uZG*M9Ouu`)HBXs zfYmb2rSZQ8uAXuJ5^P@_n>poT^Xcn29mDltzsJ@`o8wf=IK77)Pw|*e$vBU#vEw|B z;y6#B&Ny!+M#ky={q~w?oHxR4SB~>0H1&-0X0TeuxhMX&z|}L(+rY=7J2rF5#pcu3 zaXN-Oz&?ZMqs?)uWt@ILa|*@dL`ueaQjHzw$rQ(VDs{$rFEKJszbm`H<{9T*aNCvR z{0*9V#(6hbE#q7p|9jx-8Rvaq`{LNlDHoehU&rYfehc1^S|4qWQ!V54Gv@D6JibfG zI8Upw<2;?>IKNMwaXv(hjB^w8hijg3{vK|-a-4raQ_nd62v*BDH^%=#xO&FWuRVVq~0Kqd!&i zjPo(L?aFcf1x-EU{3}>3>4}Hb107UJnD?|d17RozEi$f^NjN!aNCvRdI)-ab8qo$9XZuasG@t54VaKKPvZa$d`Q@CBNBp8386tL0hWIahNJ z_}ut4SS|a80qfH<8gnIJL0WR~+30FJ6*NpREZg}#!C*;O*Kj@!)-vFCW zA8q=$r__^gK5&_Dez@8tMZRyslg~XRHEoVMPrgOKWxhq>YM%G{ z_};NNJo(&{a$~t4^-sPf!RFIPn?CMo_2gR`T;^K_uJ%%quOB@5+|zPnxu5k=o)hZHw-VSrl+R37hO5QC3fMJ|eO0hpK2Kf^Y#VjYn`MagEwJa3=Z!h#`X%P- zVAnM<*8r=GVf?f4DyC@!0}gw%HPH8~^ST+iV5bNBy{3+Zt>v zZT4NBzAsCgTPPkkQtZ2Pc~gOJ2HW>rsqKetwjqW-H%QzZ7ClUV-U56zq8i1 zJ!MCVam4mRU%7hX?gTbp;_eJr8%#0ouGAjJ)wT;|cZzYu#?@D@p16B}?Qi&=aPv4v zj%P2p?bP%4gzpWuowocP!TW&O9<6st{q-@Yx;gFN*LaAX193UmchJ_Ooa@`*nfKel zw*57A`nn%+^vRs;4_C{a902xkPP7f745b)HT+WGl;tm6wFL8&%)v|^o!5+rdHi9ym zVq9^#hU$qs25f&bw+F)Qt9pD60-HN?Jr=H?dggi@xSVT!5_3G*nEKccx&5-wnSbY{ zoPW=c-%vct^Yl)*^Y1x(7sWVtQ~M02b_j8N)(D?gbH`%LNpRcw=fvcb;c5p{26NX} zn<6es&dsT4`fE?TL&5gR>#n)wV)N?ny}_7=fxYhNqb=0}9uzk*T z<4CxE>hU?M_W3pAnhrjeqIL}Bs=5y+)cWz%$5H&di|pHpVApOniv2XczOI$FoD=%q zNAW1vW3BL&L+-5E=hO4!%){YipnM z`dah{8 zx#E550gA_ODLFrW2lo8)??F?K&%L!z*~k0P)Z=r1?Nj#gw`l6= z$M3-Qu^+|u+GBg5u$f<9*V?iE9_$$OaXsYadi)U|k8(Z!0Czneq|Wu~LE3q}^1Kv3 zLdo8F6l|ODKg0DotM0>NV13l>gFJokTK6!;;~`4+#Gku1o^Qg~DcjeeJJf*Oojlft&q(8BIMt|Ezt={=R~y9-mihpR&LI zLQ_wlUIXX+vAy=#UN3Cs*Vq2KHrjIDz5#X&x3V5SkG~04+m`Y%{{N=-@L5jVTNE|- zh&XZH2D^4y^LN0`L+tO?_B_|T2UknUHS&El+iFkS55UIG{pLfke(Lf02%P-xtB>K1 zE9c`UV13lnhfl%kDLzwrUVMgT4(;*%9PAiVrq{k-plP#>^Xr(^{IkB9C+qa{OR#Hj zdp+M@fz<|6oNuPNbvWPJzNV---{QpSg_iN!=b7N;e0S9L^uH6XmXi7Ijb>ZziQNZm z?9AQFaQmm8HRubrt+uqA1?W`paao_@^^R!_+q%zVxJb>D zZ(g`DGB5MNjT8Fwu zAK&07HTbCwetLsn*x(m8_@xbgMT1}8;5Rn-Ee(Eq&2!KH7Th%|pLJG8Q;*LYwNLr% zuqK+i?-1U@*8*R~O5CyM#SiM=VfIsVPi)ZOduPkH?NgPZ-`LOVr&_iu|cFYf29YX7qD zTcfG#@BWtOTpbAZJkjP}mv6ufdtKZH?6uK8na8&Jr0uq1O8UATIAb%Oyye53EK8j2 z;l_#oAaKT}zg(Zh-vMmS`0ohT-?8a0*T-vy^Y2_c=kXs5PJa?}XEgQr>{9!b^R+9Q zde(Y3upiGFTx)H+Q^rutFHY>ez|H)7qp90}uO;&M?+ecO(%)~Rsq62xMjrqD z!TOhbc?g=i{$7jZiPZ(pS|0$GXRU{VU2FSf9^2}Zw!^^Ml6yEfV>6drpZJde8z=rF z!5N$Wa(&`I3T)2!j|OLK`pflkt(|}8+BuK^LEyws%&}@m+KS%!@=f^|98L{oBncr%DHyV%k#|hP40EqwK#%0@s0#1e{vp$rXHW8 zYoGGGI|fZX=iPL$?bJQ*j-&SQywi3pMA8f9KjckN-K~^d~XTMN^N@d9_bD zU+1H#XRUt>ww=0beF3$HYpv}kl^p{d*d3#sMtzXY7|rN2KzQ`i4u zYI*!G1M6QtuUw9%uK%Uf^2E9loVC6JEYDhB1$M3NlX+~bPugA$)|T8q2WM>NlIs)y zUx1Ah|7*Y*oBncr;(smJobmr9IAhaau8(W&{5#jqdHinxCw^l73QgVi*Hg>me-k+U zkN?eR>iXYEEsy`L;PfZ{x1p))e+#udwmZO?>)XNd%=NFq&b56qk8Sly+dIM9lKU=j z#%3%U9E_20e0_bRyl`xIRN z{Tlp$g6luD=AH-cwc~iVcVG9x_5j>H={?{nu*c`sQZ4;SxSs|8p4#`5KTy-O`Xe>} zuO8$-gsvW}{TTJ^)PJF#gZi)3b5cJ}Js0&8 z)Se^e&-pikM4m?(gWPk~KI>~A8Mct30ulB^%R>pM?B<@?_GVZ_OW!$&n#`QZoeYGd9 zwlc1JD%bS)z{V|~4cFo454;2u)pouZwc$a9R952K)OX<7i8qPr>Fb z-}^p8Q#X#+Q+fQq0Gqe;{}N4If3LUl98WIumd|m$(A16Nby^<(4zPJk z|4uY@{k@LMleah6yvEU%&wcxVoeTS=k8QnfsF!Qwd7j*}U~8_;tZ3@C_nsk-|LoxA z+RTBbuD|ybdHOmh*xxG|M_b~|4Q{T@JZS31@m?g4|GePl+RTThuD|yxdGgK=Hm`BC zCC)d&&9zw&P2D)&w zIUkqAW?%L7-YSo6X|Vm$=6zOfA3Xn;0eelcjke@cFLQZ)PrT)@C09SNJhm0U$>lv; zo?I(}?<1FOv?Z5%nag`f;;oF$T;Z$0ji2wKR)y=Mp5NlE2JVFqVJhv(qh99m9+kMO zV=MEl0XNTdPDJNvO}IYlX|opCHu-LAZMfRO^}W}2>%fhZ`_j5_{nRst^}xp0mcFW$ zef2(?yc=ROuf9G9$@9I>M&JjqsmFg4aMr}emz zd|QD1o=M%9TT&ZGycMZZPZE3#~IPG@?%ad;~*s-b`b7yMfhH7g-xp{_C>z}?11KSsUw52cVWnX;eOYG6u+$X-5iSu4IfH-eb zJYJ#Xz3kNj|EtEoqJFKwuh-aT**7RYU%o}1@3amgkGAl!4SrpN-&k;;*Ke)4<1<#i zlQWLkvH3hb4sL#*&5rrQp$<+3F z3boJXQ>lG6KZJT#>O-l0HlId4JN04IKARs-?fA{-8rToHdDDNt#}}vnrJwzZUpY?O zlz#R*e%hRaWyyauy6cheU5|llS5Hp0GL~ac`(webZQ36Px4nAusU=pkU(R1*od7mg z+R4+-v6X#rzT=lQbv!4bJD#+Ym+f4ikwKBGQFYV6+mt#H)ZhQ5NMJ@h60+;hC zFJrr(<9iOcjD0TL*y@R`7XS0W{!y~61dm4wD}oaO}{*+TnaXpw#2y%oZRlu%i+egjr(x>!a=(Tt}^z_BVkue~$BJ_*hEX-vZW0-S#(9tEK&IU}MT%v)jSt zn%x0c(=Tm)4K_~N+zBq%>@K*Pep$2MfQ_Zie%wl}mKb+~)so{LaQfxA?uDB(>vf z#r6JxI``Noh^H-|nf{~T-oIZcxcAss3U0eM3a_y9Q*MI+_^VS_Rynf>bYnB8SM2--Rp~S9s?UoTVnqOY%KShK7WPlr|zDR z+aLRt{7-_L`JX~l&z}7oSnX*_eiQX~uzk|zdEx$0OJAM=8#n)c^RsX@i--H#eVj2r zhi;5qKc5HNM&0=CH?{QpMX>W&&f809>go5(V70Q}|AgCbZN_!qs-@qrf{mMg{|l~W z@o4t@HFRU7->-vhqi%f912yBjkKP2kkMie@{|#4ri=w~hiJJai*WLv?c5R*`^4Q)7 z8(*8}i#&Ng1RG16=Z@TeBg&W`fnTOJp6#^j=Q*h@@jnKeJNy%{K3RiL!Ob=J3{5?s zmwXOZOUa)J`U1_lT#aHLW9w@_%&9$N`3mfu<==mEBGta8=97y(|lmh zC-vOB=LZ{0+jOo)-Uk-|+XrpA$9)rQ-#wx&SZj_w+CsHf-uD(pv%UV>jqf#1-F0+5 zGe3)ibDnr#kjJ(p*fn!ry+_D1{-wdqIa&ryU4QQ(^7!`yH|J|PGi1Rjt5( z+^5>S-^e%Mt#AOg6~S*(+h6--F5BzpIJG-Y_j2>kHGV`pkB2DU>%BjINYVdeYVYBz z&~8;qdCy$4!Pl#K=4v&#aqePGr?cj3z|~f#I0oaX#eW^J{_YFUk9FZ|Q`Gf0pIZDk z1nZygKQ@884;H3q+nADAn}Ro>=;K~Aet)p~=GMfw|7wZ91=yV7TY~kGJD#n;jv;@} zZfmfbeztYq)$&|r&QB>G=q-};+RE&e-$_4oXA9J|2PoV&!>6|C+&XHE71XHB&4PBFgy*OvHu zg3TGe7g!&;bG*z?hdajM5z_#^>HoDf#7i~X~<7)yqH}UsIfS=h(qG?=w;7onRc!&U@x#e5>({`IrD#Yw7I}-Sc5v z?U|2>V6S89nU90P<}K%A5}JC(IT>tQk7!eB&0$2FT5IKe9D-(h{k0q0wKAu+jO$Ra zTK35_xSFN8Puyd=AI5*ozaB+@=UFZD+<~!=4ji4-+26gv&hyOF<~P<6{73y1_Ky5W z{-fsij(J8p3a&nD(e7xt?M|%Q9RpV@+f9e7xBnib_P^11EZlh7?6*Aqo{e~OQ9Nd+ zw%>iJ=cuuNU-Fz3$1pdwd&NC+0x@!q?#3dVUU2pA7u@}JPQksOU0Cod!B^GX^)j~K zIs19fiC}YE`|o3(OnnN)L;I<<-8%F8U9d5(W1f81JMI5#;@(mk2!bdKyShBP23O*n zZxU}oG@^+{A!^*B|A#4XU^1sp*QxI5su~6Y6UNy~?~Lq=PO-#>Y31-T?A|BVGFvR` za!+hE&i5)T=lJs@cO4ePm~We$Hvdf+uMh0iZP=drHi~)p+{NL=VXwk;cyrrd9RK^S zkDU)koBuk@=Pdmq`zg!^PjCNm^oz!y!?=0Yy@YX2M@wsG{ECZ*Rlm z$=mekYc^kpHSocW<}FO)fBwAm+Ry?00`0YYzLnDjszDfAXVItU5~C`fP8r6U~$rK2>Z z2q;|;L5j5h^Stj}lQZ`#e!u_Kle5;^`|N$%E$=&bhK}i$n7*odRWnw7tKDX-TF30w zbSPD2y(;xgRi73gFmUIAD^Hp{Y~?l9{JxH}RvlI?Tfb`hsyDckGPY~% zeCXuS2M*V-Z{at3+|V&ohLsMz@hJNscUYT_88dz;bsu_J53?FSV#K83lPi?ztA5zV z4L@jbmwwAmS#^E>KV;SQv2|86W1HsNSavq2Pn#-1ZR||Jm3sX<)PiM6VeA>ACRExtmA3JR4$rH!# zKYXX*BcQGMRri?Iws*A@yxSMthySU0OdicbPfYu^?*16nHD<)%gGLXVJj%Y!UM+{# z9fJm4!~WOFt!KO2jc&Cj-8_zO8S3`+hFp?&(guJK!Q z-KW~19e3d9aRVlH4QowztH0_VWq&t<(}&u(y}#5vMvogd{9tOws^)yRt`~^WyuP%w zL#An7wOSe%1ozcu@M$^z>qzUq(C=cbn-C*o-4vX$ZqbgtQ`fMbV^#Mk$GR1qe$>A0 z{;GLQ8*68!=2*veO>T`-?l=z~gTUd{R?Tq^Ws`(^U7ScKog3}F<#d3mH4g)+r{({z z^Du2p#XM|7jLgHf;PyQ9uC{N--g<1;$kwI8KB#$=bFd?vKD7L_>8Iu~Z4TO+b1<## zY}KytwEeHWPfv=z?@asjeHU>0zI!|Freh|I>SEPfeNyw7mcMtkC!G8(KW+A1&7;f4 z)LsMjp^o2w?PszU{oLDltymq^52&-(2DjsGId0hIV@6M~r|mwddz5{(J$u zL&gjrH;meI!<*bRzyI3XX}OF3df!cdjhlHL*^a% z_wat*jx}2~7GC@O*G|?6>mEAJj*44%cOS=q+i^Rq@$I;+$+UlRkFtLUz{$N!7oGQ9 zlY2}?u#LPIWyF}Sk&~!<^8_)4nl^*+`M=%7$lLCweY9=n(G$Jh$9~nJbu8}}|8?-) z5!>VT`k9zqBD-TARmW`K-2dOB+Rr13m`4^dkE>(0w)Fpd$kzHCQ^Y*BhSvvvFV zAI3bPhzMV0{(lg)J*TG@aZfAa{)V^L+#JspWX7B1U z@Gd+C_j#)3QJ$w)z-zzOc`5f8KXLR(Ke2eOs(G#+$OjIegQ9tVJ!J6kVI#R9 zM)UqUZur5id#=~@Yv6VK|NGFUb+*Sf=qlRhT)Z0GKEL}^H-RS&oj82>xMdFbAX4^`w|PV*A;)?dE=ZqVV}6m=A-46UPbD=b3Jw zj_O&k_lDlp4Aq}&fBH3e^tf@uC)QIoZLT}3=WRQ-{aM)0i7&Ldw?JZaRxh@AmzUsH zu9v92#`k82y(*?Z8F%{gGJ1Pl9n~w{{(Y;zfya(McyR09-MtjkKG(f&yLzv@A#UxJ z&gxCujUVQ1p1dcw)Yx-_{Q$%vVT(d{0!AmeT+6~;!v!e)xV6>-T&UzXYk46C+##~vuW%6 zZ!|vJ;NPeE5F|rZU0r{zg5G&O%L8tZ3kxy61$_?9h|&-gUh@> z?9r~X+PA@nwEesD4sX~;_TU}We(>a-3{KvI!DZgVdbI1Tj_AQVs-xkFb38b4P6n58 zPV3RGv-)v^pV{{B?*Ca0`#BAMZrgvg%=0fA_6r;QqPG9)@xQELzoG~4sIG=*Tz7&q zu6w}cxbE-KuCw)BVYxpZZu@tS>yd{4?;HHFwtx4yo^05kZt!Q@{@vqxu3>+n!Cz|o zuaS9prD1=q!C!CtuNnWpH|%dW_`7ZYwc`JehW(=k|G4eHcKrX{uz%j*U$*_%iT~FP z`?n457Z0r0y7BLXm+RA~!TYxTSM`MV{GYjDpS1_)8V1ikSqq$fvL3kHCmZ%?*I8}c z;G4GnyZ6Z!4SW9{yrbF*p1ga4lXo9*nRnkF?K-O=J$Oeo9G*C1z=<;fT*jHyqg`h; zr3de*4u&Vrk>JER23*GZQIB?=)d@X#M|Cp19j8xq2AI#EgS*BJ8$9i^X=im-k2amv zISqbUgJ03$*Ejf$4Sq+1-__s`Hu%F0{&<5w+2GGN_=^qx*9L#1!QX4}4;uW_2LG%F z@2LI*&-#1|F4w15N6+)4qrrQ_@$cTJeH-=}8+_)rfA{sQU&B6ogU`|SUp?pR+ztD@ z4L*O{zx#T&P{Y1RgD=+h@4lWb*|0C&gY#SfZ|}#>>cAeh&g$SEyrVh^?!&Y9^2fj< zYWy5{V0}G#zR~6-I3Mj=ZQcO;u(l}bzF~uJ(%_pnc>f09y}|ct@O>J5 z-v-~W!N)fEga)6~;Kw!i2@QU7gP+#m7dH6C4SrdJU)kU{HTW$JetU!8)q{6bzk?5{ z*XorXw$AFc27j}`|K8vqH~6Ow{zZd-)!^SX_;kH{?w!63K2wADYw+(i_}mRXUxP2w z;EOf*QVqULgRk4*8#MSv4ZcZ(Z{FZrH28o9-=@I_Hu&}pzGH*$)Zn`|_#O?uSA*}< z;QKcCkRF`xe&Hj!+SiCNVm6-Fhzr3JhaWgNpJ6W!ukDY*yCw~`Y0Lj{`H;ajhj&y@ z!-w*Pv7ci<1dkqf;9x$t4sQE*RG(_+;@A3ITHEtkS0`h9t4}K*tWW*j{NVN{Ui&zG zwBf_>=cnWF^13!-gU{T9_pauG`&qvZ*~+<4OEZ6GwPp|h&T8!jU$?XBue8})I;}5Fma0htTkn#SgzmH>KCvv)^zId}>mf*tpjJ^VVW8{i{G4sLymoj=SP+%rFEz9+$)RIO>-dqO(=2A%x014bkn|gvmq4#E|^ctG9aHV(S_=ZhQ=h zH3RzOiCyC+)rQ2Hv5qx($dK^|ciZ~5#yJzVVLVig9Y1dT=wXRCZGL9P-uiy9dpzwq zm?ip<(VVpH7fAZ>{)uxsYiyGy^BqyF)8@8c>^=I^jyoGR`_r?pZQJa%ZS=Si#n^kd za()jR3+3pUr?xgnOLG>@-PY!8X^v=Gf967K&s%npw)R-&#^%q%+k2t3xBD~?b~E@{ zA=b?MytR#;^}pEW!{#{uckSk{ZNs`Iccr1{)gPJL_P*Y1$_RWMlbXj+_Pe#$#pi0x zHZOzy-YfggbMbYw^1Oe$!QW}{_v#q!@7z1958($NGI+}9ag)i=xAh(q=jy=mL%YUo zJ?=oN$)m@Q^Nelx=i8Ql8~0*kx34Lk)ePWi*MQ#Dtnk)e8#a7G`@NRVsvlbGyET3Y z>DcCjGiTt=YJPAzjs+WhH8|f8@&b-+JFC?j_BDHO-pPRbvrhAD1|Bv-+^5HUQ2QSBQLl53j-3-qhJqphFf8WEevwFP2 zpJ?!>8~m9byrcRPJY#(sJob>mewEvr>sNdD@;yDAOU=ZL_Z_%DrFUKa0X~SABfN<^ z7vI3+H$4~9gPB47<`EY^k65(Dr~Uk4X?UJpmIJ#e##<3Qtj4Q=^ZYUtoOwE=8+TSG z>(l+dLuYjgyqxdTdhm|wjH2zO;PU=`Sr6aN>WUtm?-Ai6Mz+UyO~ZCQJo9^7%Wtr> zHKr%w?7h~!Jk_IJXZ1`E&N{&}{x`wxn7ym_!R_z#Tg%pp^+Aueoz*|#tgFpidB26{ zGiYyaX5}+QANa_LUBgDVZ{MwWv!a!AH*dR5_c&IC)1>9QTElmZ9=xMk8=m>t7+mhR zO&h+u!Tsrl>%TX6XpM(}v$w{9GnUEVX=CZE4u_ZhKE7?Q``x?xrQG)w{9#3FZaS-r z8f`A=!FfJ|w|}<5KImcVtgh<8JE~v7GuB^&>09@lJ<)CBJ_2s9ZSU$8aO>x1ynD(` zy)~!rpiLVGKVO1#-VJWwUEBNa^Bz8()t5bZ@9JxKJ8quac~atmrTN_52d&-bj%rqL z_T22?A@v@g6FjXy9o4+>?El4j*gC5v8hoh+U$wzk@4-8&4dJ8fwHYAxdAH`<6utx4 zBcHj59Abao<{|#F4O{q&0{ind4}Dq>s5SQIUmgRvUM&sgwhF3vU#A5&mI(hR0-sXgQww}rfln{+ zj|+T8fzK?kpB3Bv>1=&YEce>Y*xYOFy~wi$+-G?An%L)Qv7aS9#J3mtjso9VU_Wcd z|Dggu(v3S?pEqa1$!BlRoqVqJJn>L_w)SsooFYBWG5yMOENvZ^ZT(CY&GS;t&ppxn ztf)3;p_y9EIfx&RGA(VvLi3!~Z_z^I65G<2EHo}rEp6FCbNselvC!bLctd zSmn8%h+P|XpCdiQ{R%u=foCtU&zbR`ufPiyc%cF>R^TNHykvowD)7<;UZ%i4M<%b& zkikb3_{ahuRp8?bd_sXwF7PP@{&9iNEbvbX{L=!TRp7G=>~m@Qc};q0f$uEv zT?M|k!1ovUfdW5R;D-wQaDm?_u+OjQgU^w{^Ay-;$mk0cc;NysQsBi4yks}-tb9f+ z_om#vIUU7)C(qs#d(Bbb5$xeLU{|o$0Bv*7(zc7?<26J)7e3x67NvMB3iq_PsLzR) zr;fTqSC=nL1k>oV82_3>p0@hh#_P12w#B#~dX2VybTzN3#+jz|sk}egCYmwK>3p>N z%kwx`U2Se`-m4a+EKJ^|sP$7b$I{el#{V!V~9^;I|C zD%5Jmv#s&Gw z)7C|;&AdaX<+k0IqJ1QF+KvL-R!!UJ+GgARz;fH_r+qwi+D-u5R?U5LKy6FziEuUB z>ubz|sI!-%9gdd$8f_|C#vJWhpBU(SbTZsPY#w2WEJ zF<(ZVF<%aL%xdn}E2sz5#r0BmoL5q7GoNkTBiB;vnJsX2!;Q>z)rwzgRb`}e>e%dtYXowv3bZ;9Hr5Vm}`urRUwZa}+5 z-To{~ZQr%6Uvs}FP)n}mYp(x_H8w{2-yex9J}X8+7Bx1qig%hwg32yCveA*_S2DkhJw!s z_a10}X9Mf&IV@kI<^yVf$F%}l^2=9&C%=3kd^T#^?^3rPRP$jq_xhs!pqh8p{G^(D z9Y}xAL;H@6s{gV~l>NJ+wtH@F?c{OjFCWz6M{gW{K-<1a_)%@X@ruln=jzdLwG_{T zsc`q9uJJn-Vy=|v$Dx@sC3#LoBl@P{KW_0&Hch)T;A$!HJFDGpllYwtS4)ZC`E9?A z;`ej7T1xyLS3B>#jl!RRZ#d&T-ShJ#{Q3c}Z29owzg zGXB)b_c6937CK{Tx%;Cxo71_KyHDrgAFo5M?-pR!*ZEKT0cZ=Zyxscg-&Sz7l=y9n zw$mNkchB!YxLQj52BB>@;|bmCzav~NC4M`j9k|PL-SfK(TrDMjyQ5t{psRcS_JFIU z#BT`NTh}ku?Kc#zmJ+`)Xy>0dU-$Ztg{!5^$Ju)$+`Zn5QXZTt%wl^kZ^FkzU$2F7 zzpL_auI~ps*Itj^^N+zbGxaU|;}GMk+g|=et=ay`8dJ6I)qXG4#tXH+j}n(f`~RO( z#`r&BpB4Ph!tb~2+n=bN3pM*L_j?O9=h=Pu3Y`CU@59$5OrGuEsD15k#_snV&WG)F z{TKguo%24o2@~mhc%QTVrf}z0J?pv!c-j5OZJ+i#!u_1TB3I7=)ce764T{edXftC= zjDbgxo(Pj1Og#5tgOkHb0dN3l(RZ!{eG+Gn|+DLp*D-D`f9v=83ryce&< z{A6G2=l=Wx#e0r1?86^uXD#=+&vy$-{(8aH-)?Z2I6n+ zy943(WApuiaBJTm2xq!l?+%1p`|d!v{rCNWaQox?1K~cC`2Ik+{=PpDuD|aOgj@Um zK)8Ezvw~la-S-G$_a5u}1L4-bLr`+xAqaOozC#dhe|(1^-1xpj5bpf>4ner}z6ICr zI|QZOcL>6L_VpctaBJTq2zPvbzZmW_n(q>X+dtnW2zS1Gmmu8QcL~Cs58o#UxAvWa zlKW0UxbxvV1>xrNoq}-Z!*>e8t$n8;-0}NfLAbT=6@+W|y@HbaUO~xyx1i*{TTpV} zF9>%&eaE2Wi#E9L7?gJ3Gbp+58kF4k4Z^L5Hn{H{#O^bp?;eCZU%q<~?)v!dLAbT= z9)$aheQCjM@B0U_+urvN!u>qtcg5k>zJpM5-$4l1-|vvaeMa{^gmCluE<(8Zd>0|y z`So3daO*b&kF?=5(-2VApbNF>|zc&uo?)SpsKI8lTLAd?* z9fWZE?>h+L*1m%fZhw6bA>4Y?g43a#`j_0C+JDy7l?)BO4e&g@;{fdGc&-W5yxAwh+aP#{eak#bbCY0Rw6T-bu z`i?@l?frf?+|NM1pAc^UeK#T8{(o6;^{*S;4{-6f_ML>1`(8r0`Tb5g+}igO!nOO| za>;#1q2#`!5N_=|3gPzOcND_yzwao7Tlt$y0|^O;DSb71`U!D`0Om_C5352BxbxA+gRn(cii zl4lP83HF(|oWqad>hbvm+??l6(bO|<{|5Ukt)9963~VfIiS;?yeC3|_0s6yZ5#E94=p%^ZNj73xlUn+eTZ?=S9HUJZ$Ily;{b- zC|E7yUJR_}xIf2#39yI#*0#7div1Ql-i$*%ahC!c*BGl(dwj*GGj%z)nrdlk(p1Y( z`&nvP>Q3tAsM!kD^3-nM6{z`twIcsGmn%_o+o@KjcFtCz_UCcmr?y|l&3vu_&V2gW zM4tIv3!M2}6D)T=mm=2MU_X!AMw@fD8nwFE&oMcd)&-l_+WoLT^#&9V=V!y(Zk_qr z2yBd;OB;jLaxTf&qZrHB;0TAH@Tnj&22wyZ=Lr2!M4x2GytrY zb4i<;?K3v}VLqyAYyNRA%IozuaCNWOm*KN5Sk3-yMJ+epKx+GA?Obh7y#vKV`*yY6 zI{9`68>7s(3tZj!J5kHUyHf8+ajfo@-NBxB+Wc%N&;4l+ZTQ&UcG~sZlUkcG9LwHd z^K09STJAo%0^1M3*HGI=n?8f6)$PB}s6Pa&<$5y!|G{u|{r91ki}$6@zUl%ySJuwe zQ0ie659exlZMV+ajsP1Y`)VXuE&ED7gkmgXi)}lAn4`hoFQ(FO`TlUV{U{mB7_ei> zS`5H%EL{EAy4^UiZPgvqC~CFzaRS&rY8y{2UzfHWTnr8X_n~g-b-yN}si&Wlz{X5J zCxg}WOFp&u9|(4i!w&-6{w#7XN&gQ9>!Ti@L%?O5Lu;Nkhr#txKe3K;IM`U)W@h&p z`v|btIDgKr-S4aYUfO<6fonIX*SRCX&P(`FHFxek&yR+0Mp4(t_*22^>Gv_<^jrI} zaPyo_i~;cD!1}1C&5yv&N7nCnuzu<@(=+3o0CpUkQMAuoP2bW_taY!M_C>$+_aw0W zbzF{DuD^TNeeC|T&UjA-JN{gkP64asx};6b_Bl7)$L717{HN+mxtWd{^D?y4;Ogez zidt@auQ}$owmnsKI{)aCz3rO(7_R;+e7v5V0ao)I^`0mnNZFoZJZp2ENuBffC$-Jm z^Y|?4vnd|-<(%4Xow@iK*cdsF&jqXHJeL2IVl4BD)AoF@ZL(3>oTzY%09Uqtd@PEP0jY1d*>MIPL7G zTtD-yN^L)vp|+nsms}6dv&VH{xi+8WZUpDq;|8$Yd&%y8EqhCT3&mK*7N_l9VB0z;eqVAo*uG_N z`SXn5z}3goANRyPV709GyC;@O29V=@xO)2e0oZox#(alb%^2SI zKLi^y-z9iXeFRsJ&p*MoD}6qOs}HK@<6mIgsYm++oS&gb`&4`VoZ>Zn0QvrnmTS0i zY^R_7{Rg%7^yM?Kn)}FkvA>_g)#LL;?Nj#mOEmS{>96O)f55g=_jBae)E?eUVx=Fg1O zl4D-5S~=eN;Og<2zxFBnu>hKSo@EyV+Yg^*ZLdAHg$kQ~o*#MUSp=@#pNZQ)e}<)& z+>3#m{aYMOJw8j+K4t%wL{m>6mIB+qWhu7TZoWmSwdGt}2CSBL%Yrj5ZTbA+&(gG| z-SS|yv|9n3eA>KDn9rZNX-m76z>YcXRtBe?wzTtSbK27G`(X2huL{;De6^bYi1Wv5 z$m(!?)Z?=T*#3mCS@X163$BlP)@yCBv9!f+9k9>7+NRd|)&<)~ZHd1g*s&(o`e6Ok z?J8ld%mNw_upIfRK!_Og`fV~$c=B99cvVS%MH?O&yqp8Pd zi`u8$V_TxBXFUDEwo}jC3;>%?TVibmK9By`uk>kauzKci8?aidJ#*^yb6a@YIZnBL zK2PLYZk=%t#OAnj{oM|p>u-6!Z;!4mpI3JPy9b>+ZRz(Q@XN$2=U_)P_4w=rHplV= z$k=v9Q_no@0=Auc#=9$6-SaEgw%y?N!_WWP^VuhJyE~eF)i3$?06RyHJ^A+pt0&i9 zU^UyP-QM7|b8hAOIk!Hyd7re--2MQYbDQVtec)<&uGXez`#cN!+-5#MZ~qXR^K^4P zPnV$$MpHNcR@mgW_nF!J*0!gr_Qj@8p1)kHE;RLg-W~#0bFIDa%Y7F2Iox>G<{Dc2 zm}?kVo3+oaBdAAGJhYFh?bex#(O_fTNZ+Wc{rE>M&#m&|6k{1%oVNReZ5uwO=2@4q zaMwj$AFpNO!0Oqr4aMMo}`a^D{&8i8`u2Kfn0yb=y>g?b^0|CY(KN! zlfY_OZ*6Mj96H{t*JN-$|0d=XH1)(h5Uh3u{Ytxo;Av++<@%XtRs8JdveeoRL3gdS z9SYWF?K&P#eFVir`;oQXI{i5cY>ceq(O|W#qx>+6v5YNF+o@pNW`2(WJHP7oP44`g z+kV*II_-}I+dgw~99S*$t4*yOoBhZ<{Ro_SO3dTY)D!aru$u3rrQM0}w6mXb{mhg3 zU5;@W)9)ot#g^|SP65lc`Mt#HU}G8QG_c&yj=m@TWAJg*w$Y}~$<*rNGpMt6XM&v{ zYuE0l)MrsV?AO_~-8y4E2W*V2-Os>kSv&bpD8@3jIBm}b+cs-=9@xI++Oi~h&xfnW z=jU?f#kTfeu8;k*uja5$j$eSyk+rx0td{lFre^z$-@ay@E(B+t67!d6>WO&~Sj{n~ z-No>zFTVn- zWnR5zUkg{){~Bt!pVRweyAJH%YEajHHMN@fdg|<#8^F%Dwfp5J>YFJZj`P>G-8yr3 z3)mRhFSml#vR~vkQjBG6v2E?w?O^+oSa*PpmA!E%*u9~ykNf8?u)5!+8{=-Uanv2p zZPaRs`5Uk?!|$oNIs6&;z3>^xp{|cH?*pr+ANPZedkOm?{dfSbo@bEWTRnSgkxK9*3u${gmrho)asOz?fe1p2n7Q;wi9Po9D!{;G7fB zfaRVO{_e{k!KYK(Mw_{wq*l)wJqK2E%*J%DJP%io&kJC`+j76h=S4L2JPW=Aww-#~ z{TXcR<%@QIfvd;oWw5c!XWCcL)D!zvu zPTPNgZEHV1pqA(R!VkfHm_zk^U-%JNUH|u~tMb8~nfTomp-M_nJ+ zU@@?I`ms3JxR)@t^kWIQdhUZug1rx_r*BJvjioKImj)YaYP}!)`w{x7r%%g*?UQ|X zOmh9aZg~y!+GCwDEr-o99!*T=ae25}?t|LYY@h3**D&+Bw^ziL`&nYHgr=UDD}&Yi zU7EC81)O&FQ?6fmA6$_H#`He8I=0*geb-v9&HLb*;M@m&?^^DCa4T$UfqzPE8*S!V zm0Dfwd)c|}uLE{|tiA59N4-A9!+vd0+pRO!4Z+69b$=smlw9}a>r#wmY_V+z5OWi7 z`E#Sq;Ks6Fz7HQU)hr&Kf428Ku&vRIS>7kMfvdZ3ZNDwp80yJ85ZuhW9h!RbZVy(oc%9&M=+3(X znt99n#UQwP^6m&WhI-~>C$Rm|W?%f-+0J15lKYc=-UY7i`6%BNY+LorqgvK&cd-3Q z%ss%y%(I6v_JphFy_>zjwo^CeZq#bVaBhD9Hio|&Y#y&y`@q$c_lIEfh7YcJa_kG& zM?Lq^F0gU5nb+SVP)m-XVEYn2tmbJy9IlUgd`5tc<2>8XkzoDQa~~ZAb{!X~?P)t2 z-F&(B?FZIZJ#(=?*tzicqSI~+Ts`f^f^DnrxQ0-x#eY0lEzbfI!1l-QGqp9J1r9)K z`Lx=!-yND*x3Qh}JPS+$YcuaSYPorR7MKF=Q*)mM4g~At*rtac1a@rYv%tY{^*jq4 z0#?hjz@cE{sOMSWFtE9_*^kN8YWBnP`UtREo&}Bst64l8ljpW=4@c9UXMv-@J`1R4 zO^yZ|uY4Am3fI@eIQpoi%`srxl+Oak!fj)I+vuZ~HphW&Q$7p)2yUD7S0A;E^#rhO zBpIH_3Z1PfPEHFPv3qDHkP);J_~HDspL1;*sLMttV9B1`YdoUwmb`51eR;_S>RG|o&_!e%Y7Eu5!+?pbE$2k&0N2v zR=0fz>vAR7-$~GR1z4`l_E&@T*LD@P+}Qs9_ch>t)V9&4&*jwW;$KncIpbQeb7$>y z#`V-UP&^#-jkVp{-0ta{z{bdP#?4^0JZH$SqZrHB;!+SR{T6JW?7L%<>*qST zX3n*B#`HU|W6XYk1gw^GNSm7NvkzP|^O2@{6r6J*F@KMyo|u0CtCc^icnqF)_EWB3 zc@C{i0&P#AXD>bpb_~|;#iyyCp?KK#+1hTM{`?VajO@iffz`4XIrcV|j;KoA+18{4Tf`3Do`huG&$AMBVj#t*=bQC)xeWxd<$<{CQp)@lC_u-Lo%T z!?gbh?AoRMKjCU=uT3p``D1YQWMcdaO+7I_0jrfi7y1;Qc8*J~U%8i8A(t_|AAEr= z_k+*Da&6uZ{sT6aalQo0y=He|`wDykwQaQN^BJ{z#_$bTt$bel7Owtay`JBJ)%?3G z#`qenmKeS0WHZKeXzGvDF*?9%^VBgMm|Eto6YTsRQ~URZtCe%FW`2KnHRt#AVE2Kw z=l2ZMGg3U9&zWkwb#l!NHb&0xS-@&JzvX=?#xk}zZTo@C^LsXU&Tnlwzx{n$ZE5#C zuv+*WVEd5sV=l1ghkn}PH#bED^O zulo9X!}8etyOXxp=I;>8v(J_WH}}~xXzKbeMJ@NeT*tO7_!DY#7)!gce4bqn>|EG4 z+sgHK&$xeFck7H{d9Y*1dA$NyE&EfOn(ebE-9PF3ir}2{iMbM*dSb2&R&yVw-74_3 zv!8PP%4@~<8HX{EtJU}?*9w2fTCUA&#TwvTEBt+Hxz~!(*wzGJLTwvu-Um2UtF^$| zJbWkHIBUbz?T_)~>F+w=^f%*N7fn4r>w)c~*BoQW^(n{X&&TC+Q@a+{@;Pcg7qxBu zJ@H%%HUjHw?X_SN>P;ygw%x3@Tc>ZEiz&GlYynowwLrcx#aPA`+jdLpttbO(-oaS5 z2K#KC*xPEO*w1aK<@vsAAlUD_)LnnuZwEGpHa{!-J^A)v^~BskOv!s!gTU@%^-GAM zpXca~aBaDF?*vvW%TRnBgE_Q2N6weyv`)^Q#gy#RUBGJD``XlOpEYp4zTwKa4#mIE z18uz{Pu2RJ(6yNpy3KPE`=`dU)R@a)>%YTfKV}2xZ}#}#y|zvIH3!`G*;jMI^~t`H z>!ZK<=c?`B5?7qQ@pUhMYqfp&cVX?1f1_ZI8k^I(17Yl>Uq0KmQ&uz!H2-xx2 zM%z`)hx(#mZJ*O-acU3WY6P|@$m2PW?mPnv2(X@f&DJ7)nDrDiPeawfBAf~I+}X&uK_kr z_V=1_ebl|?*^jlr>h@8bKKlOGaukoHDe2=fHC}>xS&IEyo;qvoe=EIQ`wa{3-rJ<$ z`fb+WTNGUXtqQLHHU;q@^R_Wq z&3&Se^R_A2xv;%sl8YUW{_auFpUuIZL;7gb$2n0?zAeFJz5#Hxd~a^Pt>MY%oXCyk zeCVHi+k(xfk2ZarQ}yKAUQEfH?ErQjoiqLAEg#0}7>nC)T>h5W2;kVkL^wj_d@vI1$WQp!yKqrv;tJoB{&+@x?6JMTYT0A>{oD;dRoDcnzZxq;k`e@U~ zIaN=-{lWGjb2bL-JZ6u{^@;yjurcyo`Z%zf?Z;D3px8cpOsdu)B`?5WAbDEHXG1$WOJR&f1}DELv}qide=Pl21K+%pHF zsb|j|1XjzQu@7pQqeH-I*)xZN)yh3{INY(hCiYP-wtxC(4UYu7hWcpJ$1$oW-&C+# z#&8VSab*qV`snXGA6wg9198^C_nJ1Ncx+6`dA>=FH>BQ_;u>sDoi#X~808wATyWRm zw1VsR;|4#o;QF6caQ)9|@N)~U|1S!z|Ah^HQNi`Utl;`zQSht4SJyoAc>;V>{K`FX zBAR;k#7SVa>Fa5J8&H%e7^wFk|bFQ9z zKLMBdehOFXU;B8kIvbpP&bi!J&bR)__cO5h^wFk|Yo?xj=Yh+7KZmQGU;CKv0&w!V zW^!Y>Uiv5BFTv*1N1Hybxq9+l3@-Cs3Rk#TL0v`5^O$wwCUrX zQBS^Wz|L{@#IL~albmC6ed2#D*g49*_&Ttf?Y$RY54L@-lX891{sypPPWv0dYH5EH z*!Ig)?5|v(wEs2OF{J%1V70Wr6>R&PDYlpEV|%Xyw}G{LjS%M=u@$y~6pyVbxkhYL z<1MMTrFf0ljyl(fJBi`B7Jg5`JtyxkxPA{d_`?O)|B-_0|N91itl;`TS#bTIZt!Od zuK#ld*Z+kEf2rX5zfy4hUu*E!3$Fj)3$Fj$4gPMy_5Vk~_5Y~BKQ6fb|1P-xpEvlI z1=s)Ug6scngR`97>!*Kb!S(Oc;C&0O|I7u~f7XKg_a0}jdCsr9$nQS#{K}rb8?2sd z?r*?qIS1ThYVp4ptd?u;ePFfnn)?9Uz3VyP9+ZpSfBNSd@etT+gg)BzaSy8}-*3TX zzTd&s`qw^QlO6>ppL7z}bFR9g&uNT*lGG7N=&HtW+KIZEUPCl<;a$|Y@(m(m8 z2b)hHZThsXf#Bqu0bJ&r39jaUuOj(o0Vki=K)JEJ{^_55{lMnaN1HxgL)DY-d*FK* zZ?2JZz`bsIjnrSRPyFWud(Fr*z+7;(*yjd&j>kR^TrKu_!Jd<`&j(kFeSYvug?$0I zTE6pL5NuB4+E%-L_varAf$jSs+S_-z{)xRX*z+a17lEtAz9`uJ9s6Q%wL!!mK>WqQ zwoy0d64Xml%(;A>Q?6fPE(LZEC+5;{wb+*dyXRtG7Os|@%Ykj9o}9~r&3SX3Q?6fP zt_XHtCFV+CHQW1~xH8!GzPIQ+$@NM5?}ObZX}>C1E$vqW+unEmY%kZx_CCw44%Y5- zo;c5WJ7U|F;^BXvD$jX4*LVl&T_`^1?M9vFy0wVm{XKlWg8Lk>VZrs=xWP9qxc*xd zT>t(BpMg2us^*SY``U2()v^!lvs(Pu2dm||VFR#Q`P{G(+_`X0 z9g|$_c=XSCy$RU!S|4rtI4A1Kw;8z1w>ey`d~Vnho_x-U+*re80Y(9Oo>EoQL zC*Rg!`;a-?2JAfMIwIF6{@a3$@i24j_l(_y3* z-n+(oQ2&79p8g?q_VAv>DEIU}1$U3`TX6k`6nq$Xc+E54d%?|9?$N!`)U!u_09MN$ zwGV2U%O8T(vPTDl)yh5E1$S)j0sANy+duuYXNH2^Gx})L$1$oW-w3c;t}`RSYL3b4 z)F`my%pQ{KV|(X)bZvJ{#95OrY{MxYLnv93p*7x@dKkqu89|*j8AFV6O(qoFHJMa! z{iYQBAn?I8&zg*do2OipacJsUlks4+tciV4%N!j5R?C`91gn*6G8yjJoMZba7u!Gm zvnB_ET@!t@>EjsHlkX6)TE=iF*l}eIa4+$#3Clvf7@X0k#|Br&3r(A=h(bTgBQ^9Ik1N)$sIXM=r zmNhsItX8hU@o>lHoZ3gZ*#7CCH8>IM8t9`**GGTn`Lx>Z z8i=z72Vk2*@$kQmm^GMG;|bK0DXzhR)LDZwh>%q^J`baIKApeIh>`j9=UP|P zJo9%E+;-*sU5uulJ$DIM&CjX+{B{NWFNLdTJ}(E`7w5;EaWuSxVq~04px;>YjPn|}?aFcf3QaxZycVpM zaW0Pkb#V2J^9Hbeact(4i_NF6<8%x+f&DqQKH40oTE^);+?~92dibAYvBI?Ts`A_2y9;*n>poT^Xcn29m8+I>rv~Y&2g$_oPNiAI>qA@O2&C= zjUDG{6vz2v>WuSoVq}~fqCZ*ljPp^r?aFcf9!)*t`~z4m!%ctGbkD7nKgEtKcP6zv#2x9=ZTSVZi)V4%`?tt z;kGNs`A0PMjPp-mwTyEM{GWrXXPhs9?TceGr(A44eI2J`cnLg^S|4qWQ!V4%5!<;G zkFzNm=Q%ZYoIj&D&hw}<&c6~PKW&&V6}{Md;DL6t7n|A zgYAoBGpAf^K7AdhV|Wwn=U#oZIZm~V)90uQC?4liGR~jZ*m3@X;y5p)&N$yAM#i}> z`Uf@7INyTXt{msvXzCf~J7Bepb1?qz!qqd*_rdnXv6)jYHlMzZ(=q%5Je*n|ZH`kd zfpOo^_5=U|_0_0i@y)iTa2uw6s(xRR1_URC4EsjsFu&RCjwD_l9dC7rP$%yHAYO3HG^FA8q=$rs~Pp2VCZx9-;KJE$iWi11;Ay#1>tI*_xkv` zV_|smxhLhuazE;ye2aq3r;j#$+|%mGw>Y@Ww**}6%_84Y@Z@t(%Z=rJ)<5}{0h>=B zZTfgls3+g@VE0hIGg$$y7W;}|*F5%>z-swEd1bI|)ID#OAl52i&n3?rbISEg%dCn#*qr&kO|D;Jt_60k6LW2_n(h5=XdSTaa~{j} zN&9ud&Yho?F2jF4u$t|?{;m(U{mu25<@(s(>-Pq=-D|rz*Y<0%-9+)Yp5nFrI_et= zd?VOv`_0tGv(3iD&?kHoxPDXVkM>RB`l!ceGjQ2vbGU8%J%8J50oO;}-=kF95^OAO z_FbO7FNytjipMP!`|e!cTHxEj_WcfO`(c}{h@sCd(c*na3MS5Mp>z~)Qb9pP$&D8}8H+QYcocB1S`F^<@{`pVT4cQ>&84c{GZ9_PsM z>;bo(dj2Nvo?zQ)%iqJ?3(WRteU{W;A9Jdk)Bb&jhuAp~mvenLZ9U4lz7w8#zYA>J z-%zKo`w&N;%*hYoYMGOL!5+?uw!xGk6yu1?IZ;pCpyAF!(*97e?bDyb;A-|KK8J(tbFLdl z!1Ys)&ylsyZy489@G%s%qbXO{efUwWA4h#G#lO>G-;M{nb}Litr}6c5t+eHw(DxyV zN4X{sz_TU~f?bn`sj~(r5yLe}Ur&bH#=l!)%v0dzUxcD9ey7!bnVZw$YNt}NCTD`x z&!D8;Pr$~{eEk%zpL(v>=YZAErlj4^z-7C0;rgk^=e*h{^ZX0A+RrJO=L^8<&3V2M z&2c))`sS$LIRmC;h$w zZXETryAf<#ZSlJaY(KRn*3Dr1nKk@1T&+A;Zh@ z9yIk_r|$*Z|7Gj;+GD$~u$f=q#J(Tg?BfGy>hXE7_9^@L5Sn^?9R>J^lC{ z*gh^rvAy=#9w}_**VnantdD{ngFdc@yj+hz;NwxQ$M4~;$79sFUOh%TuUDRz;-@It zJ5Pgc6aEZbpR?*dJPX!G-9E_E2d{NcQam1~WKTQ+whvEH+Xwf=bF?e(W6u{{`%4Y} zM$OZ&7vRQq47Qc~d!EkIi(uzMUAwu|vPORf+qT?~e?e1^&&#z>xz?|ssmJHl+NWIW z*U;3no__^rt!=M8w$}@r`SrEGj$K>wya{gh_it$G@%el0Q}*{QH1+trUHg>%eFsfF zeR>z1^T+nuV|%Z#nO|S~>)L3`dHX)tG2Fp=_&ojrSZ!;{=lFj}?cuYWwtrC6+#}+| z`3UUVWzGKyb{=B?xVGoH=3j8Nlw2b}L9?y)wEYxp?A&ku4c1RRKA(Y;-+lEt+;Qc6 z`~s|xdiwAsSUtsOO3#b`pqWE^e7^!a#+0eG@7HMBY~%boW;K7;H}hnjetrXX4eqMv z`&+QuAd2(NG`9}tTibUOHRoHLIK9v^Ui&;9yqxcj+MfP*!qrkT-@Vant39#%fQ_BG zn;vfe)UyVC!M4?wb~At-TlkFdGR{nJebm#hnZfEQS%X>7%%MHLvw|IWO4gtsnl{^H z4b)tN%$>FUa;|0rJ6B#4#pN~ekLVsxQ*upwrp8|Do~5`Jf1=JcdM;v=*T)5Fo_uq_ zjgfho6Kl3~x+*mmm7K7`f?zyl8 zwTI_|w#6wcQ;aK4oF&2bBYY{iaWh{_!}U>*&oW^9==0i=)XT#4Q;*Mb;IhBV!^^lU z!1Ynj=g}3x#?t0|+b^}mTnTJmZN`?nPaUh{a(rp$H8_6a(ocVF_D5U!w**|*S1BIl zK7JXVHGBnZzSpR8pWl#}*~hN)CJnxMgZFRn-5Y$b2H&T__iga~8hmVnPiXK-4SrmM zpU~hZH~47{eqn=O+~Air_>~QQQ-j~q;I}vUT{X`=e-*fER6gr`A5A?ztJXf{v%_j= z>VAgs9=Cu-lFy|`@SWb zy8iBOdCt`VV9yh6?sfUP%&^zRt-xLz?UQ+It54c)EvBTe+ki7RA0+QYThwku^c#r)#L-UHmszbBfy{r6fTkN@7_j4%ED0h+r0UTfs>{~=ia zaxV`?Q`g^Xkvy@wz**~k!Sby25U^`)pUh)hebRO)SX*)r17~dJlIs)y;b7y$e*`#V z(_gMn{6~V#8UIn>j7@*JKCZR%?_4|Q@!ubu_=!0NP2KihcjfUP2TuRvKORk8f3M5( z_#XgHf8sw8OV-1Ix1)ehhXm*eCPYR-d#z1FS8%&je>|=923Z z|DS-36aSxrGdBI@`o#Y%usP#@HaKI`U#^d9?fg5}&UyTQ22Otx^ISCb_?%b!l=F2y zntImy=V05ZyVe&_d$`uxenGjBVt#RA{}SBHe-WCx{lAb}9{)?g8DIK)DVnqtH@_FS7GJ+WB{`o%8tL3{L#S{56`o?Qf!%$NyGv`XB$> z(A4$6g<2l}JHY8r{O?3l*Z+2Ed2DxsGuL;4<(cc>fSqgmWFFhQ^ED$wZZo&xc++;T>pI< zeBXlWKcwcK2ky0F`E2jL?t|?SxO>ujz>8pyud2mb`U`Ns3x1T^&nLg9rfKyDYW`n6 z#y^Cv9;Y_e6V&eGC#n6+_!RXF)K63UUehzwGf_WFJu~$msb``76ZNdr&r$cIexBNM z#QZt`hLgziC}WU&uG(jP?PGjj0(<_2{~2!E{2c8saDCJhPpypSSkwMhu<`Wu+?2=m zS8)2}c`DD(#9s&dGjZE!OD^>?m-Cr;e*-6;=eaz#x4`L#=e#_*-Uj_ zaotn7rvD3U-16Dr6Et<(d)<@A|KDKqmj0iisq61`QSKZriQng7-#;>rw#4}oY~J#7 z-+$25jpOxH9{;bw<}LldK~vY?>#aO_zXhAuINB1&lgqs2b6hVpb>n!QmdC#XY~Iqp z6HQ%zujBIM?F}}sakS-o-#%dH!hY#vTdy1H<=S|jC-)54nrky7n!4@1XUO9}Gq|}n zv!JQ#?>$AHzRn8veI?^)OPtxj&9#{wP2D)&i{$a21KeDjInmVh_g*DW-nqc$HIBB# znFriln|aaHjpIE|9{>5l&9zwoOC5NuxKXv^9x1a>a$mp-<2ZPd%P@!Fg7 zaZzmcRbTI|^4Jy!+b?b2XXW<6^M47j*A&}mOD^>?m)G~iTN+z(Ed`dxwk$Zgyl2ak zYdP>k#W%`=q~(Ro@8u8(@!tPZwKezvs+TKVh@VB>2`U)9RK zdLK>R^{|;&U!Q~I`MJ;f;772j$A3d`*2L!|xov$$(m(67G1%|__0g90n}U;X6R(s!T9NA_%JOioqPhYkJJ63(PrTq@zwBH^qPrgB5$Et439jT2Y-ica!;_nQ0tomrnSk=q1 z`aG1}yJ1W2UBU9?-W_ai_4w}z&fNI?C^yeu)cU6{dxPzZKHAb3^|CKMlO^^Ku_g9C zV0rp77;InE0yWcB9YD?htBL$$ ztVz_4X)?9X?o+6Jc0Z7MM(Ts8eRe;XdS>cFsC{-nl-g(a!>FAn^SV~{M{fR%!=Lwy zGmg^F{>85xuWd>{`yW4T&c%}CKN{V2%g<-0!nLa>r&<}yIY|3s!R~>yKMrnt_2g4a ztY*KQ$HY1wY^=1Cr=4Rf`{2CCFKg>~PDFP+X(un+xlYMWQUR_RIZ}ew_g>=RqFZncy<^PvFK@Pi(a^wtFz`&jOcYJ{xX( z^^8R={^x+p`IMKj-PiFw7hJ|Z4{mJr#8!*{`QUOaKd=4OGZwWnpXX0v89RRB($DiN zd435l^IQbiU)}azchus43Ah}`rEvY#_4m4@7XQn^#*q7bas}9HWS(KJgsbV7Hdld- zlQvg_y~d`^HE=ck^1Spbu(7ly&b8p=cK=@oH?D2u*Ms#@&wnrJ2C%U_qTN_)Ui+fm zRBK)b^LM&#Mzg*C+Kun$Uhf;f2HW1xrwn>o7=u8(@=;(oBPJfb~NYvr6h zSZn2+J%na^{k0oEbM`RU_DfN21?%gasXJ%h57O`7gUf#Z0lq&a@69|0)<@la`Y5$p z+CKr#{5kF?;oeiy{wc6N>b8HJS}pCL0UJ~9K7STmuGt^qYWk(kpTNdRo9DpgnmrF! z(=TiG0@zsE?8np8YKie8SS>kT0;gY&>(6j=WS_cGWx9?@Q@wQ@aQt+jGJ zUqiFK{@RW2nyHu1QJ=KKS07RP9Q7gfKMVYEjeUOj7sd7dlseBx9}-VnzVH6D;68hO zS#Y0!zAd=zI(R@S+fU!%eH(nng4=H92A`|o=3A)2*KF{$3vPecZSV~WZoZ9c?z#f2 zHyDreat+tAzSM8R)h=Oye0KXg*u$T_Y5N;R&3P0Xr$6?$z|Q-o#IYZ5!<~EMWDmWA zrk>}Rcfnrs)x9Pg=RL5ov?ccYU}L%0^!Wg;pSpWOZh!1o@_z(w=Km*}diLzUz-k{; z@;=)qVEd%a^TPe1mcINOY~1{JW9!|oM_JF$`tb$TVMNO zPVE`X++gSIIQBKLnwNjn^54YsTA&vH`M_#9SLX+-xmP?_7X*8Fu4-F=vIfO-Lu{P> z*cS$udtni{n#H5s3(o7J==MGHvlzU2ZY_?cp7~h->1F)1Gx% z3apmAOM{zvmqAmH&$8g=+AW8s9-rmG%{VKdsps0XBG~guJ@@XFz{b)xl{ND|xH8y2 zXv;lr6|jBxi1z(jbL`Ppt+n#Lw;G!5_1A8EuW{eQ=a=^g zdB(pUxH(7bqp7}x_n~q&)7Ewe?V=2 z?U%W1ub<=8?l|4c&EHA=jCLN6Q@q!EfBZK^|Iewthi^fmzqOKL9(1{Ep;4U^V@0>%6PwxyqbhQasAJ z{sQh?|A#try)W&`xgOr&qiUYMb-|63xgG{r8%l9(##4*`2(bS7J&BQUHRoG@^Qpyu zG+2MnPsgzzT+O*ljQzpt&U4me95`#DeJsWJ_Fr4#j|ZDGd;(Y>xpRF0*fC_TCxX@V zv#oQjmbvavAHSh^d_{3zJD*=uoa=9?ookqBa8ZeVpF|Jcr-C-kR22=16R zp=jHoJ_ip5YqQX0vb6oET4OekKE~~jb|_da&kl!y)hr(7FoyGGpS1g(tMh+2*uA8l z>&X#d<6S~Sb9fy+60V+W<56JSdPFzI1x<0P8ZAN7;iJMy#nN6nuZ=Nai7xcZDmyPv^r zcYNLMT)0}E{AAE>$OWo+LU@H@B*!REI1zioOE^~Dqq z?U&Sc>&)+^U}N0KJo#DgGO(I+=`*AJmlR_eTWnj`@CvYFPpqrp#TwM!xPW`(!=F#UmGu! M*nFOgV$a3@4`5AT`Tzg` diff --git a/piet-gpu/shader/kernel4.comp b/piet-gpu/shader/kernel4.comp index a0710d2..c9b5dd3 100644 --- a/piet-gpu/shader/kernel4.comp +++ b/piet-gpu/shader/kernel4.comp @@ -87,11 +87,14 @@ void main() { Alloc cmd_alloc = slice_mem(conf.ptcl_alloc, tile_ix * PTCL_INITIAL_ALLOC, PTCL_INITIAL_ALLOC); CmdRef cmd_ref = CmdRef(cmd_alloc.offset); + uint blend_offset = memory[cmd_ref.offset >> 2]; + cmd_ref.offset += 4; + uvec2 xy_uint = uvec2(gl_LocalInvocationID.x + TILE_WIDTH_PX * gl_WorkGroupID.x, gl_LocalInvocationID.y + TILE_HEIGHT_PX * gl_WorkGroupID.y); vec2 xy = vec2(xy_uint); mediump vec4 rgba[CHUNK]; - uint blend_stack[MAX_BLEND_STACK][CHUNK]; + uint blend_stack[BLEND_STACK_SPLIT][CHUNK]; for (uint i = 0; i < CHUNK; i++) { rgba[i] = vec4(0.0); } @@ -223,24 +226,38 @@ void main() { cmd_ref.offset += 4 + CmdImage_size; break; case Cmd_BeginClip: - for (uint k = 0; k < CHUNK; k++) { - // We reject any inputs that might overflow in render_ctx.rs. - // The following is a sanity check so we don't corrupt memory should there be malformed inputs. - uint d = min(clip_depth, MAX_BLEND_STACK - 1); - blend_stack[d][k] = packsRGB(vec4(rgba[k])); - rgba[k] = vec4(0.0); + if (clip_depth < BLEND_STACK_SPLIT) { + for (uint k = 0; k < CHUNK; k++) { + blend_stack[clip_depth][k] = packsRGB(vec4(rgba[k])); + rgba[k] = vec4(0.0); + } + } else { + uint base_ix = (blend_offset >> 2) + (clip_depth - BLEND_STACK_SPLIT) * TILE_HEIGHT_PX * TILE_WIDTH_PX + + CHUNK * (gl_LocalInvocationID.x + CHUNK_DX * gl_LocalInvocationID.y); + for (uint k = 0; k < CHUNK; k++) { + memory[base_ix + k] = packsRGB(vec4(rgba[k])); + rgba[k] = vec4(0.0); + } } clip_depth++; cmd_ref.offset += 4; break; case Cmd_EndClip: CmdEndClip end_clip = Cmd_EndClip_read(cmd_alloc, cmd_ref); - uint blend_mode = uint(end_clip.blend >> 8); - uint comp_mode = uint(end_clip.blend & 0xFF); clip_depth--; + uint base_ix; + if (clip_depth < BLEND_STACK_SPLIT) { + base_ix = (blend_offset >> 2) + (clip_depth - BLEND_STACK_SPLIT) * TILE_HEIGHT_PX * TILE_WIDTH_PX + + CHUNK * (gl_LocalInvocationID.x + CHUNK_DX * gl_LocalInvocationID.y); + } for (uint k = 0; k < CHUNK; k++) { - uint d = min(clip_depth, MAX_BLEND_STACK - 1); - mediump vec4 bg = unpacksRGB(blend_stack[d][k]); + uint bg_rgba; + if (clip_depth < BLEND_STACK_SPLIT) { + bg_rgba = blend_stack[clip_depth][k]; + } else { + bg_rgba = memory[base_ix + k]; + } + mediump vec4 bg = unpacksRGB(bg_rgba); mediump vec4 fg = rgba[k] * area[k]; rgba[k] = mix_blend_compose(bg, fg, end_clip.blend); } diff --git a/piet-gpu/shader/setup.h b/piet-gpu/shader/setup.h index ec17188..21206e5 100644 --- a/piet-gpu/shader/setup.h +++ b/piet-gpu/shader/setup.h @@ -27,6 +27,10 @@ #define GRADIENT_WIDTH 512 +// We allocate this many blend stack entries in registers, and spill +// to memory for the overflow. +#define BLEND_STACK_SPLIT 4 + #ifdef ERR_MALLOC_FAILED struct Config { uint n_elements; // paths @@ -91,7 +95,7 @@ struct Config { #define MODE_STROKE 1 // Size of kernel4 clip state, in words. -#define CLIP_STATE_SIZE 2 +#define CLIP_STATE_SIZE 1 // fill_mode_from_flags extracts the fill mode from tag flags. uint fill_mode_from_flags(uint flags) { diff --git a/piet-gpu/src/lib.rs b/piet-gpu/src/lib.rs index d32a9c5..8915de4 100644 --- a/piet-gpu/src/lib.rs +++ b/piet-gpu/src/lib.rs @@ -34,8 +34,6 @@ const TILE_H: usize = 16; const PTCL_INITIAL_ALLOC: usize = 1024; -const MAX_BLEND_STACK: usize = 128; - #[allow(unused)] fn dump_scene(buf: &[u8]) { for i in 0..(buf.len() / 4) { diff --git a/piet-gpu/src/render_ctx.rs b/piet-gpu/src/render_ctx.rs index dca03eb..f78e8ab 100644 --- a/piet-gpu/src/render_ctx.rs +++ b/piet-gpu/src/render_ctx.rs @@ -2,7 +2,6 @@ use std::borrow::Cow; use crate::encoder::GlyphEncoder; use crate::stages::{Config, Transform}; -use crate::MAX_BLEND_STACK; use piet::kurbo::{Affine, Insets, PathEl, Point, Rect, Shape}; use piet::{ Color, Error, FixedGradient, ImageFormat, InterpolationMode, IntoBrush, RenderContext, @@ -230,9 +229,6 @@ impl RenderContext for PietGpuRenderContext { let path = shape.path_elements(TOLERANCE); self.encode_path(path, true); self.new_encoder.begin_clip(None); - if self.clip_stack.len() >= MAX_BLEND_STACK { - panic!("Maximum clip/blend stack size {} exceeded", MAX_BLEND_STACK); - } self.clip_stack.push(ClipElement { blend: None }); if let Some(tos) = self.state_stack.last_mut() { tos.n_clip += 1; @@ -334,9 +330,6 @@ impl PietGpuRenderContext { let path = shape.path_elements(TOLERANCE); self.encode_path(path, true); self.new_encoder.begin_clip(Some(blend)); - if self.clip_stack.len() >= MAX_BLEND_STACK { - panic!("Maximum clip/blend stack size {} exceeded", MAX_BLEND_STACK); - } self.clip_stack.push(ClipElement { blend: Some(blend) }); if let Some(tos) = self.state_stack.last_mut() { tos.n_clip += 1; From 9df486ef35255375c04c6ad6799cf3c182fe152d Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Fri, 20 May 2022 14:02:24 -0700 Subject: [PATCH 2/2] Fix blend memory issues --- piet-gpu/shader/coarse.comp | 5 +- piet-gpu/shader/gen/coarse.dxil | Bin 11632 -> 11972 bytes piet-gpu/shader/gen/coarse.hlsl | 596 ++++++++++++------------ piet-gpu/shader/gen/coarse.msl | 639 +++++++++++++------------- piet-gpu/shader/gen/coarse.spv | Bin 59320 -> 60516 bytes piet-gpu/shader/gen/kernel4.dxil | Bin 14480 -> 14484 bytes piet-gpu/shader/gen/kernel4.hlsl | 2 +- piet-gpu/shader/gen/kernel4.msl | 2 +- piet-gpu/shader/gen/kernel4.spv | Bin 66224 -> 66224 bytes piet-gpu/shader/gen/kernel4_gray.dxil | Bin 14556 -> 14564 bytes piet-gpu/shader/gen/kernel4_gray.hlsl | 2 +- piet-gpu/shader/gen/kernel4_gray.msl | 2 +- piet-gpu/shader/gen/kernel4_gray.spv | Bin 65980 -> 65980 bytes piet-gpu/shader/kernel4.comp | 2 +- 14 files changed, 647 insertions(+), 603 deletions(-) diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index be891c1..fc6df21 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -151,6 +151,7 @@ void main() { uint part_start_ix = 0; uint ready_ix = 0; + Alloc scratch_alloc = slice_mem(cmd_alloc, 0, Alloc_size); cmd_ref.offset += 4; // Accounting for allocation of blend memory uint render_blend_depth = 0; @@ -460,7 +461,9 @@ void main() { if (bin_tile_x + tile_x < conf.width_in_tiles && bin_tile_y + tile_y < conf.height_in_tiles) { Cmd_End_write(cmd_alloc, cmd_ref); if (max_blend_depth > BLEND_STACK_SPLIT) { - // TODO: allocate blend memory and write result + uint scratch_size = max_blend_depth * TILE_WIDTH_PX * TILE_HEIGHT_PX * CLIP_STATE_SIZE * 4; + MallocResult scratch = malloc(scratch_size); + alloc_write(scratch_alloc, scratch_alloc.offset, scratch.alloc); } } } diff --git a/piet-gpu/shader/gen/coarse.dxil b/piet-gpu/shader/gen/coarse.dxil index 3370f591906a162db9acf66e12c14904dd757988..f71cc0441f5852ebbb2a904e3dc8c03be2439447 100644 GIT binary patch delta 7858 zcmY*e3s@7^ww^o*LxAuIgqH>og#_t-R{=#QQ!RYxD$_cqt>XW2CrjS?UT>Rb4wyA9dz+w=2ao`#+9SM4+F1f3`8 zTQPc*=v_cYOWYvhHYolKK_jD9B#^f_=g8*Mpv&Igl?PbV5-4r|jsEfRim%Bm!p*i} z@?LU8fASK0?cKvWZyTlDz^61#Y}%^T8~q?i22r3?YY4)>L%=cv7>@0}YZ9ig>fn zbNJKB{2e^c@qeP}Sp=Gr{T58nmud|uW%4hDZu1&ZSi{RwLu?u~m0K-12RATav-oO{ zn}1U)e2$kT!^NdR#TciI#e!%`!Y-REBY+`PpavZg-Upv);G^b7&s@gG4EVe?K`e0N zQ*%+92%TojnL zk7tAHBF)`MAxcqLEDYC|5{M|9mG@L`Gcp$$@5vKFQn6il7K%^NJ#wOFrBxU2Gy`I4 zNJm+0FjvJZyKXjh&y-0K7BOmm{{>{X6|#G5f_7SA!$@NFJCaFE zvT8~ufatB%ZGsrO6na5ukH??W=I1LyWi0-E#{7Ik z=-aNwbs$i%Ne6$9{ur)HW~IMPeJ$S2aBM9Z^NaOiEnzETRJ+As+k^T%4`wQ8ci&3JD(g74BfDrh6-4PLOP03xiJy*tvo%R;W2vn$q23FS`sCX?4#_BLPP z^fhAwf3Zc@d8B>x09X-&Dm$TJH9~n?#ii-QYz?u|rIv*>LQRy^!|5d?Z3?d}ZUfp2 zyhR5qLFv-8?ef;c!Ly+YXAbtQ=?|HgD3%A0$a}-dIlSAg{(|Ew2A3rkEhNHdvVhn| zzRkB{`%8u1zEnJ}HE$_vXNm(pB&fzp^nrTW2}Q6nz2qiA<=zja@VeqMTYC{;jt0z) z&ZdPT#9ij?Qf#mH4{Nol_S;M4K-ia*EgE7g<)BNk0)}?x3H;ZotyqP$5gEP2qgX*t zptWau8`G(Iu>U+Xctl3d<~>w9H8@DsP6djMsEpFPqb`n5;FWk(%jgXrux}$8bf4G- zVQ|Tdz2yi>l+l;QW31Ino#VuWycWtQ1SOOHOR@)nqGuKAmBH18{$(2CAnGV2rSST` zDI_~X*`1ipP1&_to)X?eN{F{j!{l?v9K=xB7&U}u7W9!4!tK*A#(l(W>A9^xPH6Te-2Cxn*5 z8$n?!xBifgX|2lImExR5{!kocIf1D$l$*-1424yfR)WCioMSfPFPQ3)Z;;RfI|A^0hd@hhJY-!q636z%^WfkSi=M3^zSkTE z4ImE&gXdmA6fvvLh_w0?Ctqm1Q=7iZCeg+8sfN-^Ah zybmt@G(6N&298k^#^d7c<-zFJ_bf?Dtq+A1g)B)g{cgu;PD2C-(mIX_qKSAFVUG33upi)l-cZ?EDbS-)c|U{!WX0fV{&ux#m& zdokt#OlNgaw@l&lOwtKhT>zq4XNHW9m?3w~&nOeL*S6;u6hi_<9(sW|_L*KTf+A$R z+o*jZqtX~5nePOseyaAYi66+9@dfRGtT6so2vvBX0?!s^bPF?Td|kw#IDF8!@L598 zvv0X&D>-G~`1i%m?d$VG1<@!LjVhwYD0?GHr-4|?OZy@BPuvo;NzJPlsa2Cpc?rU=8PaKpoe zhD||+hg`!Zj^UxdVbfg0L)>Q9ecYzuY((F{e{Ev#-6OH|7MuUqB=TRIB-RLtHQXDc zC9%rPHo-bkLNrQ1 zR>4F5(vQUt1?%mHqNT6IT2YuCsfqwm3nA)GdFr%!-IP4(DI;NwC%mqX>`-$qs^@EY z9_L$KK4v(62vJ``)IT8VE5_PMi25ThQI7}4&(vJg^9la+E52KfH{ytr@M%n~uavEa zOWu0dfZeVnM2fN6uxT5qEN1C!Q=IXiXGz24?!|zOdTq1yF(6DBRxcSXvWc2k$^Oty zxWu7oZV6E)l`WPK?(!*J|6sDjg4cPJCnR%|_SF7O*BVU>PELKVE#&mBEoK+u)c#ML zovN0n3hwYJ|M>^A)!xi_a zF=%&4{mb+*dc7EaXbcp1;mzYps~A>47TD`GED$%zg<=8xv{XO>j4F@n6JBy^XV`U! zZIBM*Z_Zo|L)t2g$TH%p&e&gN{7POl*k!co7XMpH67mw|RwOT%M-K>(ZYkWUAMlKX zy?Y>+U62d@k+lbM-37UR05aEV2ampT^)=D{Fg-)c7G>P9#{xxjrU=0!dTI_CB=A0s z6=t5ow%wxc#iMFBWQ<`qrhZ*17G(%*EyDLIMPEBj7(FJ`c25~^fQ)CJn)_463^{U; z8rd$2tcMCK_eGe^;?hbl8ROQPHsbQBD^WgKm zq8jC1P#53GG$i>n^e>XaKEd{f2{SL8_YD@-pk+8O(1Mk)A%5kog6roO=hr~x`LuE) zt^C=AG9c@>$ZnqxEkbJe<#3q9H>{^7UAdH17;m)~C-USOm8?&OvqfW!kM9iT8DdqZ=?RxaPaZLa@-bijuIY@Z|3`ghMXJ>O7{UVn7Ru-b)WjMYjYR>;JfToU-4-_ z+5rW8`!7CWj%s=JRu(0hmOp2d#!>qsUcq@dxqeYOnTHS~VZX>rzL7q)O$Wo3@PuWe zk@b<2HPA8ls2<;_klOqK;Dxv?nqCRUcb4*|NT1M!TQsDpSV7ENehmJR7b}Q;%a0Xq zIiYZVBx@A&>YLfe%JnQ3Ri z#>%a$Hu}fcZ;G#%Ce(X09jug{U^C4x-L97w)rzVR{;DeJsw#ONkgQgCzb<2i;tlA9 z#3r)Hz!@6g=mt1X#9obcOpT*i_Dy2TJduEVNW|@saDO%0>hG%)ECIUcs-rFC;=HZ_ zZnwmKeSHEiQ4N#4&}?`(fYvDPY)v#*wA10(r?!+!p{EfBbf6n(HucphNo{o^K~Op9 ztKa|9atN)h2zn_-6Y+}kIR`U$3BOb(%AB7KfI=dzNEBlWEt&n>cw&z8+kuF81B>2C zJcd+BV!@*KDBVDpE#CLuSQmaanVobj{7^+WmTV2iky*j5ityTGUecZL^6$cLB-{S| z!kzEJ>y!COHp`AXExVQM&~8z5&uN)9S)8|ZMub~r@fYov6NnTVz$MUVsz-?S{=Z9S|5CxAeF z11OT8LsvfDz4o{9q_?4oMwrAr5lwADKgT%zAzex?`K8Mi`VjIspxdV*mrX&Z}4*LS{>=>pmuz| z{@hwIVflMO0hBiSmwcN(xoS*#WkM=O^*;le9{EmcK{&YgUHH z^mhj1>m_{2GJ#~?3dtoPv{bav6_O_B%E2|2AV3ELnPdqsQEX#g)R1(QZeWY#ZH{FA zR!Ms(5Hz%Yy5AhzZ2=Woe&cmnlXXdxb@^JmPY2+5*evS}sN7Z0uHWxdFX7Y|K1Haq z0{;NkY!OJhAcapTs~l7E>r*%(#u+tx>Y; zR=g(#Xf~aLZJJMBs%JOgW$E$>rMWdWBsA;_&}i}2_@8x_2Dq&$AQLXk2PJ@m(1n)w z*KyChspnt7-#3hYZoyvuAz&w5gkvY^f16TqYd9C6792W=)>xodVeW4DCJt?~m0Gm6 zaW7?D(3_y6`g#krD}wtWJOH2wly8@5!T!kYID7%s;cEN%It}sifSEr2oYYMQpxjGJ zZl{uqa6$~+M!l|`c*Rm^ViUiZ3aI9WR5xEe-K^$dI$56vFW#N^PB-s|ClcrrhrgIe zsLPjg&7MBmK9NwPyhcVl4p(>WhYR{IqOM=!UiZ;*_FKjm2VH-B zVf2g6>(`pEbF?8jmhnj4^~np+#n7%EZdZsl!eAK}1$Di+z`oep^=)%kgccnC&H58{ zU2iV%F9vpl5+&3oAfH$S>w>z8TG_?M?jM@F6SR^Z%lHOeH>^c3&im>y_bZ7uLvI<+ z4*JSbtGTH8YO?vO4DDf6s}c}c<2}BvS$5Iv=Fs66&7Z>jg4tT%DTtL6gLBcIF&E%B z3ZP}p_GaXwgmXFTNPGN|i*a;2{5qvacU__#z(Wh3ggO2}I-hoMFk$q`P7qvofunvJ zPFGD=;%yrKJbXE&pkr6T3AQVh6BuqQ7i?E;sNOnE*+e_MLSn;73o?`2-76c9G$_9x z(0yN|`+icp%V9_fXC#^!8o^M~qTx$g_T|&VhjqhmwE3|%xz>9CiH+_Slx-K3?E*yi z;yb?U+t5}@r!DwK;_X%(-L5#g3$UB(BR=bB_1?oXht)xi=;ijZDR94*30Y-zV$uCJ zV6C5Eu9g@X;9mJ8-xxGK5cF^$sGT!*xn21$r2{hCpWH9F(!&|m&5Q;;dK}aNgysMW zfAu)%OStHl=%VH;MFqNiEU4O#cF-J^KQv#tIXM;d!;7H*c@cCOaJ-JX+gG6Nd{IL=DQ@z*JZ1=PHDxymv?kyEi{2I)D9Ah26nxfA7 zvnng#MAnt{2g(E;@KHdvri(IJ!v>wBv}FSKhTs-_2rR4F2m_DkNs$(h9B?~)&*j+j z;UnF{hj5P|;QB8#*C%BIZwc-alqH3-Gbl&Q9uY-$T0G)>x_h`#JACXxb@}lJfr?1r zkp_=;(j2R2fF|w#%^1`fSyEZH*&`cIKN;RZiAc$fXvmHz$*kgrQJJIFW{+ISjdaN* z91DxOnH_~RWDd213F~o}bdxf5q|B?pBP*_Bk;cMSy9Uor+#_A8e4Q%)YHy$@s!IX- zj0NvgsVk;g(y8nW>Sy4H6J;O;&mIv*&XlJYS?A2(mJ^qoGk-I)_*4ob*W8_LJX`gk zh?0AGK`!`<+w52DR>ne1?cTO+xi>ShQ%`Q4I{V<%P-;LHwT(P&erx3H+4OyGc|T?6 zmE`8-ZpH;-0_}ySUxeK{^U&On6_w=v#%z25`Y~rku2^x}(vN+7KlgWLXL|Y7Q=eUR zL#mGFiV2@tWXP-BmrO*TPS_@=Zu@in@4Iq&iBr^GPkl?5!fTl1H6nU&y9Nscw<}9W zj&!5gZc^jJMDgoOCRiI8|Mg~cyN3Ge0RE%QU248;^UVJn>bDH(EhzLhHJ=Sovp*>$ zv|M#NgV-*u`!t~(?04d=?^#mzM4&2$Z0Rz;xVg={VcREoWc1qpo2dq#j+p`hf#T=H zjFxw9hn}Z5f&!qIlRl>8fMY(G$%$6`5U&ZaQ_G8E#fgmq%6UudJ~*xYGEJV}z9;{} zp8T*SBcuA$tbQb9Mifte+4Z1&w(sjGIQLW5<=g`8iF|Wd$9Lb{wx}T=FDZ)81(c?S z^(=F{IAzavFt>|-h1!(tx)TMh)Pk>;BtniIn{`xX*J(=%7G5gJ###c}mK3zPbGnXa?EsDJz28cDGn>wkk*zK+b91%0Gb8FVmYDYU~8YB!&!!^a=UY z4b*)&7;?nHDLw$KO2om&LpWIGfP({ZaO(;jd=&?yt~mIu37m(6#pO8o3JxYjBRIMx z9!Gmw1GL^3NACx>xk0K^CUgak-t7p`-fMC2%qjpbNyfoy4i3)r!zZo7!NXNJcnk-R zZ8T|4#5M0Vfft$PfrCi~9Lzoiz#;SiCxG6v6-TR+aP+@$G#Z1W#~0w}cjO%4slWgJ E7kU&-zW@LL delta 7515 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 gQ050)a2OqW}N^ diff --git a/piet-gpu/shader/gen/coarse.hlsl b/piet-gpu/shader/gen/coarse.hlsl index 3a5c1a5..a7f769f 100644 --- a/piet-gpu/shader/gen/coarse.hlsl +++ b/piet-gpu/shader/gen/coarse.hlsl @@ -175,9 +175,9 @@ struct Config static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); -RWByteAddressBuffer _260 : register(u0, space0); -ByteAddressBuffer _1005 : register(t1, space0); -ByteAddressBuffer _1378 : register(t2, space0); +RWByteAddressBuffer _266 : register(u0, space0); +ByteAddressBuffer _1020 : register(t1, space0); +ByteAddressBuffer _1399 : register(t2, space0); static uint3 gl_WorkGroupID; static uint3 gl_LocalInvocationID; @@ -200,8 +200,8 @@ groupshared uint sh_tile_count[256]; Alloc slice_mem(Alloc a, uint offset, uint size) { - Alloc _337 = { a.offset + offset }; - return _337; + Alloc _343 = { a.offset + offset }; + return _343; } bool touch_mem(Alloc alloc, uint offset) @@ -217,7 +217,7 @@ uint read_mem(Alloc alloc, uint offset) { return 0u; } - uint v = _260.Load(offset * 4 + 8); + uint v = _266.Load(offset * 4 + 8); return v; } @@ -230,8 +230,8 @@ Alloc new_alloc(uint offset, uint size, bool mem_ok) BinInstanceRef BinInstance_index(BinInstanceRef ref, uint index) { - BinInstanceRef _346 = { ref.offset + (index * 4u) }; - return _346; + BinInstanceRef _361 = { ref.offset + (index * 4u) }; + return _361; } BinInstance BinInstance_read(Alloc a, BinInstanceRef ref) @@ -259,8 +259,8 @@ Path Path_read(Alloc a, PathRef ref) uint raw2 = read_mem(param_4, param_5); Path s; s.bbox = uint4(raw0 & 65535u, raw0 >> uint(16), raw1 & 65535u, raw1 >> uint(16)); - TileRef _409 = { raw2 }; - s.tiles = _409; + TileRef _424 = { raw2 }; + s.tiles = _424; return s; } @@ -270,11 +270,11 @@ void write_tile_alloc(uint el_ix, Alloc a) Alloc read_tile_alloc(uint el_ix, bool mem_ok) { - uint _892; - _260.GetDimensions(_892); - _892 = (_892 - 8) / 4; + uint _907; + _266.GetDimensions(_907); + _907 = (_907 - 8) / 4; uint param = 0u; - uint param_1 = uint(int(_892) * 4); + uint param_1 = uint(int(_907) * 4); bool param_2 = mem_ok; return new_alloc(param, param_1, param_2); } @@ -288,31 +288,31 @@ Tile Tile_read(Alloc a, TileRef ref) Alloc param_2 = a; uint param_3 = ix + 1u; uint raw1 = read_mem(param_2, param_3); - TileSegRef _434 = { raw0 }; + TileSegRef _449 = { raw0 }; Tile s; - s.tile = _434; + s.tile = _449; s.backdrop = int(raw1); return s; } MallocResult malloc(uint size) { - uint _266; - _260.InterlockedAdd(0, size, _266); - uint offset = _266; - uint _273; - _260.GetDimensions(_273); - _273 = (_273 - 8) / 4; + uint _272; + _266.InterlockedAdd(0, size, _272); + uint offset = _272; + uint _279; + _266.GetDimensions(_279); + _279 = (_279 - 8) / 4; MallocResult r; - r.failed = (offset + size) > uint(int(_273) * 4); + r.failed = (offset + size) > uint(int(_279) * 4); uint param = offset; uint param_1 = size; bool param_2 = !r.failed; r.alloc = new_alloc(param, param_1, param_2); if (r.failed) { - uint _295; - _260.InterlockedMax(4, 1u, _295); + uint _301; + _266.InterlockedMax(4, 1u, _301); return r; } return r; @@ -326,7 +326,7 @@ void write_mem(Alloc alloc, uint offset, uint val) { return; } - _260.Store(offset * 4 + 8, val); + _266.Store(offset * 4 + 8, val); } void CmdJump_write(Alloc a, CmdJumpRef ref, CmdJump s) @@ -344,9 +344,9 @@ void Cmd_Jump_write(Alloc a, CmdRef ref, CmdJump s) uint param_1 = ref.offset >> uint(2); uint param_2 = 11u; write_mem(param, param_1, param_2); - CmdJumpRef _885 = { ref.offset + 4u }; + CmdJumpRef _900 = { ref.offset + 4u }; Alloc param_3 = a; - CmdJumpRef param_4 = _885; + CmdJumpRef param_4 = _900; CmdJump param_5 = s; CmdJump_write(param_3, param_4, param_5); } @@ -358,21 +358,21 @@ bool alloc_cmd(inout Alloc cmd_alloc, inout CmdRef cmd_ref, inout uint cmd_limit return true; } uint param = 1024u; - MallocResult _913 = malloc(param); - MallocResult new_cmd = _913; + MallocResult _928 = malloc(param); + MallocResult new_cmd = _928; if (new_cmd.failed) { return false; } - CmdJump _923 = { new_cmd.alloc.offset }; - CmdJump jump = _923; + CmdJump _938 = { new_cmd.alloc.offset }; + CmdJump jump = _938; Alloc param_1 = cmd_alloc; CmdRef param_2 = cmd_ref; CmdJump param_3 = jump; Cmd_Jump_write(param_1, param_2, param_3); cmd_alloc = new_cmd.alloc; - CmdRef _935 = { cmd_alloc.offset }; - cmd_ref = _935; + CmdRef _950 = { cmd_alloc.offset }; + cmd_ref = _950; cmd_limit = (cmd_alloc.offset + 1024u) - 144u; return true; } @@ -396,9 +396,9 @@ void Cmd_Fill_write(Alloc a, CmdRef ref, CmdFill s) uint param_1 = ref.offset >> uint(2); uint param_2 = 1u; write_mem(param, param_1, param_2); - CmdFillRef _742 = { ref.offset + 4u }; + CmdFillRef _757 = { ref.offset + 4u }; Alloc param_3 = a; - CmdFillRef param_4 = _742; + CmdFillRef param_4 = _757; CmdFill param_5 = s; CmdFill_write(param_3, param_4, param_5); } @@ -430,9 +430,9 @@ void Cmd_Stroke_write(Alloc a, CmdRef ref, CmdStroke s) uint param_1 = ref.offset >> uint(2); uint param_2 = 2u; write_mem(param, param_1, param_2); - CmdStrokeRef _760 = { ref.offset + 4u }; + CmdStrokeRef _775 = { ref.offset + 4u }; Alloc param_3 = a; - CmdStrokeRef param_4 = _760; + CmdStrokeRef param_4 = _775; CmdStroke param_5 = s; CmdStroke_write(param_3, param_4, param_5); } @@ -443,8 +443,8 @@ void write_fill(Alloc alloc, inout CmdRef cmd_ref, Tile tile, float linewidth) { if (tile.tile.offset != 0u) { - CmdFill _958 = { tile.tile.offset, tile.backdrop }; - CmdFill cmd_fill = _958; + CmdFill _973 = { tile.tile.offset, tile.backdrop }; + CmdFill cmd_fill = _973; Alloc param = alloc; CmdRef param_1 = cmd_ref; CmdFill param_2 = cmd_fill; @@ -461,8 +461,8 @@ void write_fill(Alloc alloc, inout CmdRef cmd_ref, Tile tile, float linewidth) } else { - CmdStroke _988 = { tile.tile.offset, 0.5f * linewidth }; - CmdStroke cmd_stroke = _988; + CmdStroke _1003 = { tile.tile.offset, 0.5f * linewidth }; + CmdStroke cmd_stroke = _1003; Alloc param_5 = alloc; CmdRef param_6 = cmd_ref; CmdStroke param_7 = cmd_stroke; @@ -486,9 +486,9 @@ void Cmd_Color_write(Alloc a, CmdRef ref, CmdColor s) uint param_1 = ref.offset >> uint(2); uint param_2 = 5u; write_mem(param, param_1, param_2); - CmdColorRef _786 = { ref.offset + 4u }; + CmdColorRef _801 = { ref.offset + 4u }; Alloc param_3 = a; - CmdColorRef param_4 = _786; + CmdColorRef param_4 = _801; CmdColor param_5 = s; CmdColor_write(param_3, param_4, param_5); } @@ -520,9 +520,9 @@ void Cmd_LinGrad_write(Alloc a, CmdRef ref, CmdLinGrad s) uint param_1 = ref.offset >> uint(2); uint param_2 = 6u; write_mem(param, param_1, param_2); - CmdLinGradRef _804 = { ref.offset + 4u }; + CmdLinGradRef _819 = { ref.offset + 4u }; Alloc param_3 = a; - CmdLinGradRef param_4 = _804; + CmdLinGradRef param_4 = _819; CmdLinGrad param_5 = s; CmdLinGrad_write(param_3, param_4, param_5); } @@ -582,9 +582,9 @@ void Cmd_RadGrad_write(Alloc a, CmdRef ref, CmdRadGrad s) uint param_1 = ref.offset >> uint(2); uint param_2 = 7u; write_mem(param, param_1, param_2); - CmdRadGradRef _822 = { ref.offset + 4u }; + CmdRadGradRef _837 = { ref.offset + 4u }; Alloc param_3 = a; - CmdRadGradRef param_4 = _822; + CmdRadGradRef param_4 = _837; CmdRadGrad param_5 = s; CmdRadGrad_write(param_3, param_4, param_5); } @@ -608,9 +608,9 @@ void Cmd_Image_write(Alloc a, CmdRef ref, CmdImage s) uint param_1 = ref.offset >> uint(2); uint param_2 = 8u; write_mem(param, param_1, param_2); - CmdImageRef _840 = { ref.offset + 4u }; + CmdImageRef _855 = { ref.offset + 4u }; Alloc param_3 = a; - CmdImageRef param_4 = _840; + CmdImageRef param_4 = _855; CmdImage param_5 = s; CmdImage_write(param_3, param_4, param_5); } @@ -638,9 +638,9 @@ void Cmd_EndClip_write(Alloc a, CmdRef ref, CmdEndClip s) uint param_1 = ref.offset >> uint(2); uint param_2 = 10u; write_mem(param, param_1, param_2); - CmdEndClipRef _866 = { ref.offset + 4u }; + CmdEndClipRef _881 = { ref.offset + 4u }; Alloc param_3 = a; - CmdEndClipRef param_4 = _866; + CmdEndClipRef param_4 = _881; CmdEndClip param_5 = s; CmdEndClip_write(param_3, param_4, param_5); } @@ -653,27 +653,35 @@ void Cmd_End_write(Alloc a, CmdRef ref) write_mem(param, param_1, param_2); } +void alloc_write(Alloc a, uint offset, Alloc alloc) +{ + Alloc param = a; + uint param_1 = offset >> uint(2); + uint param_2 = alloc.offset; + write_mem(param, param_1, param_2); +} + void comp_main() { - uint width_in_bins = ((_1005.Load(8) + 16u) - 1u) / 16u; + uint width_in_bins = ((_1020.Load(8) + 16u) - 1u) / 16u; uint bin_ix = (width_in_bins * gl_WorkGroupID.y) + gl_WorkGroupID.x; uint partition_ix = 0u; - uint n_partitions = ((_1005.Load(0) + 256u) - 1u) / 256u; + uint n_partitions = ((_1020.Load(0) + 256u) - 1u) / 256u; uint th_ix = gl_LocalInvocationID.x; uint bin_tile_x = 16u * gl_WorkGroupID.x; uint bin_tile_y = 16u * gl_WorkGroupID.y; uint tile_x = gl_LocalInvocationID.x % 16u; uint tile_y = gl_LocalInvocationID.x / 16u; - uint this_tile_ix = (((bin_tile_y + tile_y) * _1005.Load(8)) + bin_tile_x) + tile_x; - Alloc _1070; - _1070.offset = _1005.Load(24); + uint this_tile_ix = (((bin_tile_y + tile_y) * _1020.Load(8)) + bin_tile_x) + tile_x; + Alloc _1085; + _1085.offset = _1020.Load(24); Alloc param; - param.offset = _1070.offset; + param.offset = _1085.offset; uint param_1 = this_tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); - CmdRef _1079 = { cmd_alloc.offset }; - CmdRef cmd_ref = _1079; + CmdRef _1094 = { cmd_alloc.offset }; + CmdRef cmd_ref = _1094; uint cmd_limit = (cmd_ref.offset + 1024u) - 144u; uint clip_depth = 0u; uint clip_zero_depth = 0u; @@ -681,21 +689,25 @@ void comp_main() uint wr_ix = 0u; uint part_start_ix = 0u; uint ready_ix = 0u; + Alloc param_3 = cmd_alloc; + uint param_4 = 0u; + uint param_5 = 8u; + Alloc scratch_alloc = slice_mem(param_3, param_4, param_5); cmd_ref.offset += 4u; uint render_blend_depth = 0u; uint max_blend_depth = 0u; - uint drawmonoid_start = _1005.Load(44) >> uint(2); - uint drawtag_start = _1005.Load(100) >> uint(2); - uint drawdata_start = _1005.Load(104) >> uint(2); - uint drawinfo_start = _1005.Load(68) >> uint(2); - bool mem_ok = _260.Load(4) == 0u; - Alloc param_3; - Alloc param_5; - uint _1310; + uint drawmonoid_start = _1020.Load(44) >> uint(2); + uint drawtag_start = _1020.Load(100) >> uint(2); + uint drawdata_start = _1020.Load(104) >> uint(2); + uint drawinfo_start = _1020.Load(68) >> uint(2); + bool mem_ok = _266.Load(4) == 0u; + Alloc param_6; + Alloc param_8; + uint _1331; uint element_ix; - Alloc param_14; + Alloc param_17; uint tile_count; - uint _1611; + uint _1632; float linewidth; CmdLinGrad cmd_lin; CmdRadGrad cmd_rad; @@ -705,40 +717,40 @@ void comp_main() { sh_bitmaps[i][th_ix] = 0u; } - bool _1362; + bool _1383; for (;;) { if ((ready_ix == wr_ix) && (partition_ix < n_partitions)) { part_start_ix = ready_ix; uint count = 0u; - bool _1160 = th_ix < 256u; - bool _1168; - if (_1160) + bool _1181 = th_ix < 256u; + bool _1189; + if (_1181) { - _1168 = (partition_ix + th_ix) < n_partitions; + _1189 = (partition_ix + th_ix) < n_partitions; } else { - _1168 = _1160; + _1189 = _1181; } - if (_1168) + if (_1189) { - uint in_ix = (_1005.Load(20) >> uint(2)) + ((((partition_ix + th_ix) * 256u) + bin_ix) * 2u); - Alloc _1185; - _1185.offset = _1005.Load(20); - param_3.offset = _1185.offset; - uint param_4 = in_ix; - count = read_mem(param_3, param_4); - Alloc _1196; - _1196.offset = _1005.Load(20); - param_5.offset = _1196.offset; - uint param_6 = in_ix + 1u; - uint offset = read_mem(param_5, param_6); - uint param_7 = offset; - uint param_8 = count * 4u; - bool param_9 = mem_ok; - sh_part_elements[th_ix] = new_alloc(param_7, param_8, param_9); + uint in_ix = (_1020.Load(20) >> uint(2)) + ((((partition_ix + th_ix) * 256u) + bin_ix) * 2u); + Alloc _1206; + _1206.offset = _1020.Load(20); + param_6.offset = _1206.offset; + uint param_7 = in_ix; + count = read_mem(param_6, param_7); + Alloc _1217; + _1217.offset = _1020.Load(20); + param_8.offset = _1217.offset; + uint param_9 = in_ix + 1u; + uint offset = read_mem(param_8, param_9); + uint param_10 = offset; + uint param_11 = count * 4u; + bool param_12 = mem_ok; + sh_part_elements[th_ix] = new_alloc(param_10, param_11, param_12); } for (uint i_1 = 0u; i_1 < 8u; i_1++) { @@ -778,35 +790,35 @@ void comp_main() } if (part_ix > 0u) { - _1310 = sh_part_count[part_ix - 1u]; + _1331 = sh_part_count[part_ix - 1u]; } else { - _1310 = part_start_ix; + _1331 = part_start_ix; } - ix -= _1310; + ix -= _1331; Alloc bin_alloc = sh_part_elements[part_ix]; - BinInstanceRef _1329 = { bin_alloc.offset }; - BinInstanceRef inst_ref = _1329; - BinInstanceRef param_10 = inst_ref; - uint param_11 = ix; - Alloc param_12 = bin_alloc; - BinInstanceRef param_13 = BinInstance_index(param_10, param_11); - BinInstance inst = BinInstance_read(param_12, param_13); + BinInstanceRef _1350 = { bin_alloc.offset }; + BinInstanceRef inst_ref = _1350; + BinInstanceRef param_13 = inst_ref; + uint param_14 = ix; + Alloc param_15 = bin_alloc; + BinInstanceRef param_16 = BinInstance_index(param_13, param_14); + BinInstance inst = BinInstance_read(param_15, param_16); sh_elements[th_ix] = inst.element_ix; } GroupMemoryBarrierWithGroupSync(); wr_ix = min((rd_ix + 256u), ready_ix); - bool _1352 = (wr_ix - rd_ix) < 256u; - if (_1352) + bool _1373 = (wr_ix - rd_ix) < 256u; + if (_1373) { - _1362 = (wr_ix < ready_ix) || (partition_ix < n_partitions); + _1383 = (wr_ix < ready_ix) || (partition_ix < n_partitions); } else { - _1362 = _1352; + _1383 = _1373; } - if (_1362) + if (_1383) { continue; } @@ -819,7 +831,7 @@ void comp_main() if ((th_ix + rd_ix) < wr_ix) { element_ix = sh_elements[th_ix]; - tag = _1378.Load((drawtag_start + element_ix) * 4 + 0); + tag = _1399.Load((drawtag_start + element_ix) * 4 + 0); } switch (tag) { @@ -831,13 +843,13 @@ void comp_main() case 37u: { uint drawmonoid_base = drawmonoid_start + (4u * element_ix); - uint path_ix = _260.Load(drawmonoid_base * 4 + 8); - PathRef _1403 = { _1005.Load(16) + (path_ix * 12u) }; - Alloc _1406; - _1406.offset = _1005.Load(16); - param_14.offset = _1406.offset; - PathRef param_15 = _1403; - Path path = Path_read(param_14, param_15); + uint path_ix = _266.Load(drawmonoid_base * 4 + 8); + PathRef _1424 = { _1020.Load(16) + (path_ix * 12u) }; + Alloc _1427; + _1427.offset = _1020.Load(16); + param_17.offset = _1427.offset; + PathRef param_18 = _1424; + Path path = Path_read(param_17, param_18); uint stride = path.bbox.z - path.bbox.x; sh_tile_stride[th_ix] = stride; int dx = int(path.bbox.x) - int(bin_tile_x); @@ -852,13 +864,13 @@ void comp_main() tile_count = uint(x1 - x0) * uint(y1 - y0); uint base = path.tiles.offset - (((uint(dy) * stride) + uint(dx)) * 8u); sh_tile_base[th_ix] = base; - uint param_16 = path.tiles.offset; - uint param_17 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; - bool param_18 = mem_ok; - Alloc path_alloc = new_alloc(param_16, param_17, param_18); - uint param_19 = th_ix; - Alloc param_20 = path_alloc; - write_tile_alloc(param_19, param_20); + uint param_19 = path.tiles.offset; + uint param_20 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; + bool param_21 = mem_ok; + Alloc path_alloc = new_alloc(param_19, param_20, param_21); + uint param_22 = th_ix; + Alloc param_23 = path_alloc; + write_tile_alloc(param_22, param_23); break; } default: @@ -892,56 +904,56 @@ void comp_main() } } uint element_ix_1 = sh_elements[el_ix]; - uint tag_1 = _1378.Load((drawtag_start + element_ix_1) * 4 + 0); + uint tag_1 = _1399.Load((drawtag_start + element_ix_1) * 4 + 0); if (el_ix > 0u) { - _1611 = sh_tile_count[el_ix - 1u]; + _1632 = sh_tile_count[el_ix - 1u]; } else { - _1611 = 0u; + _1632 = 0u; } - uint seq_ix = ix_1 - _1611; + uint seq_ix = ix_1 - _1632; uint width = sh_tile_width[el_ix]; uint x = sh_tile_x0[el_ix] + (seq_ix % width); uint y = sh_tile_y0[el_ix] + (seq_ix / width); bool include_tile = false; if (mem_ok) { - uint param_21 = el_ix; - bool param_22 = mem_ok; - TileRef _1663 = { sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u) }; - Alloc param_23 = read_tile_alloc(param_21, param_22); - TileRef param_24 = _1663; - Tile tile = Tile_read(param_23, param_24); + uint param_24 = el_ix; + bool param_25 = mem_ok; + TileRef _1684 = { sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u) }; + Alloc param_26 = read_tile_alloc(param_24, param_25); + TileRef param_27 = _1684; + Tile tile = Tile_read(param_26, param_27); bool is_clip = (tag_1 & 1u) != 0u; bool is_blend = false; if (is_clip) { uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); - uint scene_offset = _260.Load((drawmonoid_base_1 + 2u) * 4 + 8); + uint scene_offset = _266.Load((drawmonoid_base_1 + 2u) * 4 + 8); uint dd = drawdata_start + (scene_offset >> uint(2)); - uint blend = _1378.Load(dd * 4 + 0); + uint blend = _1399.Load(dd * 4 + 0); is_blend = blend != 32771u; } - bool _1699 = tile.tile.offset != 0u; - bool _1708; - if (!_1699) + bool _1720 = tile.tile.offset != 0u; + bool _1729; + if (!_1720) { - _1708 = (tile.backdrop == 0) == is_clip; + _1729 = (tile.backdrop == 0) == is_clip; } else { - _1708 = _1699; + _1729 = _1720; } - include_tile = _1708 || is_blend; + include_tile = _1729 || is_blend; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1730; - InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1730); + uint _1751; + InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1751); } } GroupMemoryBarrierWithGroupSync(); @@ -965,178 +977,178 @@ void comp_main() uint element_ref_ix = (slice_ix * 32u) + uint(int(firstbitlow(bitmap))); uint element_ix_2 = sh_elements[element_ref_ix]; bitmap &= (bitmap - 1u); - uint drawtag = _1378.Load((drawtag_start + element_ix_2) * 4 + 0); + uint drawtag = _1399.Load((drawtag_start + element_ix_2) * 4 + 0); if (clip_zero_depth == 0u) { - uint param_25 = element_ref_ix; - bool param_26 = mem_ok; - TileRef _1807 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; - Alloc param_27 = read_tile_alloc(param_25, param_26); - TileRef param_28 = _1807; - Tile tile_1 = Tile_read(param_27, param_28); + uint param_28 = element_ref_ix; + bool param_29 = mem_ok; + TileRef _1828 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; + Alloc param_30 = read_tile_alloc(param_28, param_29); + TileRef param_31 = _1828; + Tile tile_1 = Tile_read(param_30, param_31); uint drawmonoid_base_2 = drawmonoid_start + (4u * element_ix_2); - uint scene_offset_1 = _260.Load((drawmonoid_base_2 + 2u) * 4 + 8); - uint info_offset = _260.Load((drawmonoid_base_2 + 3u) * 4 + 8); + uint scene_offset_1 = _266.Load((drawmonoid_base_2 + 2u) * 4 + 8); + uint info_offset = _266.Load((drawmonoid_base_2 + 3u) * 4 + 8); uint dd_1 = drawdata_start + (scene_offset_1 >> uint(2)); uint di = drawinfo_start + (info_offset >> uint(2)); switch (drawtag) { case 68u: { - linewidth = asfloat(_260.Load(di * 4 + 8)); - Alloc param_29 = cmd_alloc; - CmdRef param_30 = cmd_ref; - uint param_31 = cmd_limit; - bool _1855 = alloc_cmd(param_29, param_30, param_31); - cmd_alloc = param_29; - cmd_ref = param_30; - cmd_limit = param_31; - if (!_1855) + linewidth = asfloat(_266.Load(di * 4 + 8)); + Alloc param_32 = cmd_alloc; + CmdRef param_33 = cmd_ref; + uint param_34 = cmd_limit; + bool _1876 = alloc_cmd(param_32, param_33, param_34); + cmd_alloc = param_32; + cmd_ref = param_33; + cmd_limit = param_34; + if (!_1876) { break; } - Alloc param_32 = cmd_alloc; - CmdRef param_33 = cmd_ref; - Tile param_34 = tile_1; - float param_35 = linewidth; - write_fill(param_32, param_33, param_34, param_35); - cmd_ref = param_33; - uint rgba = _1378.Load(dd_1 * 4 + 0); - CmdColor _1878 = { rgba }; - Alloc param_36 = cmd_alloc; - CmdRef param_37 = cmd_ref; - CmdColor param_38 = _1878; - Cmd_Color_write(param_36, param_37, param_38); + Alloc param_35 = cmd_alloc; + CmdRef param_36 = cmd_ref; + Tile param_37 = tile_1; + float param_38 = linewidth; + write_fill(param_35, param_36, param_37, param_38); + cmd_ref = param_36; + uint rgba = _1399.Load(dd_1 * 4 + 0); + CmdColor _1899 = { rgba }; + Alloc param_39 = cmd_alloc; + CmdRef param_40 = cmd_ref; + CmdColor param_41 = _1899; + Cmd_Color_write(param_39, param_40, param_41); cmd_ref.offset += 8u; break; } case 276u: { - Alloc param_39 = cmd_alloc; - CmdRef param_40 = cmd_ref; - uint param_41 = cmd_limit; - bool _1896 = alloc_cmd(param_39, param_40, param_41); - cmd_alloc = param_39; - cmd_ref = param_40; - cmd_limit = param_41; - if (!_1896) + Alloc param_42 = cmd_alloc; + CmdRef param_43 = cmd_ref; + uint param_44 = cmd_limit; + bool _1917 = alloc_cmd(param_42, param_43, param_44); + cmd_alloc = param_42; + cmd_ref = param_43; + cmd_limit = param_44; + if (!_1917) { break; } - linewidth = asfloat(_260.Load(di * 4 + 8)); - Alloc param_42 = cmd_alloc; - CmdRef param_43 = cmd_ref; - Tile param_44 = tile_1; - float param_45 = linewidth; - write_fill(param_42, param_43, param_44, param_45); - cmd_ref = param_43; - cmd_lin.index = _1378.Load(dd_1 * 4 + 0); - cmd_lin.line_x = asfloat(_260.Load((di + 1u) * 4 + 8)); - cmd_lin.line_y = asfloat(_260.Load((di + 2u) * 4 + 8)); - cmd_lin.line_c = asfloat(_260.Load((di + 3u) * 4 + 8)); - Alloc param_46 = cmd_alloc; - CmdRef param_47 = cmd_ref; - CmdLinGrad param_48 = cmd_lin; - Cmd_LinGrad_write(param_46, param_47, param_48); + linewidth = asfloat(_266.Load(di * 4 + 8)); + Alloc param_45 = cmd_alloc; + CmdRef param_46 = cmd_ref; + Tile param_47 = tile_1; + float param_48 = linewidth; + write_fill(param_45, param_46, param_47, param_48); + cmd_ref = param_46; + cmd_lin.index = _1399.Load(dd_1 * 4 + 0); + cmd_lin.line_x = asfloat(_266.Load((di + 1u) * 4 + 8)); + cmd_lin.line_y = asfloat(_266.Load((di + 2u) * 4 + 8)); + cmd_lin.line_c = asfloat(_266.Load((di + 3u) * 4 + 8)); + Alloc param_49 = cmd_alloc; + CmdRef param_50 = cmd_ref; + CmdLinGrad param_51 = cmd_lin; + Cmd_LinGrad_write(param_49, param_50, param_51); cmd_ref.offset += 20u; break; } case 732u: { - Alloc param_49 = cmd_alloc; - CmdRef param_50 = cmd_ref; - uint param_51 = cmd_limit; - bool _1960 = alloc_cmd(param_49, param_50, param_51); - cmd_alloc = param_49; - cmd_ref = param_50; - cmd_limit = param_51; - if (!_1960) + Alloc param_52 = cmd_alloc; + CmdRef param_53 = cmd_ref; + uint param_54 = cmd_limit; + bool _1981 = alloc_cmd(param_52, param_53, param_54); + cmd_alloc = param_52; + cmd_ref = param_53; + cmd_limit = param_54; + if (!_1981) { break; } - linewidth = asfloat(_260.Load(di * 4 + 8)); - Alloc param_52 = cmd_alloc; - CmdRef param_53 = cmd_ref; - Tile param_54 = tile_1; - float param_55 = linewidth; - write_fill(param_52, param_53, param_54, param_55); - cmd_ref = param_53; - cmd_rad.index = _1378.Load(dd_1 * 4 + 0); - cmd_rad.mat = asfloat(uint4(_260.Load((di + 1u) * 4 + 8), _260.Load((di + 2u) * 4 + 8), _260.Load((di + 3u) * 4 + 8), _260.Load((di + 4u) * 4 + 8))); - cmd_rad.xlat = asfloat(uint2(_260.Load((di + 5u) * 4 + 8), _260.Load((di + 6u) * 4 + 8))); - cmd_rad.c1 = asfloat(uint2(_260.Load((di + 7u) * 4 + 8), _260.Load((di + 8u) * 4 + 8))); - cmd_rad.ra = asfloat(_260.Load((di + 9u) * 4 + 8)); - cmd_rad.roff = asfloat(_260.Load((di + 10u) * 4 + 8)); - Alloc param_56 = cmd_alloc; - CmdRef param_57 = cmd_ref; - CmdRadGrad param_58 = cmd_rad; - Cmd_RadGrad_write(param_56, param_57, param_58); + linewidth = asfloat(_266.Load(di * 4 + 8)); + Alloc param_55 = cmd_alloc; + CmdRef param_56 = cmd_ref; + Tile param_57 = tile_1; + float param_58 = linewidth; + write_fill(param_55, param_56, param_57, param_58); + cmd_ref = param_56; + cmd_rad.index = _1399.Load(dd_1 * 4 + 0); + cmd_rad.mat = asfloat(uint4(_266.Load((di + 1u) * 4 + 8), _266.Load((di + 2u) * 4 + 8), _266.Load((di + 3u) * 4 + 8), _266.Load((di + 4u) * 4 + 8))); + cmd_rad.xlat = asfloat(uint2(_266.Load((di + 5u) * 4 + 8), _266.Load((di + 6u) * 4 + 8))); + cmd_rad.c1 = asfloat(uint2(_266.Load((di + 7u) * 4 + 8), _266.Load((di + 8u) * 4 + 8))); + cmd_rad.ra = asfloat(_266.Load((di + 9u) * 4 + 8)); + cmd_rad.roff = asfloat(_266.Load((di + 10u) * 4 + 8)); + Alloc param_59 = cmd_alloc; + CmdRef param_60 = cmd_ref; + CmdRadGrad param_61 = cmd_rad; + Cmd_RadGrad_write(param_59, param_60, param_61); cmd_ref.offset += 48u; break; } case 72u: { - linewidth = asfloat(_260.Load(di * 4 + 8)); - Alloc param_59 = cmd_alloc; - CmdRef param_60 = cmd_ref; - uint param_61 = cmd_limit; - bool _2066 = alloc_cmd(param_59, param_60, param_61); - cmd_alloc = param_59; - cmd_ref = param_60; - cmd_limit = param_61; - if (!_2066) + linewidth = asfloat(_266.Load(di * 4 + 8)); + Alloc param_62 = cmd_alloc; + CmdRef param_63 = cmd_ref; + uint param_64 = cmd_limit; + bool _2087 = alloc_cmd(param_62, param_63, param_64); + cmd_alloc = param_62; + cmd_ref = param_63; + cmd_limit = param_64; + if (!_2087) { break; } - Alloc param_62 = cmd_alloc; - CmdRef param_63 = cmd_ref; - Tile param_64 = tile_1; - float param_65 = linewidth; - write_fill(param_62, param_63, param_64, param_65); - cmd_ref = param_63; - uint index = _1378.Load(dd_1 * 4 + 0); - uint raw1 = _1378.Load((dd_1 + 1u) * 4 + 0); + Alloc param_65 = cmd_alloc; + CmdRef param_66 = cmd_ref; + Tile param_67 = tile_1; + float param_68 = linewidth; + write_fill(param_65, param_66, param_67, param_68); + cmd_ref = param_66; + uint index = _1399.Load(dd_1 * 4 + 0); + uint raw1 = _1399.Load((dd_1 + 1u) * 4 + 0); int2 offset_1 = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); - CmdImage _2105 = { index, offset_1 }; - Alloc param_66 = cmd_alloc; - CmdRef param_67 = cmd_ref; - CmdImage param_68 = _2105; - Cmd_Image_write(param_66, param_67, param_68); + CmdImage _2126 = { index, offset_1 }; + Alloc param_69 = cmd_alloc; + CmdRef param_70 = cmd_ref; + CmdImage param_71 = _2126; + Cmd_Image_write(param_69, param_70, param_71); cmd_ref.offset += 12u; break; } case 5u: { - bool _2119 = tile_1.tile.offset == 0u; - bool _2125; - if (_2119) + bool _2140 = tile_1.tile.offset == 0u; + bool _2146; + if (_2140) { - _2125 = tile_1.backdrop == 0; + _2146 = tile_1.backdrop == 0; } else { - _2125 = _2119; + _2146 = _2140; } - if (_2125) + if (_2146) { clip_zero_depth = clip_depth + 1u; } else { - Alloc param_69 = cmd_alloc; - CmdRef param_70 = cmd_ref; - uint param_71 = cmd_limit; - bool _2137 = alloc_cmd(param_69, param_70, param_71); - cmd_alloc = param_69; - cmd_ref = param_70; - cmd_limit = param_71; - if (!_2137) + Alloc param_72 = cmd_alloc; + CmdRef param_73 = cmd_ref; + uint param_74 = cmd_limit; + bool _2158 = alloc_cmd(param_72, param_73, param_74); + cmd_alloc = param_72; + cmd_ref = param_73; + cmd_limit = param_74; + if (!_2158) { break; } - Alloc param_72 = cmd_alloc; - CmdRef param_73 = cmd_ref; - Cmd_BeginClip_write(param_72, param_73); + Alloc param_75 = cmd_alloc; + CmdRef param_76 = cmd_ref; + Cmd_BeginClip_write(param_75, param_76); cmd_ref.offset += 4u; render_blend_depth++; max_blend_depth = max(max_blend_depth, render_blend_depth); @@ -1147,29 +1159,29 @@ void comp_main() case 37u: { clip_depth--; - Alloc param_74 = cmd_alloc; - CmdRef param_75 = cmd_ref; - uint param_76 = cmd_limit; - bool _2170 = alloc_cmd(param_74, param_75, param_76); - cmd_alloc = param_74; - cmd_ref = param_75; - cmd_limit = param_76; - if (!_2170) + Alloc param_77 = cmd_alloc; + CmdRef param_78 = cmd_ref; + uint param_79 = cmd_limit; + bool _2191 = alloc_cmd(param_77, param_78, param_79); + cmd_alloc = param_77; + cmd_ref = param_78; + cmd_limit = param_79; + if (!_2191) { break; } - Alloc param_77 = cmd_alloc; - CmdRef param_78 = cmd_ref; - Tile param_79 = tile_1; - float param_80 = -1.0f; - write_fill(param_77, param_78, param_79, param_80); - cmd_ref = param_78; - uint blend_1 = _1378.Load(dd_1 * 4 + 0); - CmdEndClip _2193 = { blend_1 }; - Alloc param_81 = cmd_alloc; - CmdRef param_82 = cmd_ref; - CmdEndClip param_83 = _2193; - Cmd_EndClip_write(param_81, param_82, param_83); + Alloc param_80 = cmd_alloc; + CmdRef param_81 = cmd_ref; + Tile param_82 = tile_1; + float param_83 = -1.0f; + write_fill(param_80, param_81, param_82, param_83); + cmd_ref = param_81; + uint blend_1 = _1399.Load(dd_1 * 4 + 0); + CmdEndClip _2214 = { blend_1 }; + Alloc param_84 = cmd_alloc; + CmdRef param_85 = cmd_ref; + CmdEndClip param_86 = _2214; + Cmd_EndClip_write(param_84, param_85, param_86); cmd_ref.offset += 8u; render_blend_depth--; break; @@ -1204,23 +1216,31 @@ void comp_main() break; } } - bool _2242 = (bin_tile_x + tile_x) < _1005.Load(8); - bool _2251; - if (_2242) + bool _2263 = (bin_tile_x + tile_x) < _1020.Load(8); + bool _2272; + if (_2263) { - _2251 = (bin_tile_y + tile_y) < _1005.Load(12); + _2272 = (bin_tile_y + tile_y) < _1020.Load(12); } else { - _2251 = _2242; + _2272 = _2263; } - if (_2251) + if (_2272) { - Alloc param_84 = cmd_alloc; - CmdRef param_85 = cmd_ref; - Cmd_End_write(param_84, param_85); + Alloc param_87 = cmd_alloc; + CmdRef param_88 = cmd_ref; + Cmd_End_write(param_87, param_88); if (max_blend_depth > 4u) { + uint scratch_size = (((max_blend_depth * 16u) * 16u) * 1u) * 4u; + uint param_89 = scratch_size; + MallocResult _2293 = malloc(param_89); + MallocResult scratch = _2293; + Alloc param_90 = scratch_alloc; + uint param_91 = scratch_alloc.offset; + Alloc param_92 = scratch.alloc; + alloc_write(param_90, param_91, param_92); } } } diff --git a/piet-gpu/shader/gen/coarse.msl b/piet-gpu/shader/gen/coarse.msl index 94b8738..d84add1 100644 --- a/piet-gpu/shader/gen/coarse.msl +++ b/piet-gpu/shader/gen/coarse.msl @@ -226,7 +226,7 @@ bool touch_mem(thread const Alloc& alloc, thread const uint& offset) } static inline __attribute__((always_inline)) -uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_260, constant uint& v_260BufferSize) +uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_266, constant uint& v_266BufferSize) { Alloc param = alloc; uint param_1 = offset; @@ -234,7 +234,7 @@ uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memor { return 0u; } - uint v = v_260.memory[offset]; + uint v = v_266.memory[offset]; return v; } @@ -253,30 +253,30 @@ BinInstanceRef BinInstance_index(thread const BinInstanceRef& ref, thread const } static inline __attribute__((always_inline)) -BinInstance BinInstance_read(thread const Alloc& a, thread const BinInstanceRef& ref, device Memory& v_260, constant uint& v_260BufferSize) +BinInstance BinInstance_read(thread const Alloc& a, thread const BinInstanceRef& ref, device Memory& v_266, constant uint& v_266BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_260, v_260BufferSize); + uint raw0 = read_mem(param, param_1, v_266, v_266BufferSize); BinInstance s; s.element_ix = raw0; return s; } static inline __attribute__((always_inline)) -Path Path_read(thread const Alloc& a, thread const PathRef& ref, device Memory& v_260, constant uint& v_260BufferSize) +Path Path_read(thread const Alloc& a, thread const PathRef& ref, device Memory& v_266, constant uint& v_266BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_260, v_260BufferSize); + uint raw0 = read_mem(param, param_1, v_266, v_266BufferSize); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_260, v_260BufferSize); + uint raw1 = read_mem(param_2, param_3, v_266, v_266BufferSize); Alloc param_4 = a; uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_260, v_260BufferSize); + uint raw2 = read_mem(param_4, param_5, v_266, v_266BufferSize); Path s; s.bbox = uint4(raw0 & 65535u, raw0 >> uint(16), raw1 & 65535u, raw1 >> uint(16)); s.tiles = TileRef{ raw2 }; @@ -289,24 +289,24 @@ void write_tile_alloc(thread const uint& el_ix, thread const Alloc& a) } static inline __attribute__((always_inline)) -Alloc read_tile_alloc(thread const uint& el_ix, thread const bool& mem_ok, device Memory& v_260, constant uint& v_260BufferSize) +Alloc read_tile_alloc(thread const uint& el_ix, thread const bool& mem_ok, device Memory& v_266, constant uint& v_266BufferSize) { uint param = 0u; - uint param_1 = uint(int((v_260BufferSize - 8) / 4) * 4); + uint param_1 = uint(int((v_266BufferSize - 8) / 4) * 4); bool param_2 = mem_ok; return new_alloc(param, param_1, param_2); } static inline __attribute__((always_inline)) -Tile Tile_read(thread const Alloc& a, thread const TileRef& ref, device Memory& v_260, constant uint& v_260BufferSize) +Tile Tile_read(thread const Alloc& a, thread const TileRef& ref, device Memory& v_266, constant uint& v_266BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_260, v_260BufferSize); + uint raw0 = read_mem(param, param_1, v_266, v_266BufferSize); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_260, v_260BufferSize); + uint raw1 = read_mem(param_2, param_3, v_266, v_266BufferSize); Tile s; s.tile = TileSegRef{ raw0 }; s.backdrop = int(raw1); @@ -314,26 +314,26 @@ Tile Tile_read(thread const Alloc& a, thread const TileRef& ref, device Memory& } static inline __attribute__((always_inline)) -MallocResult malloc(thread const uint& size, device Memory& v_260, constant uint& v_260BufferSize) +MallocResult malloc(thread const uint& size, device Memory& v_266, constant uint& v_266BufferSize) { - uint _266 = atomic_fetch_add_explicit((device atomic_uint*)&v_260.mem_offset, size, memory_order_relaxed); - uint offset = _266; + uint _272 = atomic_fetch_add_explicit((device atomic_uint*)&v_266.mem_offset, size, memory_order_relaxed); + uint offset = _272; MallocResult r; - r.failed = (offset + size) > uint(int((v_260BufferSize - 8) / 4) * 4); + r.failed = (offset + size) > uint(int((v_266BufferSize - 8) / 4) * 4); uint param = offset; uint param_1 = size; bool param_2 = !r.failed; r.alloc = new_alloc(param, param_1, param_2); if (r.failed) { - uint _295 = atomic_fetch_max_explicit((device atomic_uint*)&v_260.mem_error, 1u, memory_order_relaxed); + uint _301 = atomic_fetch_max_explicit((device atomic_uint*)&v_266.mem_error, 1u, memory_order_relaxed); return r; } return r; } static inline __attribute__((always_inline)) -void write_mem(thread const Alloc& alloc, thread const uint& offset, thread const uint& val, device Memory& v_260, constant uint& v_260BufferSize) +void write_mem(thread const Alloc& alloc, thread const uint& offset, thread const uint& val, device Memory& v_266, constant uint& v_266BufferSize) { Alloc param = alloc; uint param_1 = offset; @@ -341,42 +341,42 @@ void write_mem(thread const Alloc& alloc, thread const uint& offset, thread cons { return; } - v_260.memory[offset] = val; + v_266.memory[offset] = val; } static inline __attribute__((always_inline)) -void CmdJump_write(thread const Alloc& a, thread const CmdJumpRef& ref, thread const CmdJump& s, device Memory& v_260, constant uint& v_260BufferSize) +void CmdJump_write(thread const Alloc& a, thread const CmdJumpRef& ref, thread const CmdJump& s, device Memory& v_266, constant uint& v_266BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.new_ref; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void Cmd_Jump_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdJump& s, device Memory& v_260, constant uint& v_260BufferSize) +void Cmd_Jump_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdJump& s, device Memory& v_266, constant uint& v_266BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 11u; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); Alloc param_3 = a; CmdJumpRef param_4 = CmdJumpRef{ ref.offset + 4u }; CmdJump param_5 = s; - CmdJump_write(param_3, param_4, param_5, v_260, v_260BufferSize); + CmdJump_write(param_3, param_4, param_5, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -bool alloc_cmd(thread Alloc& cmd_alloc, thread CmdRef& cmd_ref, thread uint& cmd_limit, device Memory& v_260, constant uint& v_260BufferSize) +bool alloc_cmd(thread Alloc& cmd_alloc, thread CmdRef& cmd_ref, thread uint& cmd_limit, device Memory& v_266, constant uint& v_266BufferSize) { if (cmd_ref.offset < cmd_limit) { return true; } uint param = 1024u; - MallocResult _913 = malloc(param, v_260, v_260BufferSize); - MallocResult new_cmd = _913; + MallocResult _928 = malloc(param, v_266, v_266BufferSize); + MallocResult new_cmd = _928; if (new_cmd.failed) { return false; @@ -385,7 +385,7 @@ bool alloc_cmd(thread Alloc& cmd_alloc, thread CmdRef& cmd_ref, thread uint& cmd Alloc param_1 = cmd_alloc; CmdRef param_2 = cmd_ref; CmdJump param_3 = jump; - Cmd_Jump_write(param_1, param_2, param_3, v_260, v_260BufferSize); + Cmd_Jump_write(param_1, param_2, param_3, v_266, v_266BufferSize); cmd_alloc = new_cmd.alloc; cmd_ref = CmdRef{ cmd_alloc.offset }; cmd_limit = (cmd_alloc.offset + 1024u) - 144u; @@ -393,70 +393,70 @@ bool alloc_cmd(thread Alloc& cmd_alloc, thread CmdRef& cmd_ref, thread uint& cmd } static inline __attribute__((always_inline)) -void CmdFill_write(thread const Alloc& a, thread const CmdFillRef& ref, thread const CmdFill& s, device Memory& v_260, constant uint& v_260BufferSize) +void CmdFill_write(thread const Alloc& a, thread const CmdFillRef& ref, thread const CmdFill& s, device Memory& v_266, constant uint& v_266BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.tile_ref; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); Alloc param_3 = a; uint param_4 = ix + 1u; uint param_5 = uint(s.backdrop); - write_mem(param_3, param_4, param_5, v_260, v_260BufferSize); + write_mem(param_3, param_4, param_5, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void Cmd_Fill_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdFill& s, device Memory& v_260, constant uint& v_260BufferSize) +void Cmd_Fill_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdFill& s, device Memory& v_266, constant uint& v_266BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 1u; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); Alloc param_3 = a; CmdFillRef param_4 = CmdFillRef{ ref.offset + 4u }; CmdFill param_5 = s; - CmdFill_write(param_3, param_4, param_5, v_260, v_260BufferSize); + CmdFill_write(param_3, param_4, param_5, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void Cmd_Solid_write(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_260, constant uint& v_260BufferSize) +void Cmd_Solid_write(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_266, constant uint& v_266BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 3u; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void CmdStroke_write(thread const Alloc& a, thread const CmdStrokeRef& ref, thread const CmdStroke& s, device Memory& v_260, constant uint& v_260BufferSize) +void CmdStroke_write(thread const Alloc& a, thread const CmdStrokeRef& ref, thread const CmdStroke& s, device Memory& v_266, constant uint& v_266BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.tile_ref; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); Alloc param_3 = a; uint param_4 = ix + 1u; uint param_5 = as_type(s.half_width); - write_mem(param_3, param_4, param_5, v_260, v_260BufferSize); + write_mem(param_3, param_4, param_5, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void Cmd_Stroke_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdStroke& s, device Memory& v_260, constant uint& v_260BufferSize) +void Cmd_Stroke_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdStroke& s, device Memory& v_266, constant uint& v_266BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 2u; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); Alloc param_3 = a; CmdStrokeRef param_4 = CmdStrokeRef{ ref.offset + 4u }; CmdStroke param_5 = s; - CmdStroke_write(param_3, param_4, param_5, v_260, v_260BufferSize); + CmdStroke_write(param_3, param_4, param_5, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void write_fill(thread const Alloc& alloc, thread CmdRef& cmd_ref, thread const Tile& tile, thread const float& linewidth, device Memory& v_260, constant uint& v_260BufferSize) +void write_fill(thread const Alloc& alloc, thread CmdRef& cmd_ref, thread const Tile& tile, thread const float& linewidth, device Memory& v_266, constant uint& v_266BufferSize) { if (linewidth < 0.0) { @@ -466,14 +466,14 @@ void write_fill(thread const Alloc& alloc, thread CmdRef& cmd_ref, thread const Alloc param = alloc; CmdRef param_1 = cmd_ref; CmdFill param_2 = cmd_fill; - Cmd_Fill_write(param, param_1, param_2, v_260, v_260BufferSize); + Cmd_Fill_write(param, param_1, param_2, v_266, v_266BufferSize); cmd_ref.offset += 12u; } else { Alloc param_3 = alloc; CmdRef param_4 = cmd_ref; - Cmd_Solid_write(param_3, param_4, v_260, v_260BufferSize); + Cmd_Solid_write(param_3, param_4, v_266, v_266BufferSize); cmd_ref.offset += 4u; } } @@ -483,201 +483,210 @@ void write_fill(thread const Alloc& alloc, thread CmdRef& cmd_ref, thread const Alloc param_5 = alloc; CmdRef param_6 = cmd_ref; CmdStroke param_7 = cmd_stroke; - Cmd_Stroke_write(param_5, param_6, param_7, v_260, v_260BufferSize); + Cmd_Stroke_write(param_5, param_6, param_7, v_266, v_266BufferSize); cmd_ref.offset += 12u; } } static inline __attribute__((always_inline)) -void CmdColor_write(thread const Alloc& a, thread const CmdColorRef& ref, thread const CmdColor& s, device Memory& v_260, constant uint& v_260BufferSize) +void CmdColor_write(thread const Alloc& a, thread const CmdColorRef& ref, thread const CmdColor& s, device Memory& v_266, constant uint& v_266BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.rgba_color; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void Cmd_Color_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdColor& s, device Memory& v_260, constant uint& v_260BufferSize) +void Cmd_Color_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdColor& s, device Memory& v_266, constant uint& v_266BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 5u; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); Alloc param_3 = a; CmdColorRef param_4 = CmdColorRef{ ref.offset + 4u }; CmdColor param_5 = s; - CmdColor_write(param_3, param_4, param_5, v_260, v_260BufferSize); + CmdColor_write(param_3, param_4, param_5, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void CmdLinGrad_write(thread const Alloc& a, thread const CmdLinGradRef& ref, thread const CmdLinGrad& s, device Memory& v_260, constant uint& v_260BufferSize) +void CmdLinGrad_write(thread const Alloc& a, thread const CmdLinGradRef& ref, thread const CmdLinGrad& s, device Memory& v_266, constant uint& v_266BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.index; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); Alloc param_3 = a; uint param_4 = ix + 1u; uint param_5 = as_type(s.line_x); - write_mem(param_3, param_4, param_5, v_260, v_260BufferSize); + write_mem(param_3, param_4, param_5, v_266, v_266BufferSize); Alloc param_6 = a; uint param_7 = ix + 2u; uint param_8 = as_type(s.line_y); - write_mem(param_6, param_7, param_8, v_260, v_260BufferSize); + write_mem(param_6, param_7, param_8, v_266, v_266BufferSize); Alloc param_9 = a; uint param_10 = ix + 3u; uint param_11 = as_type(s.line_c); - write_mem(param_9, param_10, param_11, v_260, v_260BufferSize); + write_mem(param_9, param_10, param_11, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void Cmd_LinGrad_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdLinGrad& s, device Memory& v_260, constant uint& v_260BufferSize) +void Cmd_LinGrad_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdLinGrad& s, device Memory& v_266, constant uint& v_266BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 6u; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); Alloc param_3 = a; CmdLinGradRef param_4 = CmdLinGradRef{ ref.offset + 4u }; CmdLinGrad param_5 = s; - CmdLinGrad_write(param_3, param_4, param_5, v_260, v_260BufferSize); + CmdLinGrad_write(param_3, param_4, param_5, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void CmdRadGrad_write(thread const Alloc& a, thread const CmdRadGradRef& ref, thread const CmdRadGrad& s, device Memory& v_260, constant uint& v_260BufferSize) +void CmdRadGrad_write(thread const Alloc& a, thread const CmdRadGradRef& ref, thread const CmdRadGrad& s, device Memory& v_266, constant uint& v_266BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.index; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); Alloc param_3 = a; uint param_4 = ix + 1u; uint param_5 = as_type(s.mat.x); - write_mem(param_3, param_4, param_5, v_260, v_260BufferSize); + write_mem(param_3, param_4, param_5, v_266, v_266BufferSize); Alloc param_6 = a; uint param_7 = ix + 2u; uint param_8 = as_type(s.mat.y); - write_mem(param_6, param_7, param_8, v_260, v_260BufferSize); + write_mem(param_6, param_7, param_8, v_266, v_266BufferSize); Alloc param_9 = a; uint param_10 = ix + 3u; uint param_11 = as_type(s.mat.z); - write_mem(param_9, param_10, param_11, v_260, v_260BufferSize); + write_mem(param_9, param_10, param_11, v_266, v_266BufferSize); Alloc param_12 = a; uint param_13 = ix + 4u; uint param_14 = as_type(s.mat.w); - write_mem(param_12, param_13, param_14, v_260, v_260BufferSize); + write_mem(param_12, param_13, param_14, v_266, v_266BufferSize); Alloc param_15 = a; uint param_16 = ix + 5u; uint param_17 = as_type(s.xlat.x); - write_mem(param_15, param_16, param_17, v_260, v_260BufferSize); + write_mem(param_15, param_16, param_17, v_266, v_266BufferSize); Alloc param_18 = a; uint param_19 = ix + 6u; uint param_20 = as_type(s.xlat.y); - write_mem(param_18, param_19, param_20, v_260, v_260BufferSize); + write_mem(param_18, param_19, param_20, v_266, v_266BufferSize); Alloc param_21 = a; uint param_22 = ix + 7u; uint param_23 = as_type(s.c1.x); - write_mem(param_21, param_22, param_23, v_260, v_260BufferSize); + write_mem(param_21, param_22, param_23, v_266, v_266BufferSize); Alloc param_24 = a; uint param_25 = ix + 8u; uint param_26 = as_type(s.c1.y); - write_mem(param_24, param_25, param_26, v_260, v_260BufferSize); + write_mem(param_24, param_25, param_26, v_266, v_266BufferSize); Alloc param_27 = a; uint param_28 = ix + 9u; uint param_29 = as_type(s.ra); - write_mem(param_27, param_28, param_29, v_260, v_260BufferSize); + write_mem(param_27, param_28, param_29, v_266, v_266BufferSize); Alloc param_30 = a; uint param_31 = ix + 10u; uint param_32 = as_type(s.roff); - write_mem(param_30, param_31, param_32, v_260, v_260BufferSize); + write_mem(param_30, param_31, param_32, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void Cmd_RadGrad_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdRadGrad& s, device Memory& v_260, constant uint& v_260BufferSize) +void Cmd_RadGrad_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdRadGrad& s, device Memory& v_266, constant uint& v_266BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 7u; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); Alloc param_3 = a; CmdRadGradRef param_4 = CmdRadGradRef{ ref.offset + 4u }; CmdRadGrad param_5 = s; - CmdRadGrad_write(param_3, param_4, param_5, v_260, v_260BufferSize); + CmdRadGrad_write(param_3, param_4, param_5, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void CmdImage_write(thread const Alloc& a, thread const CmdImageRef& ref, thread const CmdImage& s, device Memory& v_260, constant uint& v_260BufferSize) +void CmdImage_write(thread const Alloc& a, thread const CmdImageRef& ref, thread const CmdImage& s, device Memory& v_266, constant uint& v_266BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.index; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); Alloc param_3 = a; uint param_4 = ix + 1u; uint param_5 = (uint(s.offset.x) & 65535u) | (uint(s.offset.y) << uint(16)); - write_mem(param_3, param_4, param_5, v_260, v_260BufferSize); + write_mem(param_3, param_4, param_5, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void Cmd_Image_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdImage& s, device Memory& v_260, constant uint& v_260BufferSize) +void Cmd_Image_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdImage& s, device Memory& v_266, constant uint& v_266BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 8u; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); Alloc param_3 = a; CmdImageRef param_4 = CmdImageRef{ ref.offset + 4u }; CmdImage param_5 = s; - CmdImage_write(param_3, param_4, param_5, v_260, v_260BufferSize); + CmdImage_write(param_3, param_4, param_5, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void Cmd_BeginClip_write(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_260, constant uint& v_260BufferSize) +void Cmd_BeginClip_write(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_266, constant uint& v_266BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 9u; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void CmdEndClip_write(thread const Alloc& a, thread const CmdEndClipRef& ref, thread const CmdEndClip& s, device Memory& v_260, constant uint& v_260BufferSize) +void CmdEndClip_write(thread const Alloc& a, thread const CmdEndClipRef& ref, thread const CmdEndClip& s, device Memory& v_266, constant uint& v_266BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.blend; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void Cmd_EndClip_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdEndClip& s, device Memory& v_260, constant uint& v_260BufferSize) +void Cmd_EndClip_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdEndClip& s, device Memory& v_266, constant uint& v_266BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 10u; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); Alloc param_3 = a; CmdEndClipRef param_4 = CmdEndClipRef{ ref.offset + 4u }; CmdEndClip param_5 = s; - CmdEndClip_write(param_3, param_4, param_5, v_260, v_260BufferSize); + CmdEndClip_write(param_3, param_4, param_5, v_266, v_266BufferSize); } static inline __attribute__((always_inline)) -void Cmd_End_write(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_260, constant uint& v_260BufferSize) +void Cmd_End_write(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_266, constant uint& v_266BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 0u; - write_mem(param, param_1, param_2, v_260, v_260BufferSize); + write_mem(param, param_1, param_2, v_266, v_266BufferSize); } -kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device Memory& v_260 [[buffer(0)]], const device ConfigBuf& _1005 [[buffer(1)]], const device SceneBuf& _1378 [[buffer(2)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) +static inline __attribute__((always_inline)) +void alloc_write(thread const Alloc& a, thread const uint& offset, thread const Alloc& alloc, device Memory& v_266, constant uint& v_266BufferSize) +{ + Alloc param = a; + uint param_1 = offset >> uint(2); + uint param_2 = alloc.offset; + write_mem(param, param_1, param_2, v_266, v_266BufferSize); +} + +kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device Memory& v_266 [[buffer(0)]], const device ConfigBuf& _1020 [[buffer(1)]], const device SceneBuf& _1399 [[buffer(2)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) { threadgroup uint sh_bitmaps[8][256]; threadgroup Alloc sh_part_elements[256]; @@ -689,19 +698,19 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M threadgroup uint sh_tile_y0[256]; threadgroup uint sh_tile_base[256]; threadgroup uint sh_tile_count[256]; - constant uint& v_260BufferSize = spvBufferSizeConstants[0]; - uint width_in_bins = ((_1005.conf.width_in_tiles + 16u) - 1u) / 16u; + constant uint& v_266BufferSize = spvBufferSizeConstants[0]; + uint width_in_bins = ((_1020.conf.width_in_tiles + 16u) - 1u) / 16u; uint bin_ix = (width_in_bins * gl_WorkGroupID.y) + gl_WorkGroupID.x; uint partition_ix = 0u; - uint n_partitions = ((_1005.conf.n_elements + 256u) - 1u) / 256u; + uint n_partitions = ((_1020.conf.n_elements + 256u) - 1u) / 256u; uint th_ix = gl_LocalInvocationID.x; uint bin_tile_x = 16u * gl_WorkGroupID.x; uint bin_tile_y = 16u * gl_WorkGroupID.y; uint tile_x = gl_LocalInvocationID.x % 16u; uint tile_y = gl_LocalInvocationID.x / 16u; - uint this_tile_ix = (((bin_tile_y + tile_y) * _1005.conf.width_in_tiles) + bin_tile_x) + tile_x; + uint this_tile_ix = (((bin_tile_y + tile_y) * _1020.conf.width_in_tiles) + bin_tile_x) + tile_x; Alloc param; - param.offset = _1005.conf.ptcl_alloc.offset; + param.offset = _1020.conf.ptcl_alloc.offset; uint param_1 = this_tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); @@ -713,21 +722,25 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M uint wr_ix = 0u; uint part_start_ix = 0u; uint ready_ix = 0u; + Alloc param_3 = cmd_alloc; + uint param_4 = 0u; + uint param_5 = 8u; + Alloc scratch_alloc = slice_mem(param_3, param_4, param_5); cmd_ref.offset += 4u; uint render_blend_depth = 0u; uint max_blend_depth = 0u; - uint drawmonoid_start = _1005.conf.drawmonoid_alloc.offset >> uint(2); - uint drawtag_start = _1005.conf.drawtag_offset >> uint(2); - uint drawdata_start = _1005.conf.drawdata_offset >> uint(2); - uint drawinfo_start = _1005.conf.drawinfo_alloc.offset >> uint(2); - bool mem_ok = v_260.mem_error == 0u; - Alloc param_3; - Alloc param_5; - uint _1310; + uint drawmonoid_start = _1020.conf.drawmonoid_alloc.offset >> uint(2); + uint drawtag_start = _1020.conf.drawtag_offset >> uint(2); + uint drawdata_start = _1020.conf.drawdata_offset >> uint(2); + uint drawinfo_start = _1020.conf.drawinfo_alloc.offset >> uint(2); + bool mem_ok = v_266.mem_error == 0u; + Alloc param_6; + Alloc param_8; + uint _1331; uint element_ix; - Alloc param_14; + Alloc param_17; uint tile_count; - uint _1611; + uint _1632; float linewidth; CmdLinGrad cmd_lin; CmdRadGrad cmd_rad; @@ -737,36 +750,36 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M { sh_bitmaps[i][th_ix] = 0u; } - bool _1362; + bool _1383; for (;;) { if ((ready_ix == wr_ix) && (partition_ix < n_partitions)) { part_start_ix = ready_ix; uint count = 0u; - bool _1160 = th_ix < 256u; - bool _1168; - if (_1160) + bool _1181 = th_ix < 256u; + bool _1189; + if (_1181) { - _1168 = (partition_ix + th_ix) < n_partitions; + _1189 = (partition_ix + th_ix) < n_partitions; } else { - _1168 = _1160; + _1189 = _1181; } - if (_1168) + if (_1189) { - uint in_ix = (_1005.conf.bin_alloc.offset >> uint(2)) + ((((partition_ix + th_ix) * 256u) + bin_ix) * 2u); - param_3.offset = _1005.conf.bin_alloc.offset; - uint param_4 = in_ix; - count = read_mem(param_3, param_4, v_260, v_260BufferSize); - param_5.offset = _1005.conf.bin_alloc.offset; - uint param_6 = in_ix + 1u; - uint offset = read_mem(param_5, param_6, v_260, v_260BufferSize); - uint param_7 = offset; - uint param_8 = count * 4u; - bool param_9 = mem_ok; - sh_part_elements[th_ix] = new_alloc(param_7, param_8, param_9); + uint in_ix = (_1020.conf.bin_alloc.offset >> uint(2)) + ((((partition_ix + th_ix) * 256u) + bin_ix) * 2u); + param_6.offset = _1020.conf.bin_alloc.offset; + uint param_7 = in_ix; + count = read_mem(param_6, param_7, v_266, v_266BufferSize); + param_8.offset = _1020.conf.bin_alloc.offset; + uint param_9 = in_ix + 1u; + uint offset = read_mem(param_8, param_9, v_266, v_266BufferSize); + uint param_10 = offset; + uint param_11 = count * 4u; + bool param_12 = mem_ok; + sh_part_elements[th_ix] = new_alloc(param_10, param_11, param_12); } for (uint i_1 = 0u; i_1 < 8u; i_1++) { @@ -806,34 +819,34 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } if (part_ix > 0u) { - _1310 = sh_part_count[part_ix - 1u]; + _1331 = sh_part_count[part_ix - 1u]; } else { - _1310 = part_start_ix; + _1331 = part_start_ix; } - ix -= _1310; + ix -= _1331; Alloc bin_alloc = sh_part_elements[part_ix]; BinInstanceRef inst_ref = BinInstanceRef{ bin_alloc.offset }; - BinInstanceRef param_10 = inst_ref; - uint param_11 = ix; - Alloc param_12 = bin_alloc; - BinInstanceRef param_13 = BinInstance_index(param_10, param_11); - BinInstance inst = BinInstance_read(param_12, param_13, v_260, v_260BufferSize); + BinInstanceRef param_13 = inst_ref; + uint param_14 = ix; + Alloc param_15 = bin_alloc; + BinInstanceRef param_16 = BinInstance_index(param_13, param_14); + BinInstance inst = BinInstance_read(param_15, param_16, v_266, v_266BufferSize); sh_elements[th_ix] = inst.element_ix; } threadgroup_barrier(mem_flags::mem_threadgroup); wr_ix = min((rd_ix + 256u), ready_ix); - bool _1352 = (wr_ix - rd_ix) < 256u; - if (_1352) + bool _1373 = (wr_ix - rd_ix) < 256u; + if (_1373) { - _1362 = (wr_ix < ready_ix) || (partition_ix < n_partitions); + _1383 = (wr_ix < ready_ix) || (partition_ix < n_partitions); } else { - _1362 = _1352; + _1383 = _1373; } - if (_1362) + if (_1383) { continue; } @@ -846,7 +859,7 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M if ((th_ix + rd_ix) < wr_ix) { element_ix = sh_elements[th_ix]; - tag = _1378.scene[drawtag_start + element_ix]; + tag = _1399.scene[drawtag_start + element_ix]; } switch (tag) { @@ -858,10 +871,10 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M case 37u: { uint drawmonoid_base = drawmonoid_start + (4u * element_ix); - uint path_ix = v_260.memory[drawmonoid_base]; - param_14.offset = _1005.conf.tile_alloc.offset; - PathRef param_15 = PathRef{ _1005.conf.tile_alloc.offset + (path_ix * 12u) }; - Path path = Path_read(param_14, param_15, v_260, v_260BufferSize); + uint path_ix = v_266.memory[drawmonoid_base]; + param_17.offset = _1020.conf.tile_alloc.offset; + PathRef param_18 = PathRef{ _1020.conf.tile_alloc.offset + (path_ix * 12u) }; + Path path = Path_read(param_17, param_18, v_266, v_266BufferSize); uint stride = path.bbox.z - path.bbox.x; sh_tile_stride[th_ix] = stride; int dx = int(path.bbox.x) - int(bin_tile_x); @@ -876,13 +889,13 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M tile_count = uint(x1 - x0) * uint(y1 - y0); uint base = path.tiles.offset - (((uint(dy) * stride) + uint(dx)) * 8u); sh_tile_base[th_ix] = base; - uint param_16 = path.tiles.offset; - uint param_17 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; - bool param_18 = mem_ok; - Alloc path_alloc = new_alloc(param_16, param_17, param_18); - uint param_19 = th_ix; - Alloc param_20 = path_alloc; - write_tile_alloc(param_19, param_20); + uint param_19 = path.tiles.offset; + uint param_20 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; + bool param_21 = mem_ok; + Alloc path_alloc = new_alloc(param_19, param_20, param_21); + uint param_22 = th_ix; + Alloc param_23 = path_alloc; + write_tile_alloc(param_22, param_23); break; } default: @@ -916,54 +929,54 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } } uint element_ix_1 = sh_elements[el_ix]; - uint tag_1 = _1378.scene[drawtag_start + element_ix_1]; + uint tag_1 = _1399.scene[drawtag_start + element_ix_1]; if (el_ix > 0u) { - _1611 = sh_tile_count[el_ix - 1u]; + _1632 = sh_tile_count[el_ix - 1u]; } else { - _1611 = 0u; + _1632 = 0u; } - uint seq_ix = ix_1 - _1611; + uint seq_ix = ix_1 - _1632; uint width = sh_tile_width[el_ix]; uint x = sh_tile_x0[el_ix] + (seq_ix % width); uint y = sh_tile_y0[el_ix] + (seq_ix / width); bool include_tile = false; if (mem_ok) { - uint param_21 = el_ix; - bool param_22 = mem_ok; - Alloc param_23 = read_tile_alloc(param_21, param_22, v_260, v_260BufferSize); - TileRef param_24 = TileRef{ sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u) }; - Tile tile = Tile_read(param_23, param_24, v_260, v_260BufferSize); + uint param_24 = el_ix; + bool param_25 = mem_ok; + Alloc param_26 = read_tile_alloc(param_24, param_25, v_266, v_266BufferSize); + TileRef param_27 = TileRef{ sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u) }; + Tile tile = Tile_read(param_26, param_27, v_266, v_266BufferSize); bool is_clip = (tag_1 & 1u) != 0u; bool is_blend = false; if (is_clip) { uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); - uint scene_offset = v_260.memory[drawmonoid_base_1 + 2u]; + uint scene_offset = v_266.memory[drawmonoid_base_1 + 2u]; uint dd = drawdata_start + (scene_offset >> uint(2)); - uint blend = _1378.scene[dd]; + uint blend = _1399.scene[dd]; is_blend = blend != 32771u; } - bool _1699 = tile.tile.offset != 0u; - bool _1708; - if (!_1699) + bool _1720 = tile.tile.offset != 0u; + bool _1729; + if (!_1720) { - _1708 = (tile.backdrop == 0) == is_clip; + _1729 = (tile.backdrop == 0) == is_clip; } else { - _1708 = _1699; + _1729 = _1720; } - include_tile = _1708 || is_blend; + include_tile = _1729 || is_blend; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1730 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&sh_bitmaps[el_slice][(y * 16u) + x], el_mask, memory_order_relaxed); + uint _1751 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&sh_bitmaps[el_slice][(y * 16u) + x], el_mask, memory_order_relaxed); } } threadgroup_barrier(mem_flags::mem_threadgroup); @@ -987,175 +1000,175 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M uint element_ref_ix = (slice_ix * 32u) + uint(int(spvFindLSB(bitmap))); uint element_ix_2 = sh_elements[element_ref_ix]; bitmap &= (bitmap - 1u); - uint drawtag = _1378.scene[drawtag_start + element_ix_2]; + uint drawtag = _1399.scene[drawtag_start + element_ix_2]; if (clip_zero_depth == 0u) { - uint param_25 = element_ref_ix; - bool param_26 = mem_ok; - Alloc param_27 = read_tile_alloc(param_25, param_26, v_260, v_260BufferSize); - TileRef param_28 = TileRef{ sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; - Tile tile_1 = Tile_read(param_27, param_28, v_260, v_260BufferSize); + uint param_28 = element_ref_ix; + bool param_29 = mem_ok; + Alloc param_30 = read_tile_alloc(param_28, param_29, v_266, v_266BufferSize); + TileRef param_31 = TileRef{ sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; + Tile tile_1 = Tile_read(param_30, param_31, v_266, v_266BufferSize); uint drawmonoid_base_2 = drawmonoid_start + (4u * element_ix_2); - uint scene_offset_1 = v_260.memory[drawmonoid_base_2 + 2u]; - uint info_offset = v_260.memory[drawmonoid_base_2 + 3u]; + uint scene_offset_1 = v_266.memory[drawmonoid_base_2 + 2u]; + uint info_offset = v_266.memory[drawmonoid_base_2 + 3u]; uint dd_1 = drawdata_start + (scene_offset_1 >> uint(2)); uint di = drawinfo_start + (info_offset >> uint(2)); switch (drawtag) { case 68u: { - linewidth = as_type(v_260.memory[di]); - Alloc param_29 = cmd_alloc; - CmdRef param_30 = cmd_ref; - uint param_31 = cmd_limit; - bool _1855 = alloc_cmd(param_29, param_30, param_31, v_260, v_260BufferSize); - cmd_alloc = param_29; - cmd_ref = param_30; - cmd_limit = param_31; - if (!_1855) + linewidth = as_type(v_266.memory[di]); + Alloc param_32 = cmd_alloc; + CmdRef param_33 = cmd_ref; + uint param_34 = cmd_limit; + bool _1876 = alloc_cmd(param_32, param_33, param_34, v_266, v_266BufferSize); + cmd_alloc = param_32; + cmd_ref = param_33; + cmd_limit = param_34; + if (!_1876) { break; } - Alloc param_32 = cmd_alloc; - CmdRef param_33 = cmd_ref; - Tile param_34 = tile_1; - float param_35 = linewidth; - write_fill(param_32, param_33, param_34, param_35, v_260, v_260BufferSize); - cmd_ref = param_33; - uint rgba = _1378.scene[dd_1]; - Alloc param_36 = cmd_alloc; - CmdRef param_37 = cmd_ref; - CmdColor param_38 = CmdColor{ rgba }; - Cmd_Color_write(param_36, param_37, param_38, v_260, v_260BufferSize); + Alloc param_35 = cmd_alloc; + CmdRef param_36 = cmd_ref; + Tile param_37 = tile_1; + float param_38 = linewidth; + write_fill(param_35, param_36, param_37, param_38, v_266, v_266BufferSize); + cmd_ref = param_36; + uint rgba = _1399.scene[dd_1]; + Alloc param_39 = cmd_alloc; + CmdRef param_40 = cmd_ref; + CmdColor param_41 = CmdColor{ rgba }; + Cmd_Color_write(param_39, param_40, param_41, v_266, v_266BufferSize); cmd_ref.offset += 8u; break; } case 276u: { - Alloc param_39 = cmd_alloc; - CmdRef param_40 = cmd_ref; - uint param_41 = cmd_limit; - bool _1896 = alloc_cmd(param_39, param_40, param_41, v_260, v_260BufferSize); - cmd_alloc = param_39; - cmd_ref = param_40; - cmd_limit = param_41; - if (!_1896) + Alloc param_42 = cmd_alloc; + CmdRef param_43 = cmd_ref; + uint param_44 = cmd_limit; + bool _1917 = alloc_cmd(param_42, param_43, param_44, v_266, v_266BufferSize); + cmd_alloc = param_42; + cmd_ref = param_43; + cmd_limit = param_44; + if (!_1917) { break; } - linewidth = as_type(v_260.memory[di]); - Alloc param_42 = cmd_alloc; - CmdRef param_43 = cmd_ref; - Tile param_44 = tile_1; - float param_45 = linewidth; - write_fill(param_42, param_43, param_44, param_45, v_260, v_260BufferSize); - cmd_ref = param_43; - cmd_lin.index = _1378.scene[dd_1]; - cmd_lin.line_x = as_type(v_260.memory[di + 1u]); - cmd_lin.line_y = as_type(v_260.memory[di + 2u]); - cmd_lin.line_c = as_type(v_260.memory[di + 3u]); - Alloc param_46 = cmd_alloc; - CmdRef param_47 = cmd_ref; - CmdLinGrad param_48 = cmd_lin; - Cmd_LinGrad_write(param_46, param_47, param_48, v_260, v_260BufferSize); + linewidth = as_type(v_266.memory[di]); + Alloc param_45 = cmd_alloc; + CmdRef param_46 = cmd_ref; + Tile param_47 = tile_1; + float param_48 = linewidth; + write_fill(param_45, param_46, param_47, param_48, v_266, v_266BufferSize); + cmd_ref = param_46; + cmd_lin.index = _1399.scene[dd_1]; + cmd_lin.line_x = as_type(v_266.memory[di + 1u]); + cmd_lin.line_y = as_type(v_266.memory[di + 2u]); + cmd_lin.line_c = as_type(v_266.memory[di + 3u]); + Alloc param_49 = cmd_alloc; + CmdRef param_50 = cmd_ref; + CmdLinGrad param_51 = cmd_lin; + Cmd_LinGrad_write(param_49, param_50, param_51, v_266, v_266BufferSize); cmd_ref.offset += 20u; break; } case 732u: { - Alloc param_49 = cmd_alloc; - CmdRef param_50 = cmd_ref; - uint param_51 = cmd_limit; - bool _1960 = alloc_cmd(param_49, param_50, param_51, v_260, v_260BufferSize); - cmd_alloc = param_49; - cmd_ref = param_50; - cmd_limit = param_51; - if (!_1960) + Alloc param_52 = cmd_alloc; + CmdRef param_53 = cmd_ref; + uint param_54 = cmd_limit; + bool _1981 = alloc_cmd(param_52, param_53, param_54, v_266, v_266BufferSize); + cmd_alloc = param_52; + cmd_ref = param_53; + cmd_limit = param_54; + if (!_1981) { break; } - linewidth = as_type(v_260.memory[di]); - Alloc param_52 = cmd_alloc; - CmdRef param_53 = cmd_ref; - Tile param_54 = tile_1; - float param_55 = linewidth; - write_fill(param_52, param_53, param_54, param_55, v_260, v_260BufferSize); - cmd_ref = param_53; - cmd_rad.index = _1378.scene[dd_1]; - cmd_rad.mat = as_type(uint4(v_260.memory[di + 1u], v_260.memory[di + 2u], v_260.memory[di + 3u], v_260.memory[di + 4u])); - cmd_rad.xlat = as_type(uint2(v_260.memory[di + 5u], v_260.memory[di + 6u])); - cmd_rad.c1 = as_type(uint2(v_260.memory[di + 7u], v_260.memory[di + 8u])); - cmd_rad.ra = as_type(v_260.memory[di + 9u]); - cmd_rad.roff = as_type(v_260.memory[di + 10u]); - Alloc param_56 = cmd_alloc; - CmdRef param_57 = cmd_ref; - CmdRadGrad param_58 = cmd_rad; - Cmd_RadGrad_write(param_56, param_57, param_58, v_260, v_260BufferSize); + linewidth = as_type(v_266.memory[di]); + Alloc param_55 = cmd_alloc; + CmdRef param_56 = cmd_ref; + Tile param_57 = tile_1; + float param_58 = linewidth; + write_fill(param_55, param_56, param_57, param_58, v_266, v_266BufferSize); + cmd_ref = param_56; + cmd_rad.index = _1399.scene[dd_1]; + cmd_rad.mat = as_type(uint4(v_266.memory[di + 1u], v_266.memory[di + 2u], v_266.memory[di + 3u], v_266.memory[di + 4u])); + cmd_rad.xlat = as_type(uint2(v_266.memory[di + 5u], v_266.memory[di + 6u])); + cmd_rad.c1 = as_type(uint2(v_266.memory[di + 7u], v_266.memory[di + 8u])); + cmd_rad.ra = as_type(v_266.memory[di + 9u]); + cmd_rad.roff = as_type(v_266.memory[di + 10u]); + Alloc param_59 = cmd_alloc; + CmdRef param_60 = cmd_ref; + CmdRadGrad param_61 = cmd_rad; + Cmd_RadGrad_write(param_59, param_60, param_61, v_266, v_266BufferSize); cmd_ref.offset += 48u; break; } case 72u: { - linewidth = as_type(v_260.memory[di]); - Alloc param_59 = cmd_alloc; - CmdRef param_60 = cmd_ref; - uint param_61 = cmd_limit; - bool _2066 = alloc_cmd(param_59, param_60, param_61, v_260, v_260BufferSize); - cmd_alloc = param_59; - cmd_ref = param_60; - cmd_limit = param_61; - if (!_2066) + linewidth = as_type(v_266.memory[di]); + Alloc param_62 = cmd_alloc; + CmdRef param_63 = cmd_ref; + uint param_64 = cmd_limit; + bool _2087 = alloc_cmd(param_62, param_63, param_64, v_266, v_266BufferSize); + cmd_alloc = param_62; + cmd_ref = param_63; + cmd_limit = param_64; + if (!_2087) { break; } - Alloc param_62 = cmd_alloc; - CmdRef param_63 = cmd_ref; - Tile param_64 = tile_1; - float param_65 = linewidth; - write_fill(param_62, param_63, param_64, param_65, v_260, v_260BufferSize); - cmd_ref = param_63; - uint index = _1378.scene[dd_1]; - uint raw1 = _1378.scene[dd_1 + 1u]; + Alloc param_65 = cmd_alloc; + CmdRef param_66 = cmd_ref; + Tile param_67 = tile_1; + float param_68 = linewidth; + write_fill(param_65, param_66, param_67, param_68, v_266, v_266BufferSize); + cmd_ref = param_66; + uint index = _1399.scene[dd_1]; + uint raw1 = _1399.scene[dd_1 + 1u]; int2 offset_1 = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); - Alloc param_66 = cmd_alloc; - CmdRef param_67 = cmd_ref; - CmdImage param_68 = CmdImage{ index, offset_1 }; - Cmd_Image_write(param_66, param_67, param_68, v_260, v_260BufferSize); + Alloc param_69 = cmd_alloc; + CmdRef param_70 = cmd_ref; + CmdImage param_71 = CmdImage{ index, offset_1 }; + Cmd_Image_write(param_69, param_70, param_71, v_266, v_266BufferSize); cmd_ref.offset += 12u; break; } case 5u: { - bool _2119 = tile_1.tile.offset == 0u; - bool _2125; - if (_2119) + bool _2140 = tile_1.tile.offset == 0u; + bool _2146; + if (_2140) { - _2125 = tile_1.backdrop == 0; + _2146 = tile_1.backdrop == 0; } else { - _2125 = _2119; + _2146 = _2140; } - if (_2125) + if (_2146) { clip_zero_depth = clip_depth + 1u; } else { - Alloc param_69 = cmd_alloc; - CmdRef param_70 = cmd_ref; - uint param_71 = cmd_limit; - bool _2137 = alloc_cmd(param_69, param_70, param_71, v_260, v_260BufferSize); - cmd_alloc = param_69; - cmd_ref = param_70; - cmd_limit = param_71; - if (!_2137) + Alloc param_72 = cmd_alloc; + CmdRef param_73 = cmd_ref; + uint param_74 = cmd_limit; + bool _2158 = alloc_cmd(param_72, param_73, param_74, v_266, v_266BufferSize); + cmd_alloc = param_72; + cmd_ref = param_73; + cmd_limit = param_74; + if (!_2158) { break; } - Alloc param_72 = cmd_alloc; - CmdRef param_73 = cmd_ref; - Cmd_BeginClip_write(param_72, param_73, v_260, v_260BufferSize); + Alloc param_75 = cmd_alloc; + CmdRef param_76 = cmd_ref; + Cmd_BeginClip_write(param_75, param_76, v_266, v_266BufferSize); cmd_ref.offset += 4u; render_blend_depth++; max_blend_depth = max(max_blend_depth, render_blend_depth); @@ -1166,28 +1179,28 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M case 37u: { clip_depth--; - Alloc param_74 = cmd_alloc; - CmdRef param_75 = cmd_ref; - uint param_76 = cmd_limit; - bool _2170 = alloc_cmd(param_74, param_75, param_76, v_260, v_260BufferSize); - cmd_alloc = param_74; - cmd_ref = param_75; - cmd_limit = param_76; - if (!_2170) + Alloc param_77 = cmd_alloc; + CmdRef param_78 = cmd_ref; + uint param_79 = cmd_limit; + bool _2191 = alloc_cmd(param_77, param_78, param_79, v_266, v_266BufferSize); + cmd_alloc = param_77; + cmd_ref = param_78; + cmd_limit = param_79; + if (!_2191) { break; } - Alloc param_77 = cmd_alloc; - CmdRef param_78 = cmd_ref; - Tile param_79 = tile_1; - float param_80 = -1.0; - write_fill(param_77, param_78, param_79, param_80, v_260, v_260BufferSize); - cmd_ref = param_78; - uint blend_1 = _1378.scene[dd_1]; - Alloc param_81 = cmd_alloc; - CmdRef param_82 = cmd_ref; - CmdEndClip param_83 = CmdEndClip{ blend_1 }; - Cmd_EndClip_write(param_81, param_82, param_83, v_260, v_260BufferSize); + Alloc param_80 = cmd_alloc; + CmdRef param_81 = cmd_ref; + Tile param_82 = tile_1; + float param_83 = -1.0; + write_fill(param_80, param_81, param_82, param_83, v_266, v_266BufferSize); + cmd_ref = param_81; + uint blend_1 = _1399.scene[dd_1]; + Alloc param_84 = cmd_alloc; + CmdRef param_85 = cmd_ref; + CmdEndClip param_86 = CmdEndClip{ blend_1 }; + Cmd_EndClip_write(param_84, param_85, param_86, v_266, v_266BufferSize); cmd_ref.offset += 8u; render_blend_depth--; break; @@ -1222,23 +1235,31 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M break; } } - bool _2242 = (bin_tile_x + tile_x) < _1005.conf.width_in_tiles; - bool _2251; - if (_2242) + bool _2263 = (bin_tile_x + tile_x) < _1020.conf.width_in_tiles; + bool _2272; + if (_2263) { - _2251 = (bin_tile_y + tile_y) < _1005.conf.height_in_tiles; + _2272 = (bin_tile_y + tile_y) < _1020.conf.height_in_tiles; } else { - _2251 = _2242; + _2272 = _2263; } - if (_2251) + if (_2272) { - Alloc param_84 = cmd_alloc; - CmdRef param_85 = cmd_ref; - Cmd_End_write(param_84, param_85, v_260, v_260BufferSize); + Alloc param_87 = cmd_alloc; + CmdRef param_88 = cmd_ref; + Cmd_End_write(param_87, param_88, v_266, v_266BufferSize); if (max_blend_depth > 4u) { + uint scratch_size = (((max_blend_depth * 16u) * 16u) * 1u) * 4u; + uint param_89 = scratch_size; + MallocResult _2293 = malloc(param_89, v_266, v_266BufferSize); + MallocResult scratch = _2293; + Alloc param_90 = scratch_alloc; + uint param_91 = scratch_alloc.offset; + Alloc param_92 = scratch.alloc; + alloc_write(param_90, param_91, param_92, v_266, v_266BufferSize); } } } diff --git a/piet-gpu/shader/gen/coarse.spv b/piet-gpu/shader/gen/coarse.spv index bcac8449768a7c22e0e02b9d59f6cdd0f89ee6e2..fe5eeee188be90b85271b37aad93d5f1f23c237f 100644 GIT binary patch literal 60516 zcmbWg1)wFx)wSJl?+oq^2@LK83lbp60E4?E*l-zPE{rjP2X}Y(0E1g_5+HbjTOe4F z5S&0DXbAuFoYQM=-A?l5{d3;8Q){igYuBz_)qVP$K6mJtbpFYzYLaToYVxX@qH4Wn zs3t|Js;R2Jt#-ghTW++}*l~lGTK>mN>o9HA(el%0x@xkj4{ayMh_3FD8YY9x&M`gx z)n`z|S$~fX{%=y+`yic+JYb`N12)}sz((r~95j0Lz_H`@89rp-@a~aA1`h5XGi1=X z?mdU-H+kXLJ#x_S@qjT&?^DeTA2BhJ_82pv^^7@XH79)BsPTh_4P@j+#*P~^ ze$coj*EIPh$1l^$zTIzj{4$=o&H?Y4_f%Cs_+DeW#|`<9aVP{n_WdDk8EbBMPppn= z9{8SJ!||Q6S`a*DNY~*17#6!R=cg@WE&%U|IaRedeC+Vdt-@2&5Q)lYl-4s`u8{F)QDR$Y~UlaDdYXI0vEeLAYu zz{zb5@Mc}(hFJv9L%FY>8gy3u;ahPk#7FL{^jRBj9ChQ!eeJT#C}z^5O#&WAtg*Cx zI7`=~wcr1HVs(bC3b*I8F8wl}0pRw0`cxZ&&2`HmyP9q*7d2mHz8k~!Q#W6^FLSeX zP1MYHm##s(4<0jWw7NNOPHW%)cg}i{LXq>P^h?g0f!jIvt+oXBA2E2#abrg9-rkMv zoYZ~w0GO~)I`5b zrKvN&C5Li#Bc}W8=d_vQcHs6LJF4x$?KSUH?F1(7y4}Nv6SX~8HD5h*?W}f&*M6;e z%6&EGxii|ouG1`)g{b@g_gU82w3e%9j;hYE+Zj5)LB!1bcx#wAKQ~S0=Sjf0{YMQS zHO2|Lzgi~-de8j&RJ#>^z}6hqe2v+4m#%?>j9^`7soZ>t`QIm#p&PSl$t|rlml4Fw zT)a8RT8#p?=hC-gc*otSd*pyIU4vW8)tZmGuW~-VsrLA`*R}OVi=OMBwNP`tTK5rL z9in;P(bD$m(K@10_&&T-?hEf3G=BuY}ZOyv%^qsXj8J@oXea1R+ntd*9kKccvQP1FwIn{=i+KSy#okg2Doej>M&H-o5&IdF82IEJxC*)eF`RbWZ zXLTXG_G_(|+?V(9?YOg4m%(eF|2~m=#KtUCGX*l~s4gL9=I~2!=5Q&vJ%`R}LVMiS zf|$SDS5N-aRoB4DZ6Ia(@3|2vNtnY`^i2*|gEQZo>X^Qn{NIEAhc_W&Io9>XST{@@ ztE0LR+@9~O)$L&CvSsVW;(r;r-IF=yExtAOEydWk7GvKwaqQ`;UuW!5!@K|gRMNTK zS;W6YehO<|XfURNucJaTA`XAnD+Uxir z@v~I+xa^@qfwW-&|9l zF2;SP828zU<4#|_SdY8bkX^e+dRhIykKNj{e<;RyVd5CGRIk->>&xQ*J!;SC+3Skx z{(ZR^>y?RPbyTl{+xu$f>d*DKUdaBJLCXuEW4=+0`DQWZTNB5ex_S@X{$8PV2i^Ke z?AI#wRC+#6;^*hqcW8$UZ+#SP)$m<-d#_GjeGG1Wm(V+uU(dAqe%PyTXY~=h=lhuH zs?Uwp`m8@_#DD%k%bAyJZ2Kz@V)v;&r7ykO-wT1w^>4M-zUKC+KCAig?h)PIJoTw& zufC&g&wnUa;{W(5x)`*s%vOA`TC%|H50_s0TOSODw(bo&tFMXQnp11M&gvUl^K9qT zS$zw)Tr{nD{DXEl-=)RNwq z=I25E`2UtZWXu>pLbTqC)xDp@zZJvrrqq#_ct)_k)^lF)=&mtcenybb-{1>2_zDfa zQiJzz@O66ej%p+Lp7mHe^s;qUJ2m*gUc93k4sU;7(pilLkLlWLX+pK~9^1>evl`!v zcT{`B+vj9QbpSYV4gr^O4)4{kvpTZDk8b-flW~u0*iUHiliL2v#{aa2{fu6`qdFU& zJg)^O&l|yIo;UaE*IC`#;J3H^C+2xq!~UCIyra4Yo^c-qXWXZI`E^#$Hu!T5{%V8& zsli|G#XG7u;Th}QUbfEa{RaP_!9Q>CFB<&IUc96F8lJJf?`7+(CgFrB&x1*O@s6r5 zJbkC`W#c>O2A{6MXK(O18+@(?pRd6eXz&Fae5nRsy1|#}#XG9y;F-(Hy=2ZSau|KDxp8Xz+a+e7^?Yzrhb{ z@FN=h$Ob>L!B1}RQyTo720yRC&u{R{8~lm}zp@wasIG=*Z`|0+)>-|k!EbKx`y2eh z27jm*@2DPuXRIfB**dGI8vN;AyrX))==*XnTW9rZgTL0`Z#Vcm4gPL}f7IZAZSYST z{EG(vs=>c*@b4RZ62AE9buDV}$s2si2A`_IXK3)58hqvkpQFL&YVaR4_CUD>V3u4Zd1~uioHmH2As=zFvc`-{6}z_~s41MT7sW!MAJh?HjzS z!3Q_W2N=2EV=+?^8Vj_kP|_4~g+aFCVT?4gO4nzue%j_Tqi2 zx8aV#rwtwkweMj+?B&y0eca%m^x}Q1FX64v6g;gQxJ&oQ_WfID^%Z*SLmtWd{g>QV z&-Y(^hC%B;YUI%FUG?eP;`)pnSU;I0Safcc&`0z1ZtM`;(I;#9bJ^+{-w!;kK5d&r z4jao6X1jvUxFCSE5tm3**^-Upp&M4mW)U-Z%A1`UrP<4>mE&MKyfeJ01&HFD&r z7&3-GuNXI`YvkD4kXTdJu?G4ebE0kX);y=eHkh055u-+q;!Cc4^qV-=)Yu34RYh${ z%xR+U(mklh){Z%CY&@GDw0o>QwVf{ZUiq|ZJ3Th@>78raHbZUe9yzp_d!N=kX2ix? zID2w$YcsVptLWHmZRVEdjC%5!1+87T>>_RLxy*`f;^*6erM;cgY}g%PT-UA>t*O!M zwT+$iFSa?bInRIBZ_e5_xNBTjI{KZ#Hxu{uTH}2%;+)ic4Pw9B`Wg5iwdQBu4mPCw zu6-{;X7F8y58QUtnB51A88v?N`fJ;#Z#5k{@5|%5$90ctd$;xJ(LFzEi>D#}oz-mU zJn=RxeDc=safrLos6k!B*B`kjje(4=ohLZ>n@8*1pp)7>rN;LGt8thHu4M0o`j(Hn6dNf>z#ZtkK|WHhBL!M!tU;Q1hPeU;0!Vsd+vO z9x}T9EShKR(e@oOW>jr({7ulu3{H(Yt4-m1jS25tZ3efpTqynDx|V&a&F#l;B=%`b z%&%{?1=`p_W4gxi%baqKTef3N{ElPm2H&O^pRC#eK4u6%02wo|^=PJ?$Bx)WbnV^C z;BT0ALNBfnt!&%t+P4~1+uX-7nD4M!Z|&jQpgyA3Tj%gZy|WsF-t*mBN3|ckyWTrT zfX5EwU0~dZuF>p3YkMx*pi$#Tw!atatgg_%-niOthL>x9M}z+wp0ip1dm8o!dhyAs zN8sepTCSdVk#;VR_44hko@nqVd-0CyIe2?+eXBRXiQ6-uj%sq=FxuxV=Nh;*FoNgz z?Altj>8$!`8#8K`A$6@*hnMd&o@f2_=Z8Z1U4`=LCQC%r+U6(ql8^C+>jh*xU6?mT-->S|xRqA)Ew{YL;A#mdNe0SQXdc4rv@%mKH z6k0oOpXvp))^)PpG|u@Av{pgtT76XX>(Tk{8NF4j`a)vgf3~!q`b@%&Nx2^;ZSXz~ zK3Ol`x0(i?`IY;62K4scovc~{JZ{vuuHo%6$E{VXAL&=W2doS(zr+8@#2B5`THtd3 zZ_)BCe}C3dZG+a{hn>|9;ITvYXkA&I_ipf>`gc?#;SAf#VNWp23+`JT0M4&Mt$X&> zA?PJP6kgWt@CHAP?Md0eIc zVCT_UT@Ow$<39|iwymE+W=@Z`wGmxocgLeo^%A`OTS-@>9p`1^v@Xc)`h4B$)2=)3 zpLKoNRNTn+KJR%3fL7o8v~rpeUe<6Xcv-_)8hpV9U#J)FTP*_rclB8k{a@?Tr&<=h z^?p>pA$YE?XpC0P_}!tHO=~UI2T!~otZT6eTAA-=4ZcN#@6g~oHTcdAzDt7-h5Os8 zti|w#ePn}=Zt%Ste4hs2ufdOQ@M9bN_y#|*!B2&IZ${l(>wQ(jeocd4*WkA`_#F*? zSA+kq!5?k##~b{~27eZAzGJ%DpTVc+16R4eGdB3l4L)y!&)?t+Hu#Ske3=GcuEBrY z;48!PTO!Z#)!=-znD~68KfJux*|gDr^9J9t!G|^YZVf)X!S`(Ny&L@K20ymJk8kj^ z8vL9FKd-?rXz+{SJ=Z*bL({Nd+2B_<_*)JBb}!zy`VgLb^Pb;=^E|glZ|(cfdiCq9 zzG(2T8vNUW4`5v<1vKqkk&Axt2G_KE2 z=L7o+pSMk0G4mZuIga14_-bm+vGps*Hg7e%+t=?GqM5In-vLD99i*lCxjmXS&~Nra zSy+ZT54YiF5%^Im~R%m{=p|(|_`JIN^&kD`&G1PV_ zH0!IjbD_;qYl92T?<@2h*3$URKnH+V)+byaU+zCO-P~_}Us3Kqx%d@%wT3>IZi}dZ^Eg7a>}@`%hgyHxb->`pnD!I)*%b^_`no?g@4K%nNrvsOjfe zuBTX^c{#saOMRmo+w;O)qv@~je6)@qUEhV_#){VV?OQF0R>sio9G0VP&%d*E9_X)T z{2$lY^Fv+#pU}4F+^6EFHZ5)}eYCGZn|N!2?WZ;yb6ty88(W~|+rQ@4X>G7}HOF3u zR?XPPu~r+<8c!d`+K|?GuA%2rKaNQ_jJGkZc6H-zLaSyxARmH}?LtiTw+(ebn3w2hbYRy&ylZ=Ej+uGvFXv`|77HcKeva!L-IZh{GHX zp-m2srQIBkqD>A*gYBc{n8(ms|Mr-jt>1R*tL_-b(dvIJhhrR1n=y=~-7!w3%^0VF z?W3mc^ul&VZBsMenY4*#KkfE8pEmI>02@zD+l7VgBCs|!<6TUfc=o%9!#)#e6YmPJ zebhWJuB1&LZN|B-p>@^z%?;gsuK(Q)-Myv$Ktms2>%VX4u9f~zHFWE%{!&A?PU^2W z^ov@0pXx8Q?mTC$wGU{gr$;tAiaoV-2l+jlCDx*uDqEeoF1H{jA!) zc40pk?fdV0;$Hyw-bw$2UW)_(gE{jok4rftT_3BbliR{|iix;x1O#_A+>4-3dOa_H{4a zqc5-6pNCIfbM5c8?W=nZdmryS=4MxU4=yeb?f=VB#`sUz@xAABT-WVeTFTJU+_Q4; z`_wX*@8Pbq*V#VQ!`Miz{(a#rZA-Vme6m_I{^T{bPvXslW~cajA88EjuFHyW{q4UB z*j%hf>;uuVPWlgqdrug9H{5&F@R4xOp&t4Pc!2Vvda!>BMd#^2b+&yWntD61f-fycVj^Di-C*1GKOYV2%CHMRB zlKZ`P$^9-`?mV2=&HPWtK|TC;@P38;arit1zmb!DW_UmPzYq4@_nyLi`8mXx=CA$B z+I}EBhw7TEsB)OOF&Grf3J2i>y-k=*Bg-f&&LMtiKl)x!AB!I$U2S13%g zRU_m1dkI@>X4`>t$$h?Ca-Zv#+~>I^_jzr}eO6oY`5S!U2KPB_{C#iq`E1F3HXClc zMuYooHufv9_b<5mfCl%uZ2WC~CR=i!#g^P>u_gCeY{`8F8*ctSe=Yfz1y}dEYwWf@ zcP+WkT}$q>){^^-wd8{ud{~3~95w#F*ZBN2+}7u(CHHx0$*(B5^YeLWY4>?)$$efL zuD{Pq!)<+DT5_L>mfUBe;pXcz(QsRziI&{wpCzBI!F>i=+WR&5as@YEpNqzSdAQF+ z!@Vc*d1$zHpNEFq`aCq;cpDd7f1iiOZtJtplKcF#DIbz9uj#zS^A(q_dh$Y{- z!F{e++I_BAa-S`RJAa=qhJOL~xnj7j&lSV<_qk%Y_3^o4_y%yFD~9XubH$STTru4C zq6YU_VrlmoV#$4uSaP2umfUBECHEO($$frUa-ScTTvBqM8HQUQpBaYR`phug`TEQ- z-1_*;Fx>k1%rM;6XND#BSz*b2Mp$y650>0#gyDXU^EqL-*q5odY| z{e4CluD{O+!_C)cgyH7vGs5tL;XWe_H=fT3!;R-N!f^e4Mi{QY&j`cypTFShJ|m1> zf1eSC>+dtdaP##UVYvDFj4<5RXM`p98DY5hr2Px-cs?VH{R+6x2*Zzq`;0JLf1eSC z>+dtda9f`dhU@P$!f^e4Mi{Q$XN2L}eMT5=>odY|{e4CluD{O+!@q$0j4<5#_>3^z z)@Ov_#`76r_!V%U5r&@u_ZeZh{%;jrf1eS?ZtF9`aKB&i*&j!Pd=d;0ZTb~Vv zYxmipd`&(x`2Egz-2bm>;XUXsU^lD;AV_P(bTh#76Yp##=>B=to0ILa|>S*tWVZy zDX>23S>qppv&Q9KUm9IoYOoC0{_2UpEZBM`{&Hab)Z?=}*ty2%$6)=`t)-uB)#ASr zSS{nO3|8}dJab+Jyeda>_IoD#`rXoMwQcjd=0DZO;mbOEj;{{)^RoNd@#Xr7*PwMg z@tU-bxiY={o@Xui;eYlGFw^JN{l`ex)g0n@r*HT(Ccm8buDV70RU z`f&Bsa09TK`Q?1u5U%cbn#LUfRugYT>p3OfxWJnfc+&#=`91!d*Vr0chpphw&sba1 z%EepLrq4EDzl%%lwuM_e{q@sspDk#$W$r%%H|PFyH1*7VJFuGHgQws2@bojTTtD#+ zw8?A78n4NkdY#`Ho_#bBT-Lk`uKm7xFYN+W^BghmPGGg1M?=7gH5i=zJQS=gadri( zCC(tQTH@>mPMmIV;_MFAmN>(~YKb!ptd_Zr0w>N$a5=ZpaP5h;2Usn!Mu63_ZMXdfyU#!N z0_$f#u{Gb1*7)|>zqZ*L^8nfdITG`r+HRYi4+b0KhC1g%z-sPQ$Cdwr!&r_hPTwQJ z_65`V1sgMa`#7+gbTou#FKevrEDkmE7iX+EOp7-7B!RppDac%&2 zaHKvrg7s5Rznj47K8K9oui)mT&Go#3RxR)6w}8v}IiBz5x1wvy`}u8PHD9^*-wwZ7 ztv+Yu`X%Q(!H(y+chJgL=A8BZ{Vwo=wD#AQy{4Z2zX97nbGaL==6!AQzZd@R^8YQm zw&Z^wSj|`RzaM^&TAjaKKXZA2*71_>gJAR3UzXMg)?caG1{KFje4hq)P7uD|C? z_PedN=V)`yd>-t%VCyyR1=<%meA)MpwcR#zc?oQcTpL~ntK}Lm{{x4yj4e*zSHRXT zeP0Eu&BWpP`X^dnUdOb(#-U~$apJrQF4y2KxNBfNj;8%H#~U2_IcK>(&MEP1UuPW8 zBagS?iT@XHnddujwdDC8IC*M&mqX1w#fkGixXkkdxV3wLJUu@?1iR1GuS0VWd<3?i zHf!=%T3^;g+s7PgjwQ}mpMcA;K82TK{SEF|>W9?he+IUnw$$!(u(i{c*nbDBhkpUK z-Z^K#1gq(1y|t-X@8oJLPn~R=_1EtHb8fa7?<=r#$#`Fb)$%^BP0jw<(=Wi&{~NHi z$-es*td{ls4xAcm`v-@bd59C|pJ3yJe-GZQ;FPsjT_%C+qn`Rs3bww+vQ~2a%spe; zHfxjqoppboZzqpFV0GhdPG5O!eZkYArFN6S)ttNj+SDBXY_M~-P5&vdZBpIj@r-GYv)|FKj83XEq_?s zZ8NXA!N$lu<^ika+9{ut!&v4ZPTzUK<`O&GmK;KL-19 z4%(LI_z8!3h!bZ8uyInu6~Ss{4OfC&Lv87|GFaWY`#e}~u8!*%juqckz+QLaD=&TR z6W>+A#tUB!?3yRPpK9aK&v@Ee8uRo$Y7Mya@%rPv#+qR7HPnsS`tC+Mhy8tay_OvR z$>_f}Sk3#d-fy#(-hOtjO`id@>KT6vu-C%ObxXKDO! z`tfKda+trZbsUE7bs~9m!^``G-QeY#?GD#RJ$;6Qoquv40oPC6>(3}!U*@50B!`-L zh!bZIaQ3A8Z4BJ~rXHWMV0CjJO)HOWZ}1@ch3^B`C;M$*us-VfPHjK%UL0;R?diKe zSX*i&x8}*)Hom_ATSw=55UsCo`NX4sAjjJ918CQ)+nE_l{tBPhZTbIJyI|c~7yCK( z3$%IPHnukVWb8x0I~8+26z-h!neH&KpXbz5hr_}4)8-fl)2b!rkzlpd=qRw?@%g=h zw)h%(gggnX zp3mB+fXgwB?{@{KqHD`%?bE<&zHC8(6!}ybw1d>>W+67tykZ<>0y4f3Z)1tC_d{SAgxK?zorGs%6}( zz!}&3jKsYfU0dQ_16GUuTJSu@xYxneGVb+Y`=~qam9%R1H?JGP<}x)`R{2d}hHw4t zl{SgLf4A=qaP8@PGuU|PdkZ*ywUvE;1=pVW-UiNm%YAV>y0*;s4zOD0dndT8^IdSY z%=gz|`=}?c-++^s_A;+q;o6heJ>cZ!@Afn9z3AGK*KfgUvEK(S*WrG+TJm}TY#;UH z^&mKTX)p7-8?HU^9|mV%yH1b5&0V|vcVO2i;D0ka2fA8xcegUo(HQX-XFlvaM;gya(y!A z7r|u>{s=E?@Df}f^^EZ{SUoXb0bA?vSHb3#I=%+hM?EqA1Xj;=`gO2z)y?w-TD9z{ zH^J^HKgYPnsmEJr+A{W^!JbbU=WVcB{Qm+zizDN{1J*}9G2R7V!jTy7fz|T<@jlpo z>WT9KSl!RC&fC56A>915Ij1*h)soA{;H;(oe}(IlwfhA85r=;Em+O<7{0(ePtVenN ze}<+lexDb9<@NaQ=-QI+7hwCUr|*~Gj8UG;U!iM@-`9m-dF}lMU0cTZ7HnVj)b1Z( z$JQ3@JFvR-%oyLxIhuRGVr#QT|D=_R{k^Jjthe{P9dN$~(dKVg<@sK@6YTfO_P3vQ z{XT_j%bN8CyJp(_y{lZCpZ_KY>#xnENCV*%Q;l{o4rr97nE?*x%RY{%%IFv2FccW@g%1ID9$wthL=XW6uUQM((|52dm|K z8Tm{c#xl0}KYc!%16w(dIpM~BpguR|0=rMt^L@z=!1mMT{qNkgzP#7h_CpRe#}+5= zdBEjZ{ov(T^THiVJ^OGzu>G{9w)2Cnt+vEo0IVLqAlUWDwO}E*ntrZ?XOFm^&HPf6C9yev zN3lnjf~%X4zu}f={H4LpN1MOrmOIumwB~B-eq4@rc@AINe_Y#b6Ke&qF~U~_J6`tZ zN??7|-6Qg4IgIUCV)O8K_)|^(O{V7LsTD`X0CWke^#z+opg4J@4 z$XDesmN~RAv7uFe{>NMrYi+Qx?yJvU>xUA87aDB4R z*9WV)|FfnWz+F>qiL)VCJ?G*^U}LL$E^b2W%Q|b@m_yAuiW6s3u;Zuha@RM$wsPxi zU)%KE3~W6z_szj-*}K}*?4Px>&gs7;*!pIkTY)#Hp6c=08mw-9ThPj5+ZJ4Y=KmR7 zpXBp%us-U(C;6L|?ZA66hVQ}J6Ki|0Hpkh9Rvz1q;Bw7&f}3}~a~%j)bDvuKUBJGq zy|ylnT{*0uIB^Gojgz$>3|1@GehA#P*Oq=m!RqF^Gp*bjJFa6mR%|(UVzW)0VPN}b z{BE#wRk!~Rv}*C+9c;c?ui;?trPbpz0<3QT-Du^pjRKebN5j2$R*%mfVD<1ZVDktc z3pQ?kKRFJpk9yX9JlHte%wr_2T4L-4F7wzM?mf49eD(pWhwlq6^Vkn=9{COC{$PF7 zlgBT>#?fXTd(x_j51{pLj*aiV&Vg|6b=*G(gMGPw)DPlNb8W@R=`gVKFy5iG^29p= zoO`Fk!E*0yyze;@{4uS4v?bnA`fy}@j|O``s~(?Y!0O@0g3CU~!7reXdVG!ttB0Qe zwidZ}JQ1vqdVEd-yKbrF$zc7|)9)0py4Ujfohs+h=66N?ndfO>b?bCGt@9V3L95NW z_-_cD3ErGmA8q;^LaUy<&IWJ8@o@bfa1L0_bM|U9*YaGrdfvm%0;?JCJlb;I&xdPw z-7lo|<+`h1z@g^4i<85};PQLFOW<2@q%OY%`@Nrf>T)UAe%j3AB3iY?yd10+{|R6< zKd0o{c?CS*1!_;Gv-yaYKeIR zSS@+o2+lQKTl{VUYct06wDQ<~1y;+N-2zs-nL~fqNzLnO*1*;={f_TeuzSPz5s$>Z z4NY6(-VRoCFI>U8xu0Ik0}}?i-(L zJP$sC*7(}f_YYum_>|p6Q@z0d=xdJd9qraM^|6&NPiwtw6YE9rk2sRYAHiz*?SwWp z`!7Rl|K(_#pDC=%OX!ZD*ss9-ypZ|43U@y4Ic@QK4Xn)=FVo5$?@zRjXX`!u8?iaoIUoK4Rx^M1+q+<2#?kf;hnjK3iSr)V zd8dBwgVl0ht4%HbAAr>|?uTGC-FR-{ESh(U;)ls_hF7HFFi4tLr6Km#2od8Rr|Yx#xWO7Odtu z8=rrG&1GtKyw|huz${g@K8Ln^pZ8C&wyekZVB@Jf$FFJC5_b|V&}zAlnH28l3ibGO zfYt5q1zjFnC)m7lU)%?-=D8T3zO_%TF_Xd7^iAE>;y(qr{H!u1+;KCfslfWE=Y4Hz zaNgInC)PAzZI0vL?8;-C7Q8WgB71QubdWsWgX0SDM4FB#| zuFdmtR&eeu{TpC;?k#5ndv9qUZHYHKxLlJt;NDxR$7fEkdiY%6vd<6T-dn22=Z9eR z@VUVYGym+ndEok}$EP27etc5F_43|wez-Ym%f00SV0G)XAg%KkFGQ;? z_m&HTy|>gyn?C-1wR-Ye6kOidEe3awB&Wr}-q)!o_a(sg(`HQn##${gmjbKB|3_f8 z^1g0qc<$@8r|&XgZN^=aRvz1O;4<#=@RnA8|LbS%AEPC%_Vir=tj)Oo&9^+ZmB8iw z;>vKx&i&#~z-s0F;wo_aX*1@Ev}%dD8h8Zj9sX0e<0j_nV6`&l8gToyY{c|$&s!Sj z0H;N@Cfsw+>-&1NzI^VlE?*nI7Ol_w`_uZoe{F5(>(H`|t95A?q#Z!(`KNz!+yLyD zxfW~)PA#>?ZzHfaua*8gHyeZ1ti$@Wa((^Ww<&l9>Y!~Cuw2^&Y@37o*S5{T@{F-1 zctCCQZ|LQI5AU^LEAZ#E##xmmEKGm)A1&pL3{LOR?`wu7zAZdF=>J9d-cAlh;6S>aY`7uFcPfUEmox%xh;_xi;%Q z2yDHz?LsSGnF_J&)nM>#>nRq=QS2hJ=djiU^TC|={FvpevT>EuUuEpt;}O@aOSZWSe|+83(h?D0n4?S z%l_c(@BP5??C)QI-QUKupZ1J*09f7J99N$44g~A3&2i-!?;x;ov^lOk`}<(9W4gZ& zrS;|hRzHM8&HXGc>!6mTSjRU^Vk{FU$3Hj~oL|ZI1@a zwN1cw95}T-7A)81IdcLy=gje7xi-(4lfaJScqh`zbIzO$_MCAnW7=1rjCo3}r@nG+ zuIFjs@|-yxo^wW9{LTPt%YHi(d@6_g)VOke;(r#{x@OOw4Oa8MFtt7ho?2^9-*ds* zQtR`;YL4x{m2f`TvGW;2u21@304~SA5Uy6fk6#4O*xJ+gVz9Q1eF<1CWB(HD*uMWc zZ@E6{e<`>e`!cwi&zCdr%i$SYd-_fQYs=VIfYmbgm0-tSj988>*T??uyQ{(3cUOVs z+9qJT7My)|4Op&i9JcGh#x>@3wDMf5ZU8@mkMZoMJ$v9LurbSP)vwUhv+g&8)o$cS zzgxiR=a_Q+%5&8B|IF)laOQOzSe|*^3C_Ik0L!(xw|@=JwdyXgJlCq->SABURPDsfo{^~8S= z?B2>gdI+3-q%D3AgSBNJJpxuUFRvkTecdy^2dB2b1Ix8d!1fq8wS5#U*XFhA3Gj>@ z#(bPsuFY%JQ((u@_9U%5*Q%$%UaK6-nD*5tV?I;s_H}HzHrMkx@QNIn|MTEntF*=M z4`6NCZ!dtK<;b;4u21}51efRRAK_}{wdy5!YOOteUj}One+68|dKIo#UVC1HCzkf~ z{S#PQ`0L;@)*EoO@>=pHJh8N=?^|GP;eQ5~vEGKO`57to{0ls>w5RVoU~QXKlePXm z^LN3{+k72IyL-)lgYrGFc5DAW?FSszKG$lwK8gJyxXkM#xSIdwZSwjUp1icD?_a^% z!ao6*u|9>X`S0Z>*5BZXr9FK=18duiyg#S?JBRVrotyuD<`=c@+`a^V#o^rYULe;e zF~0_v`FsOc^WW=DKHtKVkM{Ka2UuJ9ci=MCKjCWad%*Vd+VA0sr9FN9@S!bpn*?rr z^~`NjuzKd!0d{VAuaWDMn4RDVEB}2lxwZ+|767MK^MmCXV*!OMY*-v}MTLi3bE{-eDc#DGd z*XFqLjJFurINBUnp7-s=!H((s_L8)|eBV}If36Ut37?!1Zy*{|0bL~wzb6^ z4{&an>pEaHe}C?N^n3Aj;p+F}BOd@((T?K~vA#YztQNZ%ESbXYllMOu2sL{$7{$^;$twZHLW$>Nw?C z+oNmC_v<@=)$;xNPGDc2Puh0mQ1g5en~%?P2ZD`XKF{45O+B%@z-o?fo{3|dXSKV4 z9mm}DcMQ+#!L+{2L!Ut$yK7xGl%`r)U#H<0IRj{ciZo+2f)+MxytoRj03?tF#p6j2(FfU*_N&FKN!3t z{^@@RT%Y`n=Am#;kwrQ5)$X|V(N^vo_fO&+1}^vA;c&I&p-ru<_W<^I`X5>M&ojEC z;A&-mHT}IV9Rtq#91WIhn}F>&aMtHousq|O0M0%=9xTs3JrV3aHJ<&nXS|cZ>ej+> zRT{SDx`s0UJk~T=Jr{c11>dEVDaO!XtSf0Gj z1*Z<@faThJ-##Cl_wDn*a&x?Z_DqhvPhSZ3ecIT@&{v;~aZ#;j?s9Fu_gw-m-=}{G z&-37N@VCEy+H>As3pPgio^c(Tdd|7)!D{7q-8aC~&oSltWnMReJ@2yLZ-T33ziU$~ z*L^+C7x@gd?u%QnC*G~#$}S{zJqn|DO6`xLSUfqfIUTkJSF*zk~a? z<@wF`@8SBW$LCRS`M2ed!TsCv^m!bvkNN~wnWlPz|1p*}YyFfWFKeysNe(q@Eq1

2rb@;z&=Uvhf}U;mCV{8{+?@SGRV!SzwkXSV0T`MX{}_onY3(6!xA&*25I z{neerA89iOZ7*`DnX@=?UIP0!jNvcC7cO#o1+I^Ja(We)BgixwZ+|{sPYR>}{|-_Z{zm zuffMY+A@cC!M=Crx9#u2)x5_ruMfb!+#A~7=TI{*apHUgHco!K@G)G?-^)e&D_p(Q zK7p%y{~5ne;p*n#dHx|-En|HSR@3$wt$bznh5uckzk_F{RoDJES~dGxzc0aCkf*jU z!17$nzpicNwfq}2b^X7hmFw@n7yS>g@#Am&@8IhCe@iRR`^Z1R%i!a<#?tOSNj+`l zS$Es-2)+`B|GgUH`!{gDrs7zUF}OT&Z`OmSsj>fF|Fj&glmES^{G0Xuw}$MKT24ZZ z?VlP<3fIRuIS08usb5EJ|0i+9$<5kZcVGUuG?Uv*U~`y-Hvb)+zVtH(x&LnWj0IPp zx54Kxxbs@D=H~40PNwGYd!DR=_ZHK@9s7Mol22dzxzBvh(C+-qMO*6O?>E%KX8{{0 z*Q{CL`lzqX_{N?M?D*c_=kxgNaCP^zpW){OtNDGPKK7dnte$i42Vmo?J2&V0L$LM9 zdzM_k*yk?n=FFC<=0Q`>ePlndTIMt#*f~0XYb}p$0kHGcX5HmtYi=C(vioo$uzS(| z`e`>O&x?h@=InadSFV3@UId&uCFe!a)V<~`PV38Sj{0I8YVISkaa{K$IIO$1`D?w- zOV)bU+14@KpG$!q*S#w?o^fMey0DA0x2>uF4KiP|ak#gg=j=6h&-&jiGoJtbT;nfS z^mkwMP>mSDxJ0 z1v`c|Mn zDOj8NIWKu^n}O9FL!3SBp7Gz}_O&oa>bgjct(~9o)y0c(nBNk#o_}gv5>J1Yf8uys zfz>nq)?nl0`ne5UA9X*ona8$Zb#oLaN6#DIFMTb^ksOz*u{r#x(Eabhnd7pw*#|oi zPd~ZsP7OY==E-+ExH0ov!R_H{?o)ltcSo=}Sa0LY#m3e@_1PJ0PGx<%(A4#JY#;oT3N?0qD{@$am1&d5AmZp#<}nyeJ@Xy{wr}pi zc7>}A<;dC%1KUrVYiB;)V0G6{oVD}cCi^LeFaLYgS-VwhY~HJJnCt4aS)bv=DA#Lr z!M)~=Ex3N;3%(b4@0w@sBjAox&V3}Bde(RpSj{zdUCco(wb=u#mO6|9t4+s|JuwdK z-0W|Ta0uG-8B$r4c5lC z9*3`WII;%o)_6_Y0UWNu`m|Yt1Bg+s!65~A4Gu53en&R=(FNE4xPt3{LW7@FaQ#m! zxc+Ap{4DU4T;qe#)U(D1gVnOe&QUEjKNPH%H9iciR<7|8aBJrpSOdA( z`RkuGJ__s_>!VE{Yp9;_jschB9Sc{Rw)XKlb38cXSwp$8te^fF??kZU>7z{_*FZhv zoeVC=I~A^WO6}u#r-L(|Yaln4_18b+oe6e4eYEN08mec!bHL6ye=l(!SnXVn_?!>c zCu?*eSnUFi_*?{bE{St7Sgnk6N$rz3zl5t9C%^Z&6l@NTVGMoTKbO&7&f%V_IGl@I z|KupVtz@^CJAlf_whlTyXtvZSdO*uK!&H*Z(&K{{ntb&2zq82RAS4l^R_S zR?iyT09MQSX3lEyzX`0C^X*q)wdpwYaX;PywiedZImyM&NB``{+raKeeYELgP1G~q z9pG}jJK<{6);^B+YjDQ1CURq05B)RV-C)PlN1Hy@R6XO}3pNM$%!c^>7OZ9s@1wn+ z!@6eA$@NM92f)V6=g9}bYW9DK_F)eDXV1y?vA_H3k=pK_6KBtPPqhPwub**b&;7i{ zThVS;<85iT=Wze+NSpokDDkrY+&@njT>aSwf3D#Azglqp|J2~G*F5{}F}OKdtJLRl zuzL2}6JWLMH*-{r|C3;~?6;@DYUO@=25uc(Pv;~TJ0Ja%&+}mGQs(mqGxQliOhkIvN+U%V-iCONQ zcMGomeuIBdaQDvV1=s(J2LH0=S*y3;=2X$9=6?pOXYafXR?FToN45C>1+136^A1?8 z+&k~Vt%G%SPI9sH(Leco2(~U|J|Cf}>+gK!S(A^!{cty?v9u?zzk2{BWt`n?I;fS&K|VcJ6{vC+&kYFTzwKYXzaF=);zWU27kvWYyT~pdiKIUz-rkG zj;WTKe+O2}Uic?it=tQwT{$o7WR7yN`RSj0I^fQ;%%>AgU4QeJr^bE2{cty?v9vd9 zyszf*0uyrrHd|Qn|s$W#O_=BCC_ES=BdAa z+MDP45!ihl!jW_R&>H`O_OKcsOnW$o=lYSfIoFpXrst5{b8F>-xAX>Iwcz@%Q*iwU zH28W2*MHN3>%Vz}Z&7gle_n9?w{P$r3ahDDY*Xo zHTeDo*Z;7B>wiRpA6anyPb|3pCpY*h1=s(ag6n@?gP&h;{Vy-L{#P{kl{L?`YI(SO zsH)G&zQ7-&sps0c0$45APWO~r&Z!l_YPoi<1Xe4roj-xQZ#@s(gL3gIwE8EX)xhrK zGM}HKsq63ll;<2;9o!FhV;W0)@>&C2=CvkVt$pq6+qx#L1$R8Joyphpy+69PobPLc z)pEYC3(kBzN95+``QbQX&kg$}*Y&~Xs=t2Plj{cHGS>~^YVGT1JJ*fi$<;a7*IYM7 z*Opv20jnj~&A`dk^HXkqo|}#%_Pn%Ta@`VauKMezJ-KcLE_2-)uC@q=&oR8#Zv#%Q z&LO#Oi>@uX{tT>^T(<)!SFa6n^YgmkIN}{>?U!741e>e=`e{$DJAunw2g22cl2dZs z8J=97Lvrl`YfG-XfYp-gU~qEvx+FJ0uSt$09!hJ!ORgipYRPpJIJtUFl$)Q|L&p(&Ewo>99RoI3{q@tHT*rdTT*t%J z#&IOqJ;BMf+^>6~YfG+sgVmDjzTo7#4_Iz~`_Vd%cz;^^CD&ho%~gN>v?tdCz-6un z!PO4rNUjHi&2=%_vaW}~wI$a>!D`9%aBy-x3@kUlBWN8*?0bOylIu}mbJbrz?aB3M zaGC3|aJ6GNlIwBcM1*<2|%fM>Ma{@SdUJjO<+ZD8qA-aBAo}%dLrP?A*kzuYFUWhr#_ALx26WH}~wh*nOSJkv)4> zjZdRJyT)hGp2OjuJ&!hf_7P&1d-jQft3TD?PuDza{yVs1lxzNbH1+JkN5N{@gN~_| zwSEk&mOc15SgqWHPr{v-buve}*!=WQKF@%iXPM8lXzKc#zdSX54%`oSV;W0)v&NSh zkJrTzJT_ZHNJ@UQVwf;Ic;kEJTc1}zg%$jR~!7bnrBXbfICJxrx(!FQ{xxG zYN@efs-?z%1goXSFM-v{8ovU+gkh|cIm*T6r+@PK6WDo{`Mi#%uD|)qQ{y+l{cty? zv9vd9e2wvVUCEIeUsdBPXs_n5uGiA$`ua9;Qdiq|8vNawC+|1m#wqiD3r#(B{4-e1 zI_BK{3*20sn`6qwj;Fuav8-k0{2sg?ee~B)dvne=VfS?%N9KHejh*uiHSVIlk;D1_ ziZ=8Ah?wR4|JvZ66x{chFADDSgs%$j7+=>s^?Dy}4rRSQKvPe>J_M_k_4*j@Jgkd3 z%EjiVzu4To&Zb_U!u!!jfBm#4kH3MNd3=VZp8fneSk2EDJ{R1HSbvABXC1!;CogLu zHy7)muYNnz?;Ei7)@DuQ$@5$AP;Ba3jUGJdH zx_(d0a$P6s=*=fBxa&H3!F|R!Wx*X|s+y;s{~*3Ol|nLBUUR~ohjlSWx!C;l7n@smQLi7u`_V^#{j?{Kxxx2hEAyBKO+9!7cGyU}kUu=UnvP2^eEg~6k-+24NJo9p@rc3%&0 zWL+PuvFrL!jmOhI%;CEJjyCJMI5Eq0U9!QKD!A*qe8GKIwnD)jW5t@Mo{PZEp{(bk zXzE$l#lULix-J2C9@fPil4_0{hlN1`e=<^ z*T-snFzw?UuIrPuS=ZHwS+48q4ZcRfUDtIB?sJj#3ho%|*F5$73EUjYbzKEbJ?pwE zSgl;wpTeDobumY|*!=Vto7;iKx~>WDM<4z5)1Exm0yp#MkEWh=T^p>Hb={v>>%i5s zt^>fy%Ua0I#X9J#-$C@-0BpUrSrd8IbwltG*z9jV?ag(44!f_XII^x!*VuJ^rpCw7 zKFi^{K2Mu<-ISQ+x^CX!TNK=N{aL|}hHqDJ$JoB+spm#;b12t!V>I=w>n32ea$Prr zI}ht(j&ia2=`S|7V~Ta%65fwK`s=4Xd29u4=CL)Jde(Ituv*sjC}M33SI@fs9GtwY zh1^`MgTDG5OTQh!)?1r3k!M|Z1fPt}{`S+}T-O(|`zr4#{s4E4UDp>lT+2VwW-Ysj zQ?BKp1|MAW)MO{PamuwBh^C&k*%_=>uFWoRb8&8tDHl7Q{$j^Ey;z$e@P72sUq9{5 zIlqS8*GnAP%P-g1IloflGiYDsaQ=Uy&HTHGS-t8GUDr2jd=c$i9Iorzv{~2viCM1e0S$g&!ClwG3-0$YM;81d_)#@aJ@-r10^RO=FC>NWb{$g|6k0bRu2;7f8`s=4Xc^nLG=5Yv`de-$&uv*sj zd}192SI@d00Zv}lLT)bBL0|nYq~Fotw`jFl6M6DH27DPd``b@@b6wxV?&~icuB&VG zPK{lMcR5_k_i4+%Q^G&y@bv*l`hHmBDQG|9ua8kkTb8^k|H=@VF zr<|nqQ?SV}b9GZImM)Y{Fn$JV>UG52Rb?f4oet#o&JZ;u*a$=nVHcxGiEw_Ho z?^N(~wDz~3c7GSFp5Fx<<8uyQpK#>d__W5J8-J^@^Zty(n*5#Cn#@36=M%52$%O^K z2)_vhcTKJ?xbd$oxc=AIJbUsCxH**P#+hj9)}b$^v%uz-zsWxvu8;bc)aG1TU;Ztg zwsSbtoQv4HEXQ2r>ekbFT)>gPF~0~rGcnY)J8w1fbnPz&tK~OW*7g#(x;b1*>&qO} zf61Zdm|}Cdtmf)||8HHd02|l&mo>N&O`G2-c`jWARx>wiF3-5yr?lW4)dzxUrrpxc<)+T>qB~uK%kA z-xmIM!S(;J;QD`DaQ#22xofpG{BF2;-%gz-r@a@hb`OVp`94}-?qzMi<@hs)^AunP7T z^c?sme2iy5?b*|R02{MBCtg5P&z^n}toA%d`u!1{evT>E&wpdWx>`ePnR&g^vbFPb zU&%AC*T9*Vdra=%!+1XY3H)nX`)JGfuY)tbaXio7KvPfNZ-Ujlhe*G-;OS@Ha{bD@ z&0p^Ra~|%w?1jI8|J`1A2VI-FxVPT}ySEQ#-R1AY-{nwuFKmPM0oZ=p%*FFbEj9ZH zoW0<=B~Q)%3Qo;D&*a*S`zhF1#`K(%XD|E>?DzA=v!C|V<}+|=V=Qa>IhuNE`ggEe Vxfi~Gr=MfW^($*=Epu=5{{g6=_aguR literal 59320 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Ð{!6?|I(^`#p%ZKZ51?UinX8 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

t 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 diff --git a/piet-gpu/shader/gen/kernel4.dxil b/piet-gpu/shader/gen/kernel4.dxil index c4446c5619a83ed5e5d47e218512dd827d013934..c48d59da9624714bca7fe6b0ffc02834646dbed5 100644 GIT binary patch delta 4522 zcmZXY4OkOby2q1DG66D#1cgo@nDE&M5hkEODaM3g&_XSCQKP%M13^Hg8ZB$Bjhin- z(5wkUZTt?lwdvZ{L|nyN+9o7ApjdImHr={3uaG`!yEiv!EUAX$6{Y&Y(vHL3Op*RTh04s|u=nT}CQT zT9yJ8@ z5K0=B;+gp#g0fVcQ90>w9Wb#iYNNuZ^iX)I@j=w#tUrin7#*S@`Ul#SgMYvj*{*JE z9aq-am3{}8F`<;A{TiZKWHv>w=bw0G_gZ&#A08psI}8&{ez9c|N2Z+L8BDWnD{*L5 zrD4?$oQ%{+nS;{5(8WP|YV0)H-cPiaio2<))pUsWG8*){oJ41t_*C(v= zjwvs*POR3qV-45Gm8=s3gjL*OihdjBB~BsY{CgUXy3y-Xx&8h@u42J7%CR3-H?p8Ndj3}2Bp?68&{IBz{3ae3(_z`f~wZQiYPFJgotmSJ^ZvMAhHj(IH5~8P% ziEDu)iGxocquj!8w`|7fsW2Vvy=wgER~KE}!C0e5Rm!!k@n6dgl6h1&`z_~2SHV>u zeHTk{dQ_@5GAWP31CPF${&1s9sN*3`XbCUaWT)dvewV5_$r(~N_h~|MHGdP3v!bjl z?~RL4?_3c&Jv8Pi|UP6cOxI+QMzeO!dyVm3hVWm)j+vh>fiLm zD|%>wL+ORPbxavX`!jQi^qk>!biZWxR>qgB;T4kIcwt}M<$1w6PE~RoC97aXtBGcp zoM0Ouk`ybv_t}qM&%>G+V|nG)C@87L9CbG7D5a5Z!?>eScS8fGI-*=E>O9-8!4xz` zY8LhKW;=_=Xw-?r%RH6z-Nj$y58^!l;IzgUN|uSwGg4mUeZRXMpz}Wf6$w+E-^^7v z`e;F~li_#hUhpX|=kycC-^#{NshaZ|-43p&2O}a~|BT_Bcrr z7IN_Wn=ij*-(h)aT2VZ7R4tsdahW)O7359I8CSX&_7g4dfT${>^AfiM zSN*_X0{Ac#GwJB!0dC2$i&g<{`Q+^y04_PUdKCayz5sxG3xHc?__Xx)0I{;2lks>~5FI6{U<4Qv^FAg~wn{qZ2eu;LzrXId1(4t?5Z= zDvuFAt+)d=e{)2}CA~vy`orQh9%Ih5~ZDW z0FNXGoNgD*?S#$K^*4LN{w1PDr zUudJ4^O1E}aG$eoaMj8<%RqAP}k(Y?@>M^JMnBtd;y5N_U!Z! zgCX&GAWoT9ywg*ru2=}f)}M(defa77rxKiWV(oaxc71!~8V)Kre zB;t7E9CiZ%0c0mr z0*+ac<4V^qkkGXtp^t$q!TVQedZS=^U$pM?5Q;SL`o~~;|CEU3skyN{Lp$(R+xpB~ zXnjjURJXN-GSAk9Gd2otQ+VV0gs2`Z+-q&=%l5f*Y+XJ^kj306(7GjuTrGVT$;O`hYF| zm9Isg)6>ObZU(lkE{c|qR{agN)cAS-eS_D49<9b(Kr)}{9!HPXNRW~Qc&57qB%O6g z(1JS&7y`M60aASBhf3#O7oWNrJy-1v>A*JvISMECayf zXZ{G_>1{g#xHS}6Wf(V*u{8y3>>X8%ZuH8hAp5UE07=LC3B64GP1fhJJVq@j321L? zQl6r8+pTIo?rQ@mopTofly;td5uoH`K4f`&n#dI!s?MdOd`G8*qVqIt<@KjC&*V^hphH za*`ASJ{70W?FF9-k9#3ip7Rs%@0*Z+XF&?laEQxu@Li-;BhiwFK*uPgTR6*00eq)7N*dOZA?t6-|D#pzooy_Xf6kNqankydw z3xCL>bDvt+1L}_}=Rgl@0Q7wDTm$fLi<-bsmK0fRc4kJV9pd#E+M@1j;Q)S;QtX2k zT5MQM5Rb{o90vI7PEv}@vLY+6edJ_5@-YRO=b*h&0WGk#+9WZ8%s~xQ4K5+$E@14J z71@CCStm0yv&XPE>b^53Ujp)Np{~tPhvR#8J2?0nzk@H@_+2UPC1{oco41 zSl^dQ!?~~eBiDYo4C9K9)=NOF^4YPvbh%pi(wH(bmX{bi?X`kBXtDUR039wW_L4ocJHDcIOv6I-D+_Kzu_a2mk7 z%qF&8ZA8bFhhGR~C^UJ9Xw`}HTgmE16s(a1_8&?|+jL{j$`=)^k5~CSn)0%fNF$}> zkrMKVTz6}w?pBrVmZI8Phz&=^m)?zQ?D#4#TZ0uW$1YT27nYO$w1Tt%{I5g>OyqZZ zTKi7gd)sKUHqp#Cp^mH2K{s^cbLcPK(0g;~=acCdhv?pZ`Z_;-*92Xb*3VBHJi}~I zuxOn464$qKY0K^v)@o_oJ!4#>{Y21djQmkX}rWB9n^@L7*Nmh zg0lrrHdw(C?^77Zu1aFl*@_#ofMaaWm~t_CiGVpkk_RLWOT_s`wz^S}3hGX|-@%Jk z3B>WXcC~OQIXDn zhIdu<()1;{OCs|nk#EH>qa3Go*d@R@Xzl<(T>wh;jUeiVC3D1bbG!Nze(JPED*w6H z`zYWHd#K}Y3(_=Z+5t(e9;vCZdT>I^{EaS+b%<}Up!xiDZK$>y>U+0^3>s^eh8p^J z^<;a~&hJRDJDPkYw563!Y2_2n)Fx8g)Fx~ACxu&${Ildg!sG#X=2rzRQic5XRqI8* zut{*sT4%t!WFN!%i4lyXR~GcF`VP0c(D|qVRtlRWxA1y{fugKB+3i}P>ehWjIZs~c z>~`HUe?;!oend8+g`v}L=XqBz+?x;~y$0_)z@1F+%FdIKmPGyWXeWNqm9a6!sYSbo Y@=ufFWCOG}?CS-eOQOLKDbN1?7h=8~bN~PV delta 4560 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 diff --git a/piet-gpu/shader/gen/kernel4.hlsl b/piet-gpu/shader/gen/kernel4.hlsl index 408dcfc..0a6c022 100644 --- a/piet-gpu/shader/gen/kernel4.hlsl +++ b/piet-gpu/shader/gen/kernel4.hlsl @@ -1250,7 +1250,7 @@ void comp_main() CmdRef param_41 = cmd_ref; CmdEndClip end_clip = Cmd_EndClip_read(param_40, param_41); clip_depth--; - if (clip_depth < 4u) + if (clip_depth >= 4u) { base_ix_1 = ((blend_offset >> uint(2)) + (((clip_depth - 4u) * 16u) * 16u)) + (8u * (gl_LocalInvocationID.x + (8u * gl_LocalInvocationID.y))); } diff --git a/piet-gpu/shader/gen/kernel4.msl b/piet-gpu/shader/gen/kernel4.msl index c12e307..4d7068d 100644 --- a/piet-gpu/shader/gen/kernel4.msl +++ b/piet-gpu/shader/gen/kernel4.msl @@ -1304,7 +1304,7 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 CmdRef param_41 = cmd_ref; CmdEndClip end_clip = Cmd_EndClip_read(param_40, param_41, v_297); clip_depth--; - if (clip_depth < 4u) + if (clip_depth >= 4u) { base_ix_1 = ((blend_offset >> uint(2)) + (((clip_depth - 4u) * 16u) * 16u)) + (8u * (gl_LocalInvocationID.x + (8u * gl_LocalInvocationID.y))); } diff --git a/piet-gpu/shader/gen/kernel4.spv b/piet-gpu/shader/gen/kernel4.spv index 28d4cae6c7fba8be792b18fbda6f9c76e9dc1142..c38894159a01685a4f3a553e68d4dac6c41b07f1 100644 GIT binary patch delta 16 Wcmdnc%CZ57LOK}NZ4T{-t^xo&H3t&_ delta 16 Wcmdnc%CZ57LOK{XY!2;+t^xo&K?fB8 diff --git a/piet-gpu/shader/gen/kernel4_gray.dxil b/piet-gpu/shader/gen/kernel4_gray.dxil index c91d35df922eeb4350c523d83f7f068166f9fd65..739016756ae6b9bd43c267881383eef4991c322d 100644 GIT binary patch delta 4472 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 delta 4543 zcmb7Ie_WF1+6NwZ5P49rum?dwF>^)!fuUhAKJQv2P#{1dN~Dd$(a@(BbLfkL=VClF#|0st}r)&cA#rJf%$5dz_6 z&jK2iN)+@gWiBEUD|!x3R4_?}anCE1I#>uN5R59<>1DR}{t{6iq!Gnn7Ggsas7Brrm3n#Ko*GKgp%)_POHTE2 z*l~kX{z}aiR(X2OPS%6TeBs?HtUUBSZtc$>7rmwZ{Q2|k#l4fd)>NerPSssG_EFN^ z$qhW#89^UfhME%8nzvSe{%1OrXst11@+TnUK~;Ysp%j}*#SZxx-cJl(5tM#Ku6nM} zA0W-gaulO(?+zQwfm@X!wV%Wnrbbb>r@md4WBphX4O%H4Q_B5_wjXM@TSw7j5|GF<2{JsU-*!;HC>By6b5kFW5wUdi{of{tR!3 zPgB1g*~=a9TD(NP0Oig8$GX?W)E=@>!edcCPQ`nWcRf_E)}P+JJaVBRD(92WG;Ct> z51RB?{Kiq<*)Nxit3p&L-F%5UH~qHZPgGpYtD$}#Lw7^~nylmdWAH{&E;(oI7AF7v zGq`=gMbX^xK2R=s-$WpR6hKLz0GiIP^U+52@%aIT5>YWp{~~C#T+<^p)=aDp8Ih-N8Es}k5J4_hHvDpTu*UC+?I`uSZ_eAOL`-0kO+P&t{We{cQM(XJ zO_omKZ=>#MvoU6XNE(u`!XOXV^is!z+T>C9jf}9m^jmKL-UmXR0~~&nV})ZTTr*4s zywx{e1iU3zK3oBKtJjf(G2$*_e8(uC35a`DHI?}GsC$=X&Uo;}{(ZPcJ0}{9Y>c>x zcSCAgl|PWuZm~@kvH0A_i2*Lfj%}>Qt#=$z<#ox31Xz=>gG90+fRP%g@!Mr!JuM$3bmv8pp$Mr6 zHEjXgD=h-s%OA=bk)+bV+33Lb=GbkQEmnU(l?|d5WIc&iw%cIt6FEC%^wqgRQd;71 z5A{pEnKa!=%y)LU=+OwUM@d*Cl$ID0E9$yB#PqO?-jEwK>aam07B;3O_Bzd^{4U_! zkoyn}PstihkDXn>`Js%i0nVa95;yTn4_G(?<-34y5PXKfR3pR%3$Jv=lKRym_#^aT zlWr`)f$PwnHE}b0Hhc(Wn)GIG%Ot-yffT>w7TUd1oFM1I8nheW z9@U7z9QX?q>5FHl2pU|eAjk8&U#-|Cm&Yqdrp+)7t`PGimKqs2`J1vN!{l;YGucZo7Z(Gk?IS1QeC;k2CXEF|T9FrcQ7^ zcU(zcZR7six@JI4mv0`qaQclDKK*sjl2CM6e0tWnHu9f{QMN)xVJPN8EZI2*H#0n9SaJNX5}}pXB~1GR^grih16= zPqVYLBNADET=#?flrUbETOnG27TJH-iI+r5J1cY&jE+uVh%q6$XywB zOjj@sm`cFSDYu?tWV_{^q+)xQJt;e{8){Cx?V;Y4b(YL=%IDg<2+2`da(3PTgayIW zeIO@Cmp&?lnZ=CE~q6@ zcUKPHV_v5-*s)09fj?%yCu37-k;0)Bp&AT-4n;fP|)h3Ub zpUUZvYC6sduM#JC7sADyFn~Q$Q^h*?Am^!?PI2tIx~Fn_SSQ}|R8GYG#5IrPNx)&IZ;4O>WWGu7YOyQpQ)2c zqvt*OCYI@u`8R3wf~S77xxPe7xDd*RCK#hiLSaNg)P&Sf&{OYM5kYH_$71wLQC*{F zhUsrerSwVddI9EjAmS;2&;WreD%&K%DNOtFkt1#n44&{F<7|94(j-&WQc9{CTn!A z_?Kr_A8YYiIHs{=Aq!o9I*=g3%4Y7pF~p(xAVU7GAAj z#&dIUjq{+Fg;XFvbC{saS2mWl>8DLENN6@B`UtebXw$!6ZzRy3hi>d$#cXa(u=WnA z$*Fwde??JUTWH$UrOqPp68CMf#c=cCAuDnWLs~ zZ%+X|=bvzm>p(Q9FCBGfHi7my>1+W0-C$!pg!tSj6}w;YZrZT6RC|Po4iwnS=96C< zQ{dgvj;NAVKH`>}0YeagNZVm!sL6cpxdg260~S6|0r6UFl!k0R{mlfdM@N=Q1`3M` zypFOrQ#LRsOnA{Qf3YZ!2v3!}%eY7VX}$h?DK&%%J>&vOm0&{ZAtLv5eY-5Dj#j%8 zT&k;0g)N||s17>dc@qyTBkdL!Fz{T^r4-bxO7koN?;5pz12ZfKqru&9%_9fLWIN60 zuf)vnwc>~{UpVeSuC?OT=DU?xPU)s>z7z)Um7ai=h#f1($p_-7G8Jv65_l~!W}9}Zpq;Av8`*=)#58)i5-YUtz^fIYe{#a3 zk`hK(P3D{pBo^$jacV(;8P6ij1?AV#Y)CPsL&bK=4q2@cS=m-rn62}$D@m=i0!woZ zG_=b?L<3iY@mD&C6pe1pP>>DGMyR%+=Ebf|(BpQpjDwcq2_l zTc75cYB4~d<*8P4U27Fb49s4QmKSh;W|)j|J*wW!-fIM;j-%= 4u) { base_ix_1 = ((blend_offset >> uint(2)) + (((clip_depth - 4u) * 16u) * 16u)) + (8u * (gl_LocalInvocationID.x + (8u * gl_LocalInvocationID.y))); } diff --git a/piet-gpu/shader/gen/kernel4_gray.msl b/piet-gpu/shader/gen/kernel4_gray.msl index 04f3d69..a190ab6 100644 --- a/piet-gpu/shader/gen/kernel4_gray.msl +++ b/piet-gpu/shader/gen/kernel4_gray.msl @@ -1304,7 +1304,7 @@ kernel void main0(device Memory& v_297 [[buffer(0)]], const device ConfigBuf& _1 CmdRef param_41 = cmd_ref; CmdEndClip end_clip = Cmd_EndClip_read(param_40, param_41, v_297); clip_depth--; - if (clip_depth < 4u) + if (clip_depth >= 4u) { base_ix_1 = ((blend_offset >> uint(2)) + (((clip_depth - 4u) * 16u) * 16u)) + (8u * (gl_LocalInvocationID.x + (8u * gl_LocalInvocationID.y))); } diff --git a/piet-gpu/shader/gen/kernel4_gray.spv b/piet-gpu/shader/gen/kernel4_gray.spv index 93ce73ec179103b7d6f61e13f1b5e2ec6d638a53..17c75317fdc52c79bd1ffd7073f75e80d3b670aa 100644 GIT binary patch delta 16 Xcmdnf%(ADMWrIKm= BLEND_STACK_SPLIT) { base_ix = (blend_offset >> 2) + (clip_depth - BLEND_STACK_SPLIT) * TILE_HEIGHT_PX * TILE_WIDTH_PX + CHUNK * (gl_LocalInvocationID.x + CHUNK_DX * gl_LocalInvocationID.y); }