From e73049fe984e60bea9504c5912845a2d365dbdd0 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Mon, 16 May 2022 11:01:03 -0700 Subject: [PATCH] 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 zcmbWA2Y@A2wY3Ynd&oKGAtM5kB&Q+FkaI>HdS-f{p(ikbjO3hiQji=~kgOm%sALgQ z5kXWC6$vULApiH>TdVtYJ$=02`>c1?T6>>;_SxrD-MY8#G#%3}IbBsvQ_WaSU;S+Q zs`Z+qnii$1W~zp?+7VmtwDn4pr;J%?^)Iii!>m!5Xai%;SS<*jGGXfI{YEnKa+9Y_ znmT&Qio;BP#i^^bvTygBAHR%et_#2i<~>t26n^le-YGr*F%E^m$G(fuma!Iv55(%I z7K0zu-G}dt)zaWeJ>6seV_59QT#~koxfFaL=1kQW;gkD%M}K~P9o2Hi;xO(P2F2;D zmN!oSnhmK|gm2tCev9#wr*w}W-LqrQ*!CK!`x?k$)@oIF;XAT-{Ft6YQuD$gFr=Wp1{viJJM2>K=W-m`M{Rs+;pxwD$eqbJl|tik!EgUvl0O+|GGOwGDWa zabtFxGHJpA?cLbUN!`~#-d)x9@P1#gd8+v`cXDFZ1G@R|*WEXE&$P(v0QbC=|0h411lS^V^%4ncr8z zncqlo<~OQ6?j{rZCQNdI?k_c81M};uxa6B(%TJqYspf0azN5NFjy8gIou}F#Exw;W znGD^SO-pWRt-0(=%*@3TH*@I)x92jX>T8d?b?^8Qle)*Wma8=%bzkLteB&p_+PA%~ zt(yV#T>q?vn(Nhif9L8D&HI6tcIbe{ZA4q+4ZMqYFyBxI#`ye73?$yDMQw0#$JYOI z6T8L-GDhk``TOf)O;VSG+Ij5QJ!WuS)P0q8ISfwDwQqZFYQ6^Q(pjllmvP-wS~Zbd zlSBFtczGwKW=%%(rV`!>pG3meQG1u11ZcnuRY%hfjQ{yH8<LqUNit+X-;;Zux0*ermo3>ekk*+d$uW ztJC1=`}s3YDvkNJEGa4AYF{j$lQd_Y*s&i>Gr}My>)A``6*+pQ+ z-*W1>_JmvuHD3es>8vh+*M6<_lKb-hx*d0(>I!)6^Z660M{LYOHB%syj_T{g%pAS} z&KxcWx98AVUD+PDwIJp%_cf6JY}IveavMpRK0h}iB?)u5hQ7(+T5#rjOC8fUlmC0r z|L`V6EXTUB80)6~u{x@o!R`6ZTYVSoT-rAl|INtlp3E_C@vX7HQ;dCUG4^f!W6xII zm9Z!E_5S}<(z)GH#J{sY{@m4lb&VAE%@GKDb@O`KyQPG3&RB z|7O(x@J`cS#|MfW9t3CKJ_K&(uweBh*mbNgzyD1RpL6AI=kgfiWdA;1K6Y!*K39zKeE%5pR4>&xQ*J?g;eIp~V&{{3k&)=T|kbyPnCx7T#;>eYH&FJ%ACpydV7F@IT%`ARY7ulmQF zxq1WK{=DD1gKmBF_Un#%Dgz%U@$+-*>$E+6t&gIu8vX{}-XGIfZ-HB%@dtK$YGmBq->0=RcM!@&ERbCxh0N*_jVkD;Bu@;nGWg>x04A*1bVz^#So) zb83y(S^bsPJli>SR)2$AE}GUn{!ZJ+cU<*HGqjHCBeZsnxvQI|d~fQkriE|QGj779 zL%mNJ(&ENy)wTXUD>|+%y=T%SKSH$Li|s#cTW`g1yiOf?iDw4uYdseNPwbx5J+9`9 zH27i-zH)=F+TiOq_=bacM>QPoy|a1j4Q_w`(OGqaCv_jZGNx8uV+Qr>ti}%F9aS&9 zeU5ch6Tpcx8C=FWXi&e->W~IMtnJTTc6;0-8}_3b{Ft`?s_{ReVLxdQ@2F0NC(p~l z$@403ndh~G`gK;4Vhz4{gD)|NcT`KkQ-|dT**dEg8hphDU!%d- zYVfrie4_^6xWPAR@GTpB>jvMZ!FO)(T^oG21|Qkr-3>mf!S`?Qz6KxH;8Pp?;08aW z!H;h6V;lUq20yLA&uH*78~maMzofx09mM&(1kc{MYLKn7x~9ReZSXr9{H_MSdl2ua z?uBQp2L{}i6!Ix|Bl^T5I24AJY*KF{$8+@Gx->AViZtzVSe2WI(s=>Ez@Esd`=LX-U z!S`(NuQd4H4L-WTdm4OfgO6+Q2@O86!4GQiLmK?h20yyNk7@8@8~jYT-y3lc-MaTX zyJ5c=zCWLza?kbkhW+ve|K=dxRox5s{@hOkiSfW7AFfXg{z!vA)!@$z;$78CaL3@& z0}prF_maOF0}gFca`ag%#|HZX)|D_lf9$Ahb*)}E~pJ3Y0YU&R~(Yw%@M*rux=tIyaP8r=7L&l#@y`5D|{W(vMt$Y0V z2{9zr4CqrPb&sE18xm{AI@U-ZO!nKRZ_RTiY-70j9yek91irM&N4fs7X2w3+uO9m6 z)2_iR(MR=;9p*S&?LjN%pnTeKXUAqfgL7@$=BRDG5ui^9?gD7Lg}dfTx))& z{VUjg*S;4S()x|czI`Kin=t8s5tAlNow&uO_F)&Yad{t|(mSPhLfgBoPlN9HQCmC> z@#j}5=sdwTEPVRb?_P+z^@P#geOrt_h{ixh*WOjljK6t!wv42c+U%vq=X>MMZQOpJ z&T9VfmVHRIuzbJX$?ZU`;ajnmMfaMM4Q#A0qLudst2Fqk4ZeCEBj2a2Rr7)GQ@X14 z)jS`@^h|6&TOLwv5bdy@NfT;=<8O#QX-sO=S#1PAcvAR~Y8c$ga-sD9*R|}bHntzX zc{sE!F~8}m5iN}$VoVy@dPGu=zd5#X-G>Y^*k=p$;@obH(q4}t)wZ?G{TGA#V5eGd z?Y-KdzI&~=&b@xUv)UVd;5)94YAoDmsjlyV;K}=O^`0`Wdm=l>nw*F>dcxH4?eC{L ztMl})H=On>;N_ZK)8N;`a~A4;Gl+Lp>%o~ve`(BfCp7j28FW>9fd~ISr>oir zZKu&a<9phdq1JUs&DUggTH}nWHTO>+xY&!Mx+nMG(^(ye?)B5HE}vR+W66(b@qzE; zj%o1Y;M`~Qj_J{VNOg*QzxLH(K<}u|Kp)dumyYUuaqD{0QC$W;gm2o+_j2%|HNH}v zZt#y5?H;r?A3awR;)|`h_FBkm= z^sed^^j59vi=2J`(9#C#^QQ*?bA!Lz;O`IOyg$G*zj9xHg5KV{(^d2Fb}?nblcv|Ca)n-=#0DtzOp^!R7v6zvWy04y>aZhSuJPoz)2NXkvpO-QdSG_;GOFm0C9zo;N48 zc^+rCaybp{f1U$FslXFl}*S)ZMCxw^P9S~csamJzezti@{J{`oxfB2H(8Fw`}mO8+?1Xzj4Z1?AoyJ-r##Scz1)3Zt$K4pWNV68~oq~ zKeWM*gnLg#-CFB?e#3rYgJ0a>S2p<74SsEd-`?PNHu&8Qes6={4>#XQ-R;lL|7_Sl zY4CqF_)L7TD)+-I4L)0gFVNr%HTWV8zF31V3D0kOJfD_@^O2zcxyFj{@?K}{M*npi zeEkOBvB7t4@Ld~xp9UY*;FBACYJ(r#;Kw%j@eO`rgP+{sr@;rVd7afc4f}ZwenEpj z-Qdp_d<6BLh7bQ-qCi!(IXm2Eg}#<-H~pHjTIuKa18RiiH?#b%A16L)f%!c?cnPqt z@WtD-6*J#il;h+(il){aJKs%YZ1Yy*f31A{ydKSb_46}zG~UKrnxBKCSp)s%FEmb# zmbP%AIamFL7TOH8wp5|{eS?0>6`J2OsI5?F=BmamSAQ;kub{Siq4|A++FFI?cL-|h z6`J!@+o;g|&OmL`Li4)Re z+CGK0K&_1_G(Z3Aw_i)^?Ej3P^~q;`eSEq9)c9X(zxnyU+<$WSpL@yu=)Y5OJsd~w zzgdwlRP&K+l7aK0vvt3Zsega$<0j&@WV>mNuSVEbJn#F<@#T&`ZEb&vjpTUFeJ)h> z#p!K-@jT?@_(M5-4TZZOJ=EvMix4f{{iiNplnCxUeHQ2cJBB=c^<9)$?g@4KEDm=+ zsOjfeuBTX^#W}xROMRmo+w;O)qv@~j610vVUEgKl#)_t|xvogto@ZyZ5?Ec$IA5x9 zbp1Ui+H>owz6_QdQy=Z?&?X)~NomDXn~ynpo@isKTfXbp+-6Cgy0c zebls#DQrEpP0e^?X%o+W+U?Uvn|R~E##37qb$o4e-Z{*50$e}s#-2!<*v8Oq?1N|% z`(Utr)Z7b)&>FL|=7-kYIE%8=52LlOe%fNUk2xGpYdrnT;RxE~;8@zt;aJ+_a2(h^ zYUXe}?Qo9vn4PWPIP0tK7$?%|e*%YNoJ5;3jHTT%&Y-oQea@t{kD9i#Xk$COwy7EK z9NNUQpLY9PM4LVrgN>)A?UKTFX>C(8-et6jXFu)sxso>Vt^ylR&GX`F+Vs(8oEsXN zdr$q_4c&dNeosSpZ>j&Fp--swM;p3prT>o_`iZsvVner1`v0P#J74GYTCF=z&v&)o z(R%$;^BQdbw`p@tO{5*%RJX`1ioolg~uBa|k~iZVkdugu6e&&w;yd z_2bYH}o9#e%*O2 z%C7QWTU;L6|C^(X@t?5cdvE8suG61rDML$h&&s{OQ_Ec5g}csPXa5d1HchMlhX9tg zrQ2Wb{h*rhKdP~P60g$@i$naqU({dwaN6bI`rCg6u(?=|*tbN>I_bY1d;!|ncZM%m z@IBz3LkkmcJlNRgAfG_1=H79}9cWb-4{pCJ0 z;D0Uq{WZ3a{y(m{Ip{Cz zU&hHjH+(4mFM>VSy@zlgz6vph`D%Z?wtH`p_|tGPSh=>Z0Ji_}wcT^}7%vvp(GRRZ zB=@zSBV0#o?Xd<|2jiQwFI=jBpfHVAO^oO73T&;Bt3HB0U@ z&64{(v*bR{EV<7!!+pP8w!wXd8N2N&4em3{*ssFwGt6*XpJA5V=a(h-*=5OnW?Ax$ z8r)}=rG4WDAJO1Gn=Ji(CRy@r8+@k*_qk*IeQ)r2W4Nu)8%yr<#gd;_aO>;y#nOIF zgI`~8{e8Yz`ulvb6 zJfHW4uM78iU%0K$`@+3P@wr~feYRI}pYN62XM831IbX?r))#L3aD)4-E_Uevt>iv?E4k0xO71halKaf9g+tH6K6fj*&)rJyGq;la%&p`;Z!5Xa+e+?pwvzjdE!_I}j4j;O zXKdll*Jo_u*2iaT;nv4zY~i*(V=KAO)=KU(wURI1;677}-OpVvKcR zC93)hnzp048<)QaR`av!v9Jf#C;k2fS5MBLf$ghqE`D}U6En?L-_&7RcsVBxZjD}H6K_ld%(|BYKgG` zxEW(XH1+JGg}`cw;pZ^5tji)`a|>S-tWVZyF|a=BS>vJLtZ}*57f08Y8Y}^}zk1>? z3AUbzzZ6(M_4q6ecCPVR2CSdDwe+*2TKvBNR?E1{gVp?A%$!#MugH;{{ocmDepjuO8< zFN4*}^JNXV`u5~`B{9|ntJ&Yry7Kg28?09LUk9$98m%rCij?lP%W>ypX zdD(MH>}TcR4GX+cf&F|OpN(sr{5F9%^V<|nJ^5`0R`a{x^cxOOKl705CmunY@%*eU z9!A~07H#{Xm`@{8mZv$3y9~*ZIuv+%|_Ta?Y4xBx=16W()>iL)D6Epc`Nt7UF`f)i&Ca5=ZV;Mx=GD`2(6@;e1J>ua693if+{ zzpGC^Bhl1v!iTrGY9Fv#YVG$BY9I0aQa7#NGui&V>a0f7j^Xg7y{ER@{u8_3`HuqY zXFstuA4_X|`|MlWY>nAVyFW)_9#GqDlXD-~7`N6rj{~duU8&>B_v0{@;YWfu;>a3)4XlrPe2xMWzMmfro`xeeJO-?f`t@~Pj|Ce`+lSQQ zcv@f9Sle+NYUVG_SSNtZ&$$nym5WcLwT|&S32yC^!^vQ^P7cRAl{VvPJB35d@x+O9 z8km&&`RQQeW!Y4NXM)T5p9R-X-F3-0wtwR~2K`*=y?Qe*@V5nahn}HSax>|IP4!m;Wv3 z+LHgbz-qpd|F_{caU_4ae&+HWTE|Piw}Q=Ae{K3)Pph7M?*O~D;dg>Pf3iMzfz^Ef zjL$uA;~4L5TDkaMTK)BNAAcXbcWwI~tvvTI_km}_$Nu)y?i}x@{Q<}A9Oh=c~3Ka;Ovi+ETk;gRPym#C{E|9{xJm zdgq+|4OmS->#a@AdM8&~dFo`_tiN{mpL4U#cyEB6OUC;xSS|14+SKg-Ag%q~f9d}_ zaJinphpS~h-vXz`+TP?)GmbcM{s1m({5E`8VgDnztjnL^`lzSAe+FA$V_7S?e&(Jr zZJV`8|G!|f|2rJX>s_$A@iwNF$Mzn$;z;e@2dg=E{k5q%{_(WV**5+E3f{2be*;^C z#QQr~A9dq>K&zJiAA;4w{{h~JBm4a$us-VX`6syS^D*3c<+||+SReJ=6MYIcmNw&f zF8vFmxit;XHhg(*Y2&nLY1TmOe0(0}^-}D!uv|Mk!TQ;H?Hoco9fvP# zIel%n&Aes+8zb|W5v-PLr@V{9SjHBo@62Fx37-{gtlXE(2KKqWde&xku>G`|zt8T} z5@QZHNfVp&F98)@8#^bCU{j^`)Et9 zYlF?lK5Nm+#XeWIkNy3P+q&SjX!X&ikI$~vGyeKuuZ5ZG25^1Kxo!wo*Jld88-ds3 zu&*)Y`nY~xk6dfp=Jh{g4%44F+2)x4g^XA`*B%b8gL?=v=qvyH1|IP}-v8XF&N zj(s@Tv27D)Gi)0bd^p^(vv)?o^-<3?ZF8`?`FP%J3HIf=uWbtsHOCTXtgXQ1SX;x( zYyLKHebm!uTQFh!`F8MW;K^lsxIXIFQGeePb^seooAXXCw)s4{BiLN6h5qJg{_2OI z9mZk)w$^bcbgvW1YiGFoB77Hkxn{e<^-+({ZeZu1+;@lTr*0khr1fPU+V3-WA?tW8`&sV|f=DruLJhsu`ZHwH;!1c*~>jCSdp6}Ggf=6+<@3kk^zF=*s zk=&XmZ`=6p2eyvR^#EF5AM=SveSeNk;k~q**X`WYTmA}f)wcYv)h=DP*2R8~{V;9b zw~ejMJ{fx)c#C4r($9%`>H$MakOfQdn&j*Z%>2klWX_s;8QsC zv%g%Q=%P)FUGwDu9k5x1=~m6anGk!v%h(L9c(T$b7hr(1I+NP_g`(U zo4@(C?`3f9>3ap(cq@xxw&ZmSSS|K%fy;IHHe4-veFtnG_2hLc zIC*I=^STkPJ@LN_&c1e?Zikz@cKID(*C*rM3D!s5oQL3Z7g#;#!rkE8IE?N3%Js>Z z_kznYzXx}W#QQ#2E%ELH-@{=)ESS|4$0^iSJKjX>u$($bn zmo<14Ue@3-xIXF`<8iQhVmtx1*5OZr%_(*KAy^;v#P|_dJ=f_UgN>_ho)6QiWluc~ zc2D^^#x+hoo-k9uPK1bhZZV!Q}e%lpSq!S+*6 zoR`4reuj14?v-P$+wyfEEVAo9ByI{FCKmUCI)?eHEv~u6)nL_nf@Ef%D(dPZ%0kqzO*(Ux+;Brs= z6YjZ?J@GO49~}BQj$9w{C$zc0`xI1Zk9xi@nGS3}ZQlRRKh?lOhV=hzs*_zXGv|r#zPRrMJ+vM;?urZRu z3ShOIBl2ZAjAahu^j!&TF5zDS8|&fvoLCt=3$<3y`mF-CpEmRNcjIb_u`0N%(Q0sg zvd>ostGWNPreB7;rrHu`4X}F7#WlgkR`*<7o7R_g*0vUhnsXE<&N^VnPu=C#I=;4Y z>ug`!^j#NhJu>(8z-rmM+SJOmv(D+i0oeLxo*RPKW1i~q*$Av|e*WfO9^1y?@-zP? z+BlNWreJ;4eNXZ?E1Q8wF^2EK+7oLySexSvqm{?DIk;T2E#T&z?_9S8tGQ>b{Wf4< z)?VAz96NGYKXKx23pP&Hemk&Qx%S(`U3+cmw*y$+T(_c?TVuy{49AKs?=P|0CeBV^ z`)B-}!Om6P{v&AB;=e1{e6wD=fo~%>_4w=#R=58ywDQ>Y1eg8yg5N`b_4s@RtRB8M z*gV3&3N~(j<2Vwmk9yX9AFy$>na3WqYKbulT;?$vem{Ar$7c*!J-i28<}ns-9{HW* zzF>XSlgEBw<7hLFZdx^QFRlO1*7)A*><{-|$Nkd>_T~OjKY&BcwG}6)31H`8yz#X1 z#5)k2d#8zDx%W2S_e=u6MQa~zi8mQ+ysYmO@XORiJw8*x>fr~0%RUFgPoa-`d=3Gt zhaU>I7P)sk46KiOd=3Y@ZmH!FVExq7??|w^*Yfy%4Q`Iw{I1BqyKxj)-8vmj>-@#X z&}y?TBk(&GycMlJ+VmMmtDd}$2M^DTx`Muv6+Bi~|Gr@lEr=Gf;1-73y^Ei!GEiumltHu9Z zu$uRYxptlh&v${^)AxL^HshX6E066$@J^ir{35tMc@Mo9tmgNN8T%5r{j?eL0$R1i zybP?CyuJ?3HCl)j15O&-HNi z{7&x%uv+qQtQ+C(uWRbPc@tPab?26`Z1Wu9X0Z7=U;WL)F^zW%*xKZ|#J9lut6R5T zS~X+$(K-*?^#3+kALo86tuN=U{v8fA`-rnv-vuwlk!$T8V71#h9P>6>wfNr!)<5Uy zJz%xFIUc1BG}XQQKhIfh#<-JKEit|aHg5R$!QC7=$L<5G`Mdb|+z;P_Bm4LVVExqH zH$K;R0DK^=@wKP#gJ5%bkKIL6J;eXh*BsqD+O28oV=G^b)_U0{*2CZhIg-aCV6{%h zb*|df?7uLr{THQeex}g(QFO;o?8o7LUdVi&fIA=eoVNHq3D#ze$7tn__d{C8v-KYS z$Fxsz_|pD#ZMQX+d+r&q?`7^2@sBv{XB=_Hd=~6jIUk+_tC_$1?FFze<7j)HL(Mqi z#Q6!>d8d9ag4J?gt4%HbKLx90+?T*=zAriM%ixTw?PnZnjw^QFnU8wn{sL^=@Lz(< z+P?y~_WEgy-><;hQhRx9uY$`O{Ti;88odrquG(JXP%~Gtxw>9*b$M!Nn{j>%Husz_ zzXPjz&c^5WU~`$d8q&I+y$NQisx3IQ<@>z1z}m7Ne*ha#-8sHNtCqNb1gqsf=1*Wh zSE$G5&tP@?zfCKT?H#ar<-YhYU^UOh_`F;D5d&_CSZz0)7TjEWNUam<8+Q z9aueldhq?G~9mLjJY_iT4F8>-ktRhUk>iLiTMSvS{ZYBxc#&la~WE- z#P}k(b?#wX73|CB{_65g;VaPkynjVnpZBjsyE*!oXxYZq%Ct+_c<8>@5p zzPc%`FRx|ln{cREOR?`wu7zCP_|{OSk3Eg`i+FApJU4PE7#R?EAtoy&OExo^2}olIP(|{ zmTNPYvEc0Q9ujapl?H2Y?;Z z{XLG>m-}12k3-G7!E$Y$Glzj4$MFuOmFJu}9PBycSjM!kJ{j|fT2FoD z+FZ}Cfy;B|D0t2pZSgxAtS$TP81RuC?o;E+^@;znVC$MadmLEJ`@+=vcz9~9J$+9A zYfG(91gkl=e{bL=m*p0Ty3?`dFd8T)jwTE;#D?AX5l zId8c>>3=4;9Q!P|TKQgoHauf%Pv3LE+A{XJV6}{W9@w!L;=Ffkxjy!H-(3LCzB?Z* z*XF*v2%LR)Ay}?$Jhn@~#x>@}wDMf5E(Je~kMZoMJ$vBmU}Kios&AmFXWcIct6j#C zepi6g&oSltmFKAM|C!fS;LPhvusrj+2Ap|a4VG(jZ(j$_wdz{1JlCr0!CtG3XFu&3 z?*_2CxjC*pUz_8~Gu};L<7jhSd9GDAgB{ar)wgJUd96~vg+tA2mAI^fdg6Zv z?B2@xb1OLeNL&1F18d7Z`Yu?_yu60U^>xqO0Zwgi2g|j&XYK;0ws(T%+D2fz2b^ow z-C(&kuT|dzJC5VsODoT{>ib}?RgPs$`|6W1@2mCHSFX+V`~i4zj?Di7aIRI_;`bm} zTlU*S;QKjpt&-~#|A)clIr|7)t-Mw}3Qw)Ir|)B6ZQ+lD%UDmq)yiwnlkmjSp1wZ> zYYYDoxQz8$TKgWb{k--M@Wj%dzHfuIWo~~28(%$h z`x96_bNe&cx#hh^u1{jV11|IV3ta8QVs7uklaKcFeGjZH*QfWvYL4yu`v+jh_V>_U z2ju#s|6jr7*nfko`L}#i*T2Ivw)XV>5Ued@{{yU+u|EPkw*N-lvE};M-|OYa;9M{N z36^W~dig0h*UL}9a&3oU`wVPcWB!X)p7&Tk96pJU@$9GFd}yj^u^F>`kL^HH&wFeq zSk1p}ntom2^m9zPe&u`1mlz;*nGTyZP5q|VpZdGEwZ(4+u(s51MzES=tVVyizSe4H zaBAh>=#p!*R@3H<(GPyS2V~2vRw>kUw$>e#DT^#IttYaC|zWQX$C2BpjkZbcjb}4ZA z9=kL=@3GqAw+vXDG5mXI^4OLG8zcMk3vjja{d9SF;%ZOdFM_ohcUf9_Y%77)9_8FH z*Drz9{QbH6aX8w_aP>#9;XF{Tx%SU%9_mW_`U@&{UgZbDug+Io4+A z+VcJSaIjjwU*8<;%kxRw2o5#RC$ahXJa-GQ@yqAATcW8a_Eumu$2ZT!vCXsEt-+3C z?)p21=k>O=9N(DsH%``jCvet#N3cBW zy$d+&y)#&zad!jfdblfCp6lW6V6TV9v!C{iw+C3=+#FY)@%9Akug!7g8E-GJakM$E zJlDgofF0AieU;XibyMG)L(O@M%l)FByt=`u!#-en@)`|J9Y%rWJ{REaxEcd~f!03S zvR`|^*{_+ySTyyl)xKc0_Wf@Ay>&l$`Z-s*eu>cw9>M$*V}H0>?q#*9#s2{C=4j!4 zaDDP`G{?c&D*SgD_?;41yW`qNTe)xCKZ!G5j8F2I09Q*M+SJN=ufiTr{{!p(c}6!0 zu2%L})8FgT6mZsOGFYz7>(W8stj|=iJmVY!&OSXDEYChY6zo1Vp8d3Eyu-li*1~b+ z8Sikg{@NT@p7D+V8%LYt%Ck?81Usht^e9?i?o;)zaj3aZ#bw>plh<+J)ZtjLJb9e} zP92U1%e9SQoRh$L-#!s6H^-A{kKxGs^eJH9r;Tk4ef7y0r`CGrF4xATusR)FzE7V4 z&-%SWUb8;9PL#e-2o#&3$k_IP*UbEO(3xXpNKi zrwhR^<8OccwCB9N2yBez0D_3ZUaz-r}p-Iv1C&oSltWnPzoM-Vsr{p)bG?00Qy z<+`uR`6Bn3ulwQ(?1}eHaGqaX4fgdh?|kZVpHE#$>+`9rXzedg|7*mInK@kxS4%$H z)EwV<_BT%YUoXZd{04aW-1uV%)5B&hHk9t0{Jpj(X>-BS6`aX!R z?bdn@4}tBk?i?PW%^b8n%%Nt^;>39r?7v|Qe+)iEmm`L?g9_t@Oz5#J!Cq#W53NvTw!SAXqJPS{Upcoxin~$F?Zg`D(N7aL2!=YgJqW$&L zZcgs8#lhyBJtWsZIWJM$ol|mN60Ghyvox(Q&l&ZlIMm!nV&k~(%WznC z>ul>7?$71G=H=cM8_&40FJIWj+1u81K@;LNABTI}dCp&B_v`{3##@Ni_$wCu-4{bS zd@an8{)^Pu{)-ma|JISQ7N^a5yE5@|&e*P6b8~k+R)HJOwbECv&3(2S*!bG)C-=JM zyjBN0H~VPIp7}CZo9nSAtuNO@eGLvZa};}x602p*b-<1pzAoH(hi?Zq zPOhKZ!}U@3GlzNXAm%VfadPzUJNdVre0_<-Tvno8xyI(O3Ws^EMw`5LCWby`Ub~>F zC$C+>_RVhvcZaL(#*tk20NYQSxth*Z%DIn3Q_t`B_5rJT?zv~oK`pfz1y)NP zMuXMdqx!gJJz(c%e{+wk?F2_3pt~Pz`wkEjxzXS~zE&N;tt zKLf0GI!AoY1nZMEIvcEZ7Ds%}0Xvt(ITx%}#yPL{Nu2ZHYR1X)`3u12;26fx$Nh65 z?L{2!shnSO{gcDRVCUyGZ++%{30Teko5C*z+kX}gYa!Ri{+@%Efwg;nigSLBz~*nd zeQnN>^K*+D8+%I*&(E!CbADb<49|=3s|xPc?c@Ic7C7Ts6S=XhhyEGwJ7CAtN1Hy@R6XO}1~v!x%x3t0 z7p!ItZ>PP3!@6eA$@NM9JHf`x=cl{CYWBaI_8t!VXV1y?vA_H3-rDY-6KBs&i)~j9 zUpsPS&+Sy>ZE1I|@eZ`RaJc_=qs@N1k9gUC?w^MXuKs9)KUQ%4pDDQh&o%h-HP3## zA8tcDIw!f<`RJc~9tT^OGM^{V z)b)41@_gU>BzP$P#x$1pvnb(itYVJ$NdyjrU20NZ>ZNKfnPl46*+4*U(ns)c{ zv*66dddtntT04f=I@>RKz5pIdU;XvdUVip)@9e|j>nj}DJA2o758AKRcrV(K9PXWN z+U%X55VPDnKQFlYFB|-og1dKqS8)B`Z1A^gp0#=rZcgP|{S-|-d*>yvTK0}Ps%4FS z23E`7c^Rx$?ww!2t%G%SPI9sH(Lee83T$1%`ehXL2-uXQ^bFtoXbFabG z{jvKR%aOgaZ;eOO?pNa;+FlO#&H=R9J8u)S+&k|UT>bq9|Dfin{U70uQP%!XXzJMu ze+H{%FF2-JYW@ybEqmcFV6}2Dya#t)*2x^@V)N5K`TP~^Jj;CkhNiB+`O8z|zk`S3 zZ%kupZ`ODUc3%@YQsV<_JdSo!jVI7f=CH<7X;b45iCNb8(}Jsi*5Gs>1>Vm7~ z{P(?M2;A{<{`=lB9h!R1|LMVMIsaz_XD+U%+}vDC#}K=Y_Di0#fQJ%WfBm#4&so7` zp0mN#j$=O7#XM(+o2P4FKl7XeO+9(e306ygUdV@gsZiGTinibVYqqbxs7=)f~KB47X_;&&!OPt>Hd|Qn|s$W#O_=BCC??n z=BdAa+MDP4(b#<*!I5+Q$QmC^`?VS$PJ0xG=lU_UIoFpWrst5{b8Gp6tFO@DD;8Y; zH43i(S`EH-!S&y$;QDXe;F}a&|1Ary|JDt@O~Liwx#0Tm+TgntT>p^;*T1{LM-^QE z{R^&tUxSY;xc*ZMuK&Reen`RfKf2)hAKT!^6M#;ymlsE&-c~QwdH*O zGFUC=`dtTZvxo!$JSN-+Vo?JHrm$?pyt1ZCc_x4`v zM}U*7b4ae6qiaj9TY%NHo9kBK-KQ9 z-N-4q?f_4&&LO$(2-cQdcLJ*=*ImHL)$5Yn{JbVPj(9g(`z6=i!RD&Je%h1k9^f+9 zz2ItlawONUfX&r&vD~kFqiaj9Uj?fr*L}dr)oY^M{Jb7Ij@WCV{gUfwu(|55pZ4TB z23+Pk7OvLAkzDr$C)aYn?uV`|x%Pt9lIsEB!&@r zP5_s=9tc;P$dOzpfz5Rx+On>b;o6ex6tG%yJqVm!r-J3?cQCEvh-SxgHNT zSN-+Vo?K4=m${wqz? ztz(EUrL|x3ybNrf`s=5?dCzwmc3&rP$7&hc%q+Udmb+&0#C;E9!U+gP`vYfG%#z-sw7 zA>Re7okfht_`EfQKDWaiLtFOjo#52ab(UKb*VwsJ2qv^V$c1=xL^ z!;w9EZjH~RJ+H=R)1J@ap1qJZd-h&pmV5Srf~!B&;1Ab4YyLgBW0Y(DeKhs#!TZ2! z*@KR$mbJbgtd>3a1F%}T2OoqxFY9EEaC(x z_GXQ*!0ziZj@0<;HNKek8#TU^_Hqtu{7u@__;F&EHGZn#>d!Rzvo+70o`5?>Ij1Ml z)KlXhg4I%E$5cy=e*{)bjeiVQD{K5T+<93ibCiqCPygie9N2l5`8wXQS97Gs*VOnb+G{zi>-Ds`zP?19)YbOo2LE}@llM>H#wqiD5luaH z{3%$?I_BK{8Qff)n`6qwj;Fuav8-k0{0sO{`slBp_U4>#!S3q@j?DSS8ec_wQ;q$; z|7H&7|1H|g|5aj^^M9?uUoW`tFK-sy=Lvr(xMRFs^VI8?aC0c@^$MDL>h&wIT3N4O z!<~n9F-N)B{PY)_o7dUY>o@SB^wD2G?aAW}a5InJqN!&;{|>C?=L??;?oO=V!_~8n zZ-JASwUC>Obp#KC z%Ua0I#X9J#-}dzT6l}ef! zH*MB(+K$0%+1cP-HBU`GV<6*{YeV=-J!>-!T&-N24!F5EH^-EV9Z!F;V=X|O%y|fW zD1G$TPkVDO--q4TJsjD~_tw}sf3LkN)~;Pad;@ zn|aKRrk=e#2Usn8c@(kcgsW#S&kasq)4N*LY}tZ4#&R`J zJr{sKh+eMif@tbl*M-1p<+?5ccOKTo9OYv3(_d_EJ;k~Xg%72V{`zT89*ct?#8&39 z1e$u*bxE*V*0m4+rQqsW*JZ%T%Ua0I#X9J#-+20c0c^dsSrd8Ib$RdBP<+^?e?mVoEIm*T6r@z?TCKl_uDtst?^w&>&@>mVr%wu&l^{nfc z!D?C8gNU^TTs`Z$7C3oX3%R*i2YvNBjDG8at+zI7BG0<62R<5`{q3i{xvtM(_w^%= ztm}_!?7BWx;}dD0=5Sq~rOmo-M9gwsH*WAv3hugYQSjs7TNT_fwyt^Vxjx(+%5~iU zO+D+nAy}pr&$@02PF~hRZeG?wU;R#?-!@?Dt<9Rqv##5MPs3(^`)O~k>kHU@UCohoeXho? z>+>A0!-ar=a;ejdXXb@{%MV!^Gh{8oAzfM&j07Mng5=|Ea(4~2H(5j?&Z-1 zKNH?laK{*1^VDlMxH**d+8s?j_1XihR@Q4Txbv_s<|r4NpZ;QVJEy4ESK&kHqrZOI zlgCJKGmm}H)U%hn!D`vdXAo-?Ts?bv3^;jN3%R*i2YvNBi+=lpt+zI7BF|pl4}1YO z``b@@b6sD>?&}vES=V3I*mZrS#+TCmio&i_NW%BlS8EJd{5A>!&?=OaeFa zn2e^Lb)5oM%er1ftf_GItn0zxo+~I zjsu&gHpiA*Kj(Kmcs5%5+fTc{3s%qXf{pPGhp)Fea&G*w#-1C0sJ{7Ky z`iIo!bXs5j+cRyaai}>Lv2|IIxyaS6r}H?AV{N`WpM$>Vfaj)F*Y3R4%+s|$7p#`w zTv^-m;OgdZ0j)1{P(PnT%`wI1aAD2W{r=y&UII3*^Dk>~DVjFFQ}SH846J5u)?A+R z@f%>*RGameYr7Kd3b6In=32~FsE^uGbz?0+MgdaheHfz@2oW69Hfa|>AgW)9=J zht#qka-K|!{vn62_c?N&d{ATe@n38FF74lH{2uM!Ib7p^(0b17MSCw}Cf2rX5|El2n|GMD%zg~0KYCHIM;O2b~b#foy23Nb4!@Ybv ztuObow(oNMl*4(7vv=X^6Z5-zx_VPs?9PU^s%d&Ui)aDaSJYo1%T0`1T< zdFoh3Xph^PKe%NoG;1+tMDN(1(f04E=7EpvOQb!<+-Ut{&Ri`7pE6ez zzl*)?NivDR=CeAu)sNOSUUOhfcFmxchFtZG?HSiIe#-FPL-hSZwa!4_;np?7_b++9 z2mVDq#x$R`XxsJasMZE2xAnl=jhM2ZMezKP`|7VjXSD%*C$?yOyzfY{ruvOvqdKK?+6AThK2#ZwYSaJgC|l zyvexHJ5HH2;ehsTZ0Drzt3U6qYCCwJFW5ZQe3?5rG3$Qa{P!C%cFgdDdq=xEUDf>6 zE@*u*hPSQ&|8`6D`DH5gR_oK5-zsCc>JZa?wj*ukxD&WN$Bt@eaC^VdaMzF5)R{NvH z_dic2LpNsAl3QA9F8dNQbMeH@TzbLnxeThtw#VJ7cl@wPBSyEDt2G~WU*&v!<0r@3 zx4o{dn*sD(|Ez_Y>(zRH=jss6`+=5rXurm7L|fwxyo+}*-%$I<_|KK-PrOl!+Th}j zssD2myT%7HM(RTO`|4s%QkR3;dF(J^^uW5P`zq^l7@VAI-}czr z)kJPh4jGHU%R4DGYch&AmGDmZBoelc+PmZ=Km%U5nnv3{{(r7n|D+l8V$Fc2vwiq{J-@f-0HD6`jPJokl%TJs0Q}fkdx3*^8 z`uomTod!?e|2*TQ(wJ{cZq2rLje3436F2ia1)TYv3eMg*qdoR!<412Yws&IxIiv2Y zKhLh}EI4`AzU?`x`5HO4XS~+~uh|#S_WS+k8TAj|m{V`>3ne3 z>>@DZZ#i{bdqS>-ny>!(bXJ$ZYrocd$$fc$-HtnNbtSy^`Og!nM{LYOHB%syj_T{g z%p5KUXAW0@+jHowu5ORpS`hP>`|8hsj_L+DxecdG|2a1zB?)u5j=ss^dT{1@YaP=! zlmC0rfAc0pEXTU380+S~u{x?-!0q|YSKSSEF6|qO|7PTNPv)4n_}18W6l336jD1(% z*mG3(XY2`Md;fnb>D=xu;@{U7f1c{$I%ex_?7x{#3X8d8cWwDjk;yqDGg``E2L`$93skNU=# zw|cpbTVEFc?@{|t&jD9d_wP@Ov0myMtE2iExV@(HRKKjp^+NXF3|d|Q9rM*<%wH5^ zzScM9tks*~_UHZ99dzrXw_kVEQ|bRWiJzZa-=OUo+xjTls^PEU?fo%h^)9&e8Gm3X zzcy+0eS1LP&gva_|Mw(wRDUp*Us((vHSXVkpk>$R8r%LVg4kWv@90af_V+blbA7+o z+UHMK_4}HS?H$+a%~MykK=lc2d;Vj%68~=>c`|5SnVtAxwMv28A1=N0w>}t*Y26!i zRv!_+HK*2iozw=!I@J4wK`m~qR$c4wv!dhL(t9RN@*_m+z1aTKxAj&G$LrLQmv~mNzSeVL@Wc_5 zMvSZZq7A-ygRj=$Yc%)<4ZhI;-cb#Od+%%>dx6{Ee{@zOz>`KCyc(ufUZV%}>#W8M z;2l*jynT*!R1?67GZ|dQIcPw?&gzf`KdkM~U3PoiBOCUk8~m8I{~GZ>p8x1RG$=m zKObQ0tp3^Ho=j!UW@_+R8hq9UpS!{5ZSeUTeDMZfqQRFOz&om?;i6s zgRj-#>ooYf4L-QRhcx&m4ZdZAZ`I&iH~3BszDtAe+Tg<*d_;qfZ1DXXd~Ab{Yw)QJ zesF^y(%{n?{MZIRuE9@h@G~0x%m%-x!7pj>O9ya1FTt}nt{GtKtgdVD>l^&u2EV_- z9~i(ps)yhi>(K$W&g$_7e_{adsGceMJ~zPDSv}w2KWy-q8vNx3f2F~H+2F4?_!|xW zPJ{op!QX4}4;uW#2LGtRKW*^O8vO4KK0RLymDi)r2JdR{nHzl82A{3L=Wg(M8+^V7 zU!=hoYw*Pze3=GcuECdY@KqapwFY0k!Pjo^bsK!W1|QtuLmGUO2H&E=zuMqiHTVt< zzEgwm+~B)6_?`{ESA&mg@SX-A)8OM8d_sdyZ195`{E!Aew85t}_%RKBY=fT(_j@Dm zpOAa}ECd0Nz!- z1a}NRJ@9a+eJ}ai0H4n4R}KEg06wUC7vB1ez|+U!BYVfU@83GB-=eoZw2{2uXUTo_ zf1lM^y@$5Rgz;l~`Lf^726A8Hhu2RU2^O8(8}x}hjho!#vw=Z88`q!9O#k?PfNAw< z+YGl~Pw&3_@yK%g@U}7W_yp5_R#Sf{ir$6JH2OZjMIVGdamuK%F=YH1)Z1Cb)R*&& z*hY*WKOu(1nhAZ%q!HsM*M`KJxsEm52a|oa8C&z51>0zDzQ;`%KY=f;@=>mDtXZ*- z@~elw`Lt^=TlA5=qxx;_n6t;mv*u9;#M)n5fA*jib3i`rxN~ANpMklyZFAMO-tl9K zxp%eZ@da$Gg|jF3wl;T5vx<)0*5+wxj^3ZoylCyZWfy5{&t*PreVABzuw91K&|0hv6e&knv)G|td-EpdxO;*e2oTQvyPGPQ`V_@ z|Mw|f)dp&w52Je~wx2Bzsy2*vSkI&hwZZW>LZ37`HR`Me!w;SmKB(FlZe_Vp`u}w; zyQ(4f<7XZYZA;8=hH4YE;yi8jXxDa7wRvrGFU8=RZe8oGeN-FNcc}H&dDN$OR=cA2 ze_z#6?F09@sB3iqc=CQ+iKmPkF_B&1{HCFenlN>I`@5#j>J0ts&7=Jicv=4|8vJT_ z&M5t_YuIlZz-Op#gOfw6Wc^q2b}n}f@a?SbY4CdoaPH6H?YRxAo&hIr|9m))^l9zY z&g$>&{;gH=9Q(Yle`nRj#eL$W2_yZI%UUfBFR%4#%cJowHYGo+;CxrEwe~u8R;$3v zdVR6M*J$uH2k@?HEjaV&D~)+>jmExc<+U?-;LqB0RlB3@II3rSPy3S6x~8c4nygN1 zoIPvJ{WAt!?8T8ICimdeSsj4xwa{%VpHOpS$q#Dr{_ocgZ}21G+%xo!?$Lixb)0;^ z_L<(VcT^{#k8Z6?M|GySb#3UVE&w0Gw`S&hG5F9LU#8BtMe5h8xA36q7I5PCe;?UZ z-CgMIcwN;4h1QPSRXvQ>x>nVj#yLKN)+$JA&V#BKi+=q&_ekiiTGbaU`@Y%I`s?#{ zgTK?@?=|@Q1NfloLwM#_?(2`y+k1b8YA!DQQzlFqF}7XixV36E54P<8#lYqF;)`pm z*L68?x&PO0`IbM^)lsdF*4~Gm)yCk-JqNa~Zq9pKcz^x*c^Y{8eWjz?1I+Ta_QNP} zege|EBcpd#`=Xb8KX`c_?cd;sHTdBTek7cCnAS~#=k76Wo=4NITuwmypXb1!>QwaB zd6PHpR*oIjS^AG|=X*Xl!Hj@Rb=qpgh_G5G*Ix~fOu?Vk&5y-lEWR*xE| zbwO^|=e1U!cHMaotLxiU{ie{fp6{d8_aCiTAH&NUegZFR_-TXB#0_d`pLqZuRLu(i zSM`|-{eRY{tC|nJ^?p>pA$YDXY>ZaTI;w6l8_rs+0`9vftM|YfXk|WYHuzc%KDfb$ zH29_sKD5ENg!}VKS+DIH_8l60rv~4n!S`zL;SD~n!6!8Mfek*n!4HOee?;9{>wRX! zes+VO+u)Zq_~i|LWrN?=;CD3mT@8LugFgT_-$^6dpM(G0uz%d(e{JwCJ|vaCpY-14gOezKT+^u)O$KU$a9GT zRn_L~aG(46TB_ajY07G)pP%*B2+7aC@-zB4@v#Za&(?#N1p5kKqD@;d^Zi3PPQGtw zYR$3pJwwJeZ#DjF<>P1XXy&V*pO2&QHr~?wOdHJ_=(j+jacZ=*MGDQi>epRpGu7JC zh30n$`Ym5*erKSza-o^48n;}1x%eG{+M0#tcLQqc6q?@$sC}i-oTu90Li6*#+NOo( z=YF-#3(e2{YFibWHB#HI(EQx5wo{?`d0%a}Li01e+Mb1Gebx3Uv;}KzbfNiKUcdcX zT4&$q^{h`mzw6`6{inu%t^MX_`Evis-GA;S_oKga;(9oa+}}TuFI@Alu}S*R3x2-X zO~WhWhcDHZTjQ${wiVC&{&IY|<4<4PpJpRDo^ziYRecG1+h05{IXQkehp%q9`_V&v z9=r(A(%paR^2LbY-qU9Z{@*d=>8tNz#Bxul+h+;5`$0`V$8tTz`Ygfu{R@;O1RkyY~&}JQsquuzP zi;4d=uzl3bZ}-|}evZEft#)-|dd?=MeYG2NByD1j0^3JT+vvj9Q`^*xH-ZDJn`wvU>7;SgG5cGmpRnj2>^ zcKTto_SH{Y?DjE-!)cADpE(>sn;aZVyEz<7n;eb<+eghDj;9^U(H^t2_4CU5syoJs zwECaG;TR{;W(;F#cZ@S=?Ps4eY3-w??JU~Z&aQ20#yf{L@$9GFJ{QrZ&&6QlscE~U zuw7c))Qoo-ZQ|KayM3;vO}uNs##8gWxRy43v>E3c4b8o$etScApQ}IE(A`_=k2LfN zwfpyAe)=B@LH+1LgoL;YW=jr*b_7<(zKQ*tx_J5By*VNR-HT$4KRLuvoU;cHQ9Kizcg+Al^9-k-S+9_q&Kpf#4Z^=t0E zo0|5n8r#SCwlkvfUmu@I!b|^Iz|L_lj^r~Nnl9mULp<+RAV2573Ou%T!H%7=cCCGl zy&u@vUh`u=uJ+e{N^SSL9sB8M|NLiv{IlS5V%Pt|+TZKG{GOU`R`UmHKD3CpAjx&q zTz%n!TbteCU4?%STs`?rggb}u!{OE-{6x6>Bm5k=`$q0~=fTVPV@byM`1qe?auj#P zy0#a>W4i_H-j%zT?$no8?9afxAC3K$wtXYdVei+S$71X%@3qC{q5Z!(${7C+JHGdJ zj_W$TPfHnEntN96{heCo@&Vj+_B#79*w{3!{+|F?+LmsAx%Y!=#{aa&_DQ@>H!KeE z_kK}-?L%pohwE?umBHp>J!0P!E$gKJ7VrgWW8Vh8P{DVEdk!r^y#2t&HV1hxt(tqs z@%9JvUrRSXxz8Qcw2!Z`G3vIIl^_c)*fqloyWtRec@95 z6@_WEYGOQpM!?n@+4`)r}v~S+vTQ|7R z731%<-{* z`C#m}J_{_l&jU;DbG?%LJTKgP5})UVJD$(;!qO4Y9;r%TFHH;R&t-Km3*@X_c>c>_c>e1ebyH4{C(aQ{sG+Q zY~i*(XA9Tg=WOBD$LDO}o5Fq07Oua~*-Gwnws2dYv6b9sYbE!YTFHH`R&t-KmE31) zCHI+H$$g$ya-XM_+~;T|_ZeEa_3;^6xUJ97!kw?r(88^c&(OlHkI&G;ZGDDTa-W@* z+-GJbU%0`$3-0GCpPR+s@qK0%-g>_&xVq2GV%L9g!Sx?faOdwcv-mrn&&?nOW?%J~Io~-)Cmw`uof*+oc=({e5N@uD{RB!p+xbX5r@RGqZ48pP7~1 zXJ+BvGy2Rd-0^&77VdaHGYdZv?lZG+{e5N@uD{RB!fkzK7Oua~%)<5enOV4YpP7Yg z_nBF^tV_4NB3Y(KxRNxy%<)syo- z!S+=*7e5=QiJ4}rZ|X2TJaw=ZiP?d!Eit>mYJN^h9R`8b%R0;eSJ%(+TAw?>$$w_B zpS#QaXMwBh@8=SE{AU9<=Q}%^dg?R>*t)A5!_P8mi7^+rS?e#LsVBzVU}LBo!_Plz zi7_v@nfH8X>ZjD}H9uG_d%(|3YKgHRxEW(1H1+JGg~4ix;pZ&1tjnTca|>S#tWVZy zaj-t>S>tYS*0|j3OQ35@4VDDkUp?`c0$b0-UmC2RdVH1vJJpL+xB(MzX(_JWu3hStOobU&8Lu$M+b@1A_89cS$ z6kO&x6t4Y=y8gq!YVIq?-UO_cy|*Pev9(cm>Nn%V zTTZn*SS@R?D_HGQzR%f%*6(#}KW5+TMY}hLFYUu?yY1hw`yKn9VEybTw&wfL8s9!6 zYMZSwN70VvNX(wvZkwFPfQ@lyo%6n6HNTs5T=_^2V>zxkeaC|B8$J%~HQaR@PdkC* z01o}MnXg*%H8*40CdNdtF>@{)2v)PsnXg(oUvraBqBWka^PfUHl_T??T-$9k-a%l` zf$)RDgE_K>hk*4_kI$iC!uRpRz|(Q0hKGaoQNOXS>k(jMY5Rma97XHP8f!a}L(Tlf z8S7}U`8jvbTe)}|t#ypwF>q_29F7I6b#ge~@w6FF+i@Ifjweo>6Ts!%PJ|mb>v0lT zANBM(8C=f)6u5rsu1m(T{R`I_&y7>T=HXoRHwW`Poz|Ci(dRS{HS-kbTs{+=bJ=Gq z<+*$oHtji=&jzb`E+^-6;N?8eg_rX@53Y}T-mA_Bt9NoF&IMrau~MH4;rgkk-$h_` zpLNCWVz_x}b3Mznyk?^WPsXzi~pdrdw4uL0XXbGa6*=DlF@zaIXt^1lIHTk^jVtmZ5Ee*=CU zNAj2JXD&C_P3vQ=lB5agB-VUn459s`g^`)zuRhih&I>EZ-PA+ zY`w-kO#5vPU-o^Zw%cYdkAjVnYr|t;wOr%n-{LTqvBl~8IM~{y?-O9PP7cr4r)Yh7 zzG{1tL(Mqi#Q6@mT!Zhzr*T-1@wDILc!oni=PcL9IVGO$>x|=h&(kJPZ9m{pGf#2i{19B``2yV9Jw=|LA3xI0*y^{Vxd&bZ+fSQg{e;$+HPQBC z4mHOTXRM!s%duX9mt*}*J7cLITaW)T*nZklyH~*0PFrIC9IPJxD%g7Goc#q@O+V|c zP0e~IS6g}NWZSI2cK4riv(0#~ft^dn`z2T{@8jCk?4LdD{!9N~fy?!L9j=!3{53c= z*7gR6nt6y5=S^@~ZfN)N@bt3D{WLjN`fVSMaVJ@%a?2 zpStJPXSBXNx3v9@L(Lk9ozLHCyJ{PYe#fy2 zJ}ZIM?CC^tAp2|wU4&s`X#XW*k=t|x!C8t z_OZV|Q}$)>I<)#|)5mAY>KT7+u-C%Obse}qglsNn6Q0( z3;1;KH5*j%lJ{^n`^>XXo>aG1ZXb=(@g{QSHP zyu44?7GAE|c5r>vGnehb&Of>D0M}35I_^a4%RIF0$f0H);>6hnoIN?7c)P;gZ|d>c z4XkeNJJZTz+Y7uo{lfQ#>y!O99ITIezEj%=yeEhIUVHkE0BcK)g!QM8-a?L2H~`7ijqZp(kIcA2`hF7|WmhiUVf$JpBJld<;&Z&J*8 zKe%(wXS!anpXbz5hyB6!)8-gsXw?#PELbfy8VB|}KEF567QgXeZN@l&R-W%ACW7<1 z*PoLuuPX;))1Ek!!1hnhlfi2K9A|Q#0=J(wuf6M0tEpi1eAYe~T#jjczbiNdU0XhD z9|~6UmFwSO@Pjza)A`8t6CY0NSYBWKncO45LumEarq2Xgb#w8(<0!D2@%)UIxgL$C zEq>Dqzw$gh23=dOSI2_wtL}J5YU4=U3kCVa4x6I=d zbZtja%c0EWRIpmcJq;cDis{~2KWs5|aSv}zgmEO5s4J|l6@M%R|O=YZ8> zKNmb_G46SAwTyc{*gooxdnT=#{mtt_u({02l~sNbnBiORzuH_kf5zIr7r?cr?=Zn-z&gsneUb0vd&k*)iU3!!S+#4Ue|z=m-aHR z%i!9R*LC3J<ee%3{043= z%{}lInl@|nCaqljHmz~2xA(m7g8d#u+dE)+zE}P&*zc9?Z$It&y+o@mYxX;^Yo_fz zuw0v;|9%hFU)%e%a^L5fLiGpmo3!@P=KWs}t@mKIiT@F}+!KF>doE;8{000WhklMD z*GK#@ZSL1U@6W+%`Cdl;R}NztTl_k)-FqJ8 zcgO$0R?g#}aAQAJpBtVa?i2NVUost<{j_=i+u=#U%X@uo({rdfwm5lrg3GbG;N@6@ zv@@1^_Tda*`)NyUX9QbYZHYY-SUr4ZuU3lLhR2)=N##-{cO!?N!q12lGD<)-8MNa12#r-SQf07b40!bhq25- zoW9G0%_V#Vu(6(~&xsYmGf->wtlvst`)MT z*Hl~LtOi!kxwtym*y^5(U!wJ8owcpOq2?ULiL)ly@l$uX>lAw!x`evT%g4bf6>hW0*tZsh(47@zHuYfl%_W1^IeUi_HV13km zPx5D0HUjU-7`_KXKS$iGyXPU=c;c1 zjcL{5za7|ovtHYSZy`7J`0M~yxBs@Z^4N9)m;HB!-%Wq@`0N5!58oAR9^t!zjhml2 z{2Evv^{o5uVB=^rj~!{%5@Szrna5u62gpM`K6``J!-s>*JobT`M}BT`1Xv&S9RdC- ztv=fH*_T#5c^w5_pW{3Ad%)3PHP6{w&|J%DaP_>09SK%5-Z8Z0x*rSI?z$gO>&tal zKaNAqbr&ax6T#*8ekZ}#=15&m2K&9Adg^it*nZl~;{;l@#5@hG7XQ=1YThU2+Ia>% z-vw$<-!sA5jC(4rJhrpJTX**JbKv^qJ@j0#n%^&G?DOFE(`L-GXw?$)00x)7Xe zy0-XT1lDGZ^J(R=T?|&snq2}`^D~qFu9KSA)vST7W6r=DT?%$@_&!p8zP$`hTjG8l ztma<$2J7nnxE!wTnqNul%QaWOf_*~;5@By^O z*Pg!L1e?R3*j+T$xA;GO&C$K1-I}I8w(#t~=C?|~gF=fksLHS>4BJqPw>9Btp{P&1A=aee@H-l^a7 zV71)WYEz5<55Z~~_XV(;?@NyRA~@q}`w@qlf2yHSE$G59k9Cn ze?u#e?Om{W<-Yj0U^UOh_`Fy9sloa&4ZE ze*@><@>8%p_m-c5-^Is1+7j>Y;BrkqhkI|S9-n`J)x-Y@F8lb#>%FCVe5Uiwm?M08 z@B+*~`>q47k9vGM!Smpg+IPYAQ%}D^VD<9eat63LYRkRlj9_)^ALFZ@yk-NJ_jR+w-6P3q4!HMq>dAdhu>G_d)889bOUy5T)#5)lSgpLT zn+KlzI_>E@FIby#{rzKkZ1aQ5xC_A5yno96T@aqQ+S7L-{Wy&4?=j0`TLfI*FD?pq z?A$Ld239NY7Z-=yPn$9QU1+t$TmrlU>m9x%+;J0gDX>}@b7{E!v>CITRxL4>0ekLw zeP0>u%jf>;@=f8(()zrAIa;6hFHgHU`UqW@`CGaB8V7 zeyf4Cd9B=*SgV88%y|`BxxTI6?*cDJ9ki_h{!(qbntopfuUXsH1j{qV+Te9+o4*$> z_j`D+1?zzSKx;hvY0r4;g4G?*apl?^Z#}U7+8kG&@zw_$N1NlybMO2Wuwz>H4QYLO zEmPlsL(N)>eQ$Ct#c1l zt$bZ7#IjeLgFm5lEMwYNpNzRht)~`pZ46a?73_Y_KG+JJ_XKV6+ZwFR82+xkJhpAX zYF@KO6LVXzns)ca_TbcGJFr}v>$D>{_1FO{cZ{8AjpIIWjyr=NrnSF*+I|0}sdnN2 zjFHbJ&TCgR^<0;B1FLzxO~0?f)6X&G`jzYIxs`eB3C=wB0LwFvy}_BsUSPR4bJ+)+ z{q5fokY|670K319XFu&3ZzNdV+#FY)@kW95*XFqLj5iu=9Bqy(&;ITKJEr@4Us_-8 zZ}l-8YVK!oSqJsR?*(^rWY6pm&b32Z{0;zX%e7-HSk1iL%W{3)BjdrT?KrSpn|ov; zIJKPsmTMb^Z4x-=%z3=M^9Q!!9TKPVHJUnA-Pu~;3+A{WuV6}{W64F1bo z{mOIH_y5f6>)_1mGO#@Jx&oYeT@IFOb8lY-&b8`FusqkQtHEBYjAuXX8Sfgfy16;7 zJmXyp)?b_B$}`?|VB=_WTzRfl*Ml9?Yt@akzPwhc-@u{fwMtypK|S$r0=u_z{@e`C zKGGJyTfo|~k8TC4nU~iPxxVh1+rg>rZD6@J_spH()b=(dgUO$4X`FB;5*NgDvr9FLr4AvI@6L1;pr*Jj@ zCTn871WzpO>H9OVw(ZFKW!hIbjIZw8{F{wGuXX44D)<*1&Mof+a(xo>HE@~FFX3wb zP1xk~D|qtJp1!YxwS~U{E@S-~uGYQ>Y(KAk6P{Sw)Au)EZJFC!VB@Q2Zf}FtGq-oZ z&MogXa(xo>U2vJtZ{cbu7IS+Ko_w^Y@9)6ca(#LqtmfFhzyBWW*#11U*8#ac>Hi0C zIrbmnYX0rq)b#^+#@3#`e*$aE*dKz`GWJJc$M$!`9b2xC{k>lP1)S^UpTTl%UN1iZ z=X&`uSg!3bY@dRSYs|mW%JUxkH}H4yF`oUjn-5L(cmB_q<$LVsXzF>7{Rdd>GmiB8 zCpi5aQ?6h6-m(Hbb(xM2sMa*~n;xF}X^US6SX=7X308BARp>9**IEq%r&e8Hxi)Jx zBRIA4?`O#~#?0WnZ~M2jB_@$9EP)!~IYx6yJA+Yr}Xa8Q9Jnyj!gME*6EMwYNpNzRkt)~`pZNA4Y241+>2aCh=9;+>W z-C%9T@b8n!V_OnzjO@>);A-Xj>C*7T)t@J!`W*Sk2!dNx!ea)6X&G`jz{8#d?p>R2yP*pE^!C)<)>s^8NZ?uv)%f z9|HE}`J`=Q4mHmwvHAEscN4Jj%jdb9qNykLW?(hPH_ybe&9mB}V8=0c{T;*edUIM| z=Aq9pj<0f7EU*F)pkPkYAO5v*=*jw{c2JAw7r=D6~Vw=>u{+8kG&>)|e7$Fy#{ z(fYD(>br8NId5^fU(}P=9^lkrcd$Hp?FCL9_5{m)F2LJywKw=hTKj0rejN_Ze$5>A zK~v9KjR32)?|0kpts~*-=UnCbmFwp^CgvzH^+?RoaJAgqYEvucy%KvZ{m0b(^Q>%N zxLVm?O@FTsz2MYoKd@Yz*M|eZsnh;odBzzB&VCsSmS?|=2fJU4XFu&3Zvt37`$eAd zCW7_PevxOq1Hs10evxOtOaeQm`(+BPFZYZ3WDYg=i@2nz^TKb zV7azojB^Ay@1KW*<>q)K?Li!QzdQ=;`=zmsp|3s}e=gOg4N3JoX>)%pJU4PE7x&l_P^X`sjl<6*fYj?;5-+) z5bWzS?t0bbKKD7F*5^JK(Ar;~{uhah^YLQ1T6sRHIll4iZ=CeMR80Ty%i!hn;IG5= zQFs4dLF>!?tL<_QHRFn{f&G1dbIjOmGscx-d~yxA3a(b>tXAf1?qv>qual$SIe3)6yKpVB%HLDI4zAWoPUf#oE%{zw`-k5E_jk7Qv(z`j^-+({H^2J~AFHfw#GA}?#L?N$yoYb|!Zdl6HvF5kQ6w(>n{u3vJy z17CkXF#JyVJn-!EyWsk$=d;k=;QYRv55e_OPfp(iCnrCnr|-AWwI!#A!S+|TCK=y0_eI|Zo1b;k-`vdq zQQG9M&m$aa<}Y?kuTPJIbA5UYEZ255wkN^4K0N`J=l%RC@D2FbN1OR2zU}ALbo_mW z>01BBh2zY@;mdzlWo`1~(!$Tf^yArT?B5Wdox?omr1jsu@bCP7%3+_>>NBwYa~=FU zSRd~pJs0HqWS*acwf}>-;^a0L*nb1W*B3aFoBzI|Ir#4<=HK36I;|Y!{@Y2j7Tnwx zZtz75?z|SSxjA=%2XXj0y}a+90q)rEF%p-8YUbL{`&6$@+MS=dXiGh22djn80X9y~ zjXB}^sBg;n#-0o8_}-u8^VApM>i#UoP;{T`tNDG7KK7dzte)Qsm=A1xb?4?>=LcJ# zTpQ*3#lApcH)pm?wIG^$?mrd+t7T4$fSsfBx7PC576Ut9ZPr~bw&uq1z0`f!4R$Zu zUq9{UYj7U(E9Sar@l0Yn)^s>9M^qW4(o25Ki2EK zT&-uFZ5_k?xjfjs+`D4q88`M73%fXb+nO$9LcHeZaBn-$1#0Y`U68|g3)32Zm7>4< zqMO6lA{^G zz5Y0_HNno!KH9Qpz6{ppdaO8X9`fUuhe)iFp`V9eVvwoY>`m%oNn{cR^v)KLOHA$|Xafg8&H#OTFo|#Twik1lqc}PG_l^A9M!vqtVUDZPu2y4nSe?VXzC@e6b|Qv8WnMd@ zsVA>p!1m40%IyYM+m$1^ehq9tZRTn|yMxuuRh(S?TT1>NC13s(i_K4e&kxVteZii;`e@U~IjU#8{lRLP!vSFD!ZJQ z9$VX8198^Czqc}k!`DU}S%bkfUY~Yj4%c84+SGgkG0HWVTyWRmpn~gnNP{0%aQ%-g zxc)~s_%Q|7|Ad0;e^S9u0iRm))Mp}mWBkfBJ`hbkYdi_8mNj;cYN`1Yuv*r5Dp;*t zKX4euyfAO zcb@@PJDnpwXM**~8l4SRJBuSe=YX9{;+zXsE90D3`y|f!a5dxP`Sb-~b8rk}=;Qvm zkoF=D_f*a=x&F!FVzBe`nzsS-z67jh|4reSg6%&WhqaLFV}H-V%fQ+_KgBsehhg() zntg4~k@Itl8XJ2{4$sf6XmfsEK@87}@M{Y0`Ez~2^}DgbZz{O{w-#Lg+Y9~y{LY%^ ze7h2EUgi0A6`Fe1;A*hix*XQToYhj(Yr$$c->w6zmFL?HaBE?I=Oh<9AN{i*zX5hX z>Z45`Yoea!E+fy94Za`e@U~nyP2KyTIn)p4klF zyTNMK@E+QGIjn2;oLryuzYlE8e15tgtY-fQXdmRTfA*YQAN#wn9;)r`IdS&f^w@Uc z@U;U+_S}v&-iCIk8gEa#Gl%eb_rZ?mTH9}1@N;1Ge0Kf;SWUZo z`G?@l#d^!l&00H#*gD%UdA zpMlk~cU}gom3!ysaO+@Qos(SbeDqH~uYs*gna?lL)b)41@~p|Pz}@&8(^%S**X!Ui zuQ%Xo**jh*e$C-{**inQZ`OMD&Trsq**kB8GZ*VEH#ckT7-H*ezvTH_uzBjQpZ4b7 z*&n;FF&x=D`__0A?S3`xq3z{x?;Jpzz4IP1%f0hK!PP%(@Q-Sq+W!vj7-j9>M^n#U z_&r!Hd%-c)Qu9B6)v_1<2v#fi!k^&I%Q~5(Tx@>&C!arqooAWPU(nR`H-C9*{4uy2 ze`6X;d$Yz$ppBG&HpAAm;0sb=;T>n`b zeAa?{KF?in{pW4)`3kQ8;sw`#i3VS?=Be>t$=5lTHU1P$J!}3quv*sK8mMK>KLe{} z&HoNoE7$xVaO>>4Su?rVdg-5hrXxS=Ugk4Bn!5hhQ=T>N0C(eWOk-(JUY+1FuP(S+ z&VS!K2EiRK=fCeAGoY#G{GSo5mh*pRaOUEA%FWHSbPTcUXusq+8@QX;`s=4XdCm?l z^PB^&b{zAuF6KEW+&o?=hlh^S6{ioS1Gvu zYZYAobsBu#g6luH;Q9|~@J$M?|CR;Uf2#)Hy5RcnRB-)wY4BYOuK)0Y>p!BwM;2WF z{R^)D*ajb0aQ&wiT>pa`{E&j{Kds>UAKT!^6n&S`FNdzcG!aJ$bDTF7sLguGYSG4r*PKz65tXubs))^LdtTZvxo!$JSN-+Vo?JHrm$?pwt1Zak_x4`v zhk=u;b4ae6qiaj9TY%NHo9kD>$<=Fv-2A*QIF5L0TKgr}ZNTQLzkb@2>$c!B*X`hH zyOL9K-5#D?okMcn0jw>#?g&;(t~-O1tJfvD`FTxp9PzHS_Din2fz4Ha{j?|7uYt>4 z_kgSI&XHXA1e>epV!2=ULf4jD_Xeva*L}dr)oY^M{Jb7Ij@WCV{gUe_u(|55pZ4TB z8eHZ&2Cmk_kzDr$C)aYn?uV`|x%Pt9lIsEBv%u!5zkb@2=h@&g&vW5w=Wry?^TFnM9z*4Xl>u9JhnjPA7)vwz2MjCsxjFW8I0aEwSzbtL1kh z?gp!!MU1EUyfuhE_rM)PTlVaI;MCA{mRl3o*tv;aU;Cy$4}!air@wyMn|t;G?7q(7 z$eum7#%I!=SL3s3&*yN@UPzlg`w%h9J^N_E)gN#0Cu*KG|0diq$~FHMntJx&!(g@S zLB~|fT7Mg?mOc0gSgqWHkHMXnbuve}*!=WQK2L(3XPM7aXzKc#zdSX58r+S)F^#3Y zS>r3Q`?`!HHU4^yFQ&b`#+TAw!C{TBqD_sTA!b?Q=L)X=e1re6=9$xX;Eqww>APs^ zsqy!~YN@efs-?!yg4I&v?}OFK8vg+9ysVQs%EjiVfAV<&>^#eSeuSp3zxm5k;}^l* z_#4w$+M6}L0lTkjIa1^6YJ3gt^&HmqM%r9oUm{NGYWs47zf$w${bRUs%DjJqrk*%(_idZ)-rScIlP-b`s=5?Iph&tz9LjqA0!=;jdJU{r*6UYr z=V4vUQ7$$={l(_ybvE_-HN2ZX`s=4XdAtd3=J6Xe_3Y=jz-oTJ@VVe_#CjX9o^^Z| zoV=`s++3`KzWVJ>zu$qaw>E1cPoD3C_rYd=`)O~k>)qIW-OiD9y`#q0(B4_&?P>4g za9!`A&ANU-%yL~nZ19f??z(vKv2*@rjeV~4Ee_}ZZQ9I#W@46mdDaG>t>EtExeGoDK5xMt zW4@ZFUNgYWp{&=8`f#LPGlA90dd&iN9@fPi7xkJQ-c29<_0yg_<^VVI zm=jGsdwDLfTK4itVtoOwp1nK|IC)tMxw%*eef1knzxlz|TbnhJXI&Qn?~l#?_S4>6 z*C(+1dW0kE`e=<^*T-r+f%b6@*Y!!-tm`7gEZ23h24B43uIn-d_gUF;1$T_)Yo2;8 z2!9N{T-Sxr)U&P&gVoA)T@>y-tcy9y#pb8K*xY)Gb?t_C(?@^(v?q@xz>i@o^H>s1 zJ?pv@SS{;17XPK;>RH!i!O6>7$j!w%=&Rp&`mF%A-rB5*JnOn5cnUWA+fRFQUB8Rn z*Hau>*Qaajx;|6m!)d?6;ktg0HtV`7G0Sybt-)6>xa+!h!F?{WZowU6y_%<RH!Sz-r~Xei80Gtcy9y#pb8K*xV)->$(QKn?CyMr#*Rm3Ea$MO*Hka>zBc5 zS=WPzwH91G>$(m&d07j&xmX8%^*fAy>w~SgHfti!x_$*b4V(S#r@gtZ&tv!XEJxP$ z`!#l5pR4hSv_If*U4KZMbsbF1a$Scs_$CE+UAHLsaqzDe+%dMQdFr_V+#Jev-4IPZ z>$(wGtz6fQ;m*Uln4?^5el35nxgB1t>!$E-`slBp_T;e{xS7XLH1(|OFtA$I^;lwU z4p+~*ZV66a)Z?5Z$*nM5gk#&8c#;)s+ zI9$sg(`GGqAWpfKJ2m*uHBU{pg&U__o9)olvo_m<)ylQm5pFKd%`xR-$J1ZzSSJ>1 zvkSbNKKkpYy*cNXvHSW7N9O#~8awBgYJ4{B&p4d_E3}#a?!+wTzh{H*RdDz6sDhsf z?`kh6;eZkgSn>CSVFYgDw0Gs{o zr@gtZzr^nA=NwtrS8MFL{-Va0(!R#wy8enb>pG5@<+@I2@QDR?T@Na_-@_bIaK|{b z=BZ~d+#Jev-5*Uo>v{lKtz6gfaOYuN%uy~jKmEn#HkKpxIuP7VAN}>yo;)Ujn|Vw| zQ_s3i0jp(QFCx}dxO&$0U~uxX7IJg34*KeM3H=TOTW@XFM4mhk2VaTJ{`S+}T-P_T z`+A+jb#;y2sIlwtYYx})H?(Ennc?qp_wnelFM;f8g--9!JiN-__W2t@85G+lRwg0gIUPy zOyZR_IlJKQ^@|JcntZ+B#=oNA`d?M^?8%eh=1`s+C!?ubhe6m*0h?QX*ZEYqKI)%P zo6~81`MYP@PUBE>E@JDl3UiUGTTkb47RS1LcRm+=&jHUvtFGO7tC^>3e=b-pKXYYm z&x5O*!v(ay%t8Hp4mHOVo5O`QSNHpW>v{>;xX!<hEiy&f&Nu^unD z{!bQM|K|#>|MLak9{y6n^?$A4`v0on`oB?g*J@k%9dPr0kUF`K?}Dq{$>CnUht`*S zS=-$lKjmGjnuM#9|ODI+FUQWHuvTeVAo%pYbV!c z+^4|C(&jqKa}GTXz7-$i*-v}+^mo9#Ou2q#4XtJFjs73ZsAk3h 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 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 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 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 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;