From 7134be23295727c5debc4a982c40aafb58a8a3a5 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Wed, 16 Mar 2022 14:40:58 -0700 Subject: [PATCH] Fix missing blend/clip logic We always do BeginClip/EndClip if it's a solid tile and the blend mode is not default. Also fix missing entry in pipeline layout (affects Vulkan but not Metal). --- piet-gpu/shader/build.ninja | 2 +- piet-gpu/shader/coarse.comp | 13 ++- piet-gpu/shader/gen/backdrop.dxil | Bin 4584 -> 4576 bytes piet-gpu/shader/gen/backdrop_lg.dxil | Bin 4584 -> 4580 bytes piet-gpu/shader/gen/bbox_clear.dxil | Bin 3168 -> 3160 bytes piet-gpu/shader/gen/binning.dxil | Bin 6336 -> 6336 bytes piet-gpu/shader/gen/clip_leaf.dxil | Bin 7232 -> 7228 bytes piet-gpu/shader/gen/clip_reduce.dxil | Bin 4632 -> 4624 bytes piet-gpu/shader/gen/coarse.dxil | Bin 10460 -> 10568 bytes piet-gpu/shader/gen/coarse.hlsl | 129 ++++++++++++---------- piet-gpu/shader/gen/coarse.msl | 109 +++++++++--------- piet-gpu/shader/gen/coarse.spv | Bin 51712 -> 52356 bytes piet-gpu/shader/gen/draw_leaf.dxil | Bin 6068 -> 6072 bytes piet-gpu/shader/gen/draw_reduce.dxil | Bin 4264 -> 4256 bytes piet-gpu/shader/gen/draw_root.dxil | Bin 4468 -> 4468 bytes piet-gpu/shader/gen/kernel4.dxil | Bin 14232 -> 14236 bytes piet-gpu/shader/gen/kernel4_gray.dxil | Bin 14136 -> 14140 bytes piet-gpu/shader/gen/path_coarse.dxil | Bin 7068 -> 7064 bytes piet-gpu/shader/gen/pathseg.dxil | Bin 9604 -> 9596 bytes piet-gpu/shader/gen/pathtag_reduce.dxil | Bin 4640 -> 4644 bytes piet-gpu/shader/gen/pathtag_root.dxil | Bin 4720 -> 4716 bytes piet-gpu/shader/gen/tile_alloc.dxil | Bin 5148 -> 5132 bytes piet-gpu/shader/gen/tile_alloc.hlsl | 34 +++--- piet-gpu/shader/gen/tile_alloc.msl | 24 ++-- piet-gpu/shader/gen/tile_alloc.spv | Bin 13460 -> 13360 bytes piet-gpu/shader/gen/transform_leaf.dxil | Bin 5664 -> 5664 bytes piet-gpu/shader/gen/transform_reduce.dxil | Bin 4700 -> 4700 bytes piet-gpu/shader/gen/transform_root.dxil | Bin 4828 -> 4824 bytes piet-gpu/src/blend.rs | 5 +- piet-gpu/src/encoder.rs | 14 +-- piet-gpu/src/lib.rs | 15 ++- piet-gpu/src/render_ctx.rs | 8 +- piet-gpu/src/test_scenes.rs | 7 +- tests/src/draw.rs | 10 +- 34 files changed, 194 insertions(+), 176 deletions(-) diff --git a/piet-gpu/shader/build.ninja b/piet-gpu/shader/build.ninja index 785e016..60e5582 100644 --- a/piet-gpu/shader/build.ninja +++ b/piet-gpu/shader/build.ninja @@ -48,7 +48,7 @@ build gen/backdrop_lg.hlsl: hlsl gen/backdrop_lg.spv build gen/backdrop_lg.dxil: dxil gen/backdrop_lg.hlsl build gen/backdrop_lg.msl: msl gen/backdrop_lg.spv -build gen/coarse.spv: glsl coarse.comp | drawtag.h bins.h ptcl.h setup.h mem.h +build gen/coarse.spv: glsl coarse.comp | drawtag.h bins.h ptcl.h blend.h setup.h mem.h build gen/coarse.hlsl: hlsl gen/coarse.spv build gen/coarse.dxil: dxil gen/coarse.hlsl build gen/coarse.msl: msl gen/coarse.spv diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index 961fc99..aec2936 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -31,6 +31,7 @@ layout(binding = 2) readonly buffer SceneBuf { #include "bins.h" #include "tile.h" #include "ptcl.h" +#include "blend.h" #define LG_N_PART_READ (7 + LG_WG_FACTOR) #define N_PART_READ (1 << LG_N_PART_READ) @@ -278,7 +279,8 @@ void main() { el_ix = probe; } } - uint tag = scene[drawtag_start + sh_elements[el_ix]]; + uint element_ix = sh_elements[el_ix]; + uint tag = scene[drawtag_start + element_ix]; uint seq_ix = ix - (el_ix > 0 ? sh_tile_count[el_ix - 1] : 0); uint width = sh_tile_width[el_ix]; uint x = sh_tile_x0[el_ix] + seq_ix % width; @@ -294,7 +296,14 @@ void main() { // below will suppress the drawing of inner elements. // For blends, include the tile if // (blend_mode, composition_mode) != (Normal, SrcOver) - bool is_blend = false; // TODO + bool is_blend = false; + if (is_clip) { + uint drawmonoid_base = drawmonoid_start + 4 * element_ix; + uint scene_offset = memory[drawmonoid_base + 2]; + uint dd = drawdata_start + (scene_offset >> 2); + uint blend = scene[dd]; + is_blend = (blend != BlendComp_default); + } include_tile = tile.tile.offset != 0 || (tile.backdrop == 0) == is_clip || (is_clip && is_blend); } diff --git a/piet-gpu/shader/gen/backdrop.dxil b/piet-gpu/shader/gen/backdrop.dxil index df2be88d04c2feced45175e7cabf1f0b1f17135d..0fb9622eda673c439b74f7538c649b770edef248 100644 GIT binary patch delta 1380 zcmY+EZ%h+s9LJx#>s_zqs#p5QYl=xbgcTg-N{~Mb&bzj-E4=v|Gmbvre6>hHcfb1cDlwn)PbqoPU<;a6{7(SV)F@vEbqhoqMsX%8T8b=bq1f zzQ5;r?s@Xe=g#CB93Gq9|JucWBE+We@uPL`Xj}dof&c(BV}>4i#Zyn{!Rq;j_Z#+q zaO%e02h|SG8#NXs031NUVHki+A4obWB}j?e?D1(c0YG5gxZ4$Amx96W?iu0fbij88~D0G$*7wf&vSTE7uXn)31bb({dojoG&Pke9DnXBXzxZ?HSR-A zaQ~EQtv}~_REvZL<2ZP7@?!=E7~S=}Ek^*z#S}o`z-iGD2^e@W#KOFZVse#k7wn(O=w#twl1>B z=Hz=^s4v6bi!U;*vV%wWK4T*Ry-n_^GPW$=&*zh7k2mB$^wv~R6=Eo0JWLX0vKYXw zsN{v+EGld$i^1vLwQ1u7WDd9ac& zd!O@`7hGJ!C@xC;W$`)ZrB(l|I;3`!OI?C9uC!N&91KKVQ8klcai87qm1m>q_r1s?CU-p?!+uG*fGQebYz}VgSpGtBBqnVZwpK^qnWJI6F;^+LvX`{E%Mk&3u?_hqkO z|8*>A);`o&yg$6na2L#vGaGbRs25Iefr_Ml2rZ5@aWQTvn&2s*mu{T~%!((u8z~PK zpmrM`naHjpyG7PG+EjjsAGC_I!IA>GN}g^9Dvr5d&?FfG#f9UwSZ2Qtf|wEkrvHmHY>{V$k-Mze;N>P z5cf+!S0l(D7v0B60O~rAV_QRdBz2Fbls3oJB3O^i-0L7z49+mX1UE*K_4>BP`$>Xe z2uA;oHfibDNZdq#zRgG7%Icom=$IK$!eA@G2QnS%3>q1w4>Q|#f%DB(EoUD6b9b&A zeO9@1u5wv%ENjirfr4T6XT$iud4Iq!Z>!1A4=@W`iBMTnW+v<)50RT~idJ=oj5|oT zw_)U9OSQGI$6);##8M%_Bdm z-h)GUjg9vx@g?Mo6_iT26;*-=2fhotdcwv}Uq!=$s}EYm3n#-6PmyGh z`1U_rhon+L;xtJCMMRiIKWs*S3pfG32{{bVj5=oGg(Aj|SW$(TJ49a#lhjcfJ)?x^ zX&%`}-=J{eBm|2|YLBs~%Ge`_=E*13O30mRk_W_^Bp>~ku&N3&#n&Kqt$#^-9yYm! z7h3kwB`xYSb78Z@WgkdH$DwWk-Mu9{p>!#BkiM^0gf4hxIRu)D*W?%m6Giu4I~54bx}_by0Y#2(q!z0%FHUkjr*Cod=7d zTj?RJC@NN&m`bl+bX;==GwJ{lcYNVUjNn(aU90f3X`nezu%I#|SB&e-G6T<5U4Gfn z{GWnYKYfGGJ(x_}H5V6_4s!UeuTOEK7EVt0_}Nq3SPIw)yer5?-BdYf81-u4;vT^+4>mWu4qrd+dZm%ka(xR?HWkV;hQLdtPO2iQOPt;19{B{ass-|A*yI<+t zayGp_g=MN2Ug{hX7d~dZh#@8GqIAjhgf2(Rf-AvRBhoZ(9OCAKdK zFoN8&%Y!bwl!eN*klGFE+6q{8DP))&s}Jgz47=xDRmfWsZ!puo2`PzT&o@XlQK4OI zt6M~Brp{&&>}B*D?7>L(*RsF7{|}Oz4v%~xh=Oy+3i|fYXKQUy(og)(A~bss)KkpURHdWw-pqSm#SnL zn@KOl0#26HAOz=2I>(mA=>lscYBcLDl{uB9igRizfrVtaPnht*C0nvvln*;!&Uya% z{h#xk=bSTVo;B<2POELtsiD-LPUj6Zt$6y$+1Bte1OPBQqU&Dv_LityDt>d~`TBog zQ|9|AlXmCUvV0N%0pQ>`3P3UjGEU2mbXm9BB2y*`0AKj=vKI(En^H1s0(~iphCYsD zOjO;61n%IDVB!=3o}=GvQgH21jLJL!?F<0reeGnqR}W*x9HM56-~$`=Y1Wz^mp}-% zco|*P=$m)wGybR{+=7uni?DkzdIAVOp2~U>y`RV-5``9UPKknMX86D(j(*tRoEsts z3)KxRZAYe_B<@d7&D~DSapUpmEK~m7Woe|pgStUox+wBW9B(GBE78}QnFH5SsUm6@ zBT8KsDh8+v!y}I`UmZHpfAwCu(wA5J*_u!54jpc2ZK*)dD|P3N?`BT#K9x8b3E8^- zT-TjZTAlOzLTUAQQ8srwFmv@*|HO^oe*LO{qFg!jj_j>#X*<-;x5^bAu0T~`4{k&? zE+YV_+{EQrb$+su%ln?G)_4uKgXs#A_BoZkAn?Xt#8J8F>zTz_TrX3=43)qqfJ?}h zGm`G8)MG(KBf~ZEn)(2Avu*(x30P_nHdtYnZ1E9=?ygeR*A3)`U=8O z#Y`)JVG7ZBdl@4jd{W`ES}|hL_2ys^k0LD~<#)2!EAwMXm%mR;n)weHhZ3orZonJm zvKBKxx9A-mdfCQl_AhDwB8EzfA*p2^T+)t34FZz6s5J%s50HTwxZ{`1pweq6s+n3T zebl8`NyA9jN^DGJ$rB~d*a_0bcLXO@KXBMv)M$isu}vH{0q&+z3N0|r*@vTnlpk3* z2JJ>Fl8+Sd$P0|4!q`m?XR}c`tUTtV%@E4x4<@X+qIJUR8B^8My_SAUFieeWPQFf! zM7^|nl;%MxPTWm1D72#BxY^Tz$Q{o8IY5TkJ7U&>;V7@ZHovry#Z9h_2v`3zRj-9fa%nNp9) zXPW2L2<{cAVxz>A6{nZ-Qr<=U8t`f17tU@GWxMoe1nPS|X%2CQho}cgq~g7pjYF6* zRV522RenvSN6kl9N61b`;-$Xhl`f|8=-LRW*tYOe7wBH8&E~?iw-hJYwBhJe>WX_JGXGP0~cModmk8EH}71-V*HdmQeuQ-wTIqCr%ZVEa%WuPQ>ciC9(Ol>tuf zn72EyO-WvBVBPWLORw4)!nV?aM#P;WzU`5eK{GAHX8D2w=Y;_w?_;M@j@=z{y-eO< zc8E2?4Ebm6gayQ|m~bZ!JD4Wjf|2fAZOg^n!*v_|95qT^qcc6!-|q59PCcQeu4YAQG}#pds)82LWoFBI zJw7$nRAGz=nROb6t}Ylh!y-#s+HJ;>i67h0FasGOUE&{|b5j%l*n28Vw)da+{XOsV zJn#LU_r1BiR9?2zQ^te;4FuMy%h_G3k}pSVS~{r5e}8cLm5aaZe|W{|*;vJB0T6%^ zgirwF8bCS;6*R=l_}G0b0YKZxUDXo=&m~Idte_`DvAc)W($>sxU8W9~h$T0G)G?+ueA zPx91y{jfE>j=X^Zs=d~7)6_S=j++_MpkOm8`VwJp0+&XaW`65-@KsAi>)GG_{CU0) ze_UQOU#@a=nwEd>TX9Ku{1UM%Rqv};wpZG0K0dvf3>5E9%mg{QiGIzlZqp^`5J$Vc zbt8LQH|7#jP!&JS+wB5u@Y7KWl#U;KV7 z8fvZ#_gWLJCkh7M|GdXsFfd@KIs~=Xr&DteBlmAjr{>RNW;uJg`K@qXtrl}e#xiJB zhrm!NY}-mXSVPaOZdHJ&v`2uo`=gi|JUw%qRRg@Z?ZwP0Kpw6Ek^nBnorCdgG2YFg zqJ?IgSiLWddzo4RSk!oVPQ{-8EL}2MkyDX}tD%_rCSDUk=+JU3=I3W{fteP@5PHIa zIhk4!SORMNc1{RERlAr|BuMBgSbT&SCquLasHONWRl{&^JR6GHLcy{Ob8(*;&mk{2 zld2|*vRRg`?_a*{SkCH?Yb^+iC-G&wIoKo6S6h-w>W(qB6j}IgIH40`EL%2bEgoK_#hi^TI(#^2b2iY-hw66Z*J(Nv}`< zj&UWuMt3j`LbIJE>T5!u_ky$?ZHS<$Bbr>(Ed|qQZWoC2=1ML{(pGv4`;}yriSZ>^ zmS~?Au|OU3tBdB87l%!AsCpayz?+L|WAr}1WbfZ+3q>TqC*wl|DpJvqa*=DiBBpKI6mqf%ozOLq zq4+^Q;Dz3f7Q=JzA;?`U4lNOl_@Hn^MB%riAFJE6U2J3aseF%jQqym0JivZl$BYUKkSkBI65|D$WwLjvWQV^0j(-5Rx5NDa diff --git a/piet-gpu/shader/gen/bbox_clear.dxil b/piet-gpu/shader/gen/bbox_clear.dxil index 6b3efaf964d637770d12e7b2912c744cad574b29..6655b7f9ca1149d804b413fba4d5c3313c10bf74 100644 GIT binary patch delta 504 zcmaDLaYI7VCBn&B=E&6MEpL;Ho~>TKGQqc_nUR5kA!4IsJe#H7uCU7@9}jcBn4d1E zcFv)|CBoC^1S@F&1YjRRg8~p431N)((eEmWG_hfVqqdESVV?DkT^g>?TJtJJ+jm9Ny?C z!NZkYEX{UAL5*Xwb3&7Wg0zrRWJh8GM}qSOAAwbAO%rsa#U4d+Bqbb#Ecy!CUG8GkR!1n@rHxIwW+xpE4XHC(aOmw%hk(FNzE$>Zd$-4 zIj=i*=AD>Zvu{sn$Z%?Vo+N%OE!;xQT-D&!goiuNENq=P^`zz`Xf7%S6V>E!_6?C4Cc8uXH#vH7H1E z+*8hoHcd)kP~c!=kubU4!3YvHkykOfoZ-a4W6r}UdB%vv$snl#q@q{C=V)@T8jFME zged|JtP{fo4t6*)12x#BZ!lzRFO+#c1ul|tz|?ViY3%naaFNUlmW}0X^PbB&y1E!7 ZT>u%_FID0HVd25=wHI|78-TF^0sweqsy+Y! delta 444 zcmca1@jyb-CBn&>0Szz$`3V~(evAkcXB>(Pmza#A$#*iHh!kbD$EkHd`APsS_2w5rnoVj5aYNi$uP?p zY+a=U1B3nKj~u?C!Yzz94HP&H9cRcf3AZTToFKsM%;W6LAkCEC6ksXb(sFZyfPk}r zv#_h+2E_?x0_Ry6gjpCBE{aWiX6CqI7U!V_J_2p2hbQnJW^3AEkn0>6$*?taawvt6P*>B;q)Fh%ij@kH&})vG5bzM^kI=9LadrUnHGjr+$m{4ruNCu0DciYiNh;}TI9gQN=}z5G%+J_izIj$5k2 zMEs=+d@rQNUbi)ciS$dA_&r$I_*||sKv1wp!USmG!Od*6cK2&oPwm@CLW3vkQ1*X;+ahX zX{u1dt!){wy&zcW6njA}jvYFaK(6MhT*cBGu0vb6<8FFa&jP16(>boaU5WJepWWyA z{hsG}pWpku@A`B6InvVF;*z3!w?2Q$@9B+keEFa~aC&WAI*H;&bHVg;<~M#gcw6;w zn5oFVwusjAZ2z+Fyv1i;jZm#6fXzp{ypslK*rY-Xfbg*4_Z)_J`mjN(d-?Da1C*#x zlnx`nRV2m%6t=K-F$s8KgIF``0Twp2w&htGkYS4oeF{PPu;KSaVE+##AwPzB1Z=iw zmZ($pOXEb9o^E04vme1Fyb22T5+7g0BRyU;EfGq?|7--I3lMn%q1|yne2B~4P5|&z z_8rf!^ca~!tjwlFf@CUs$S3M2!JMnpB)1X-ZywK;z`2X5=!FT3`mHV!K^!Dif;W>1 zLXe80hKt!*GtCYU@+TM?O-1SVEq<4UZ>ZfjG33pl?iGyOoLy}{+P2HtF`U^p%#SOH zVh-lM_DAH_UPSj$cl|1_I7KSGu3kw+kJ#vD;)7UhJ7y;6fXjdd0aot*@Wb(DB1B?- zYTAS}07L>Weoo?tOT;}pFYMw@GEa1gDer?bf^)8MnaVQhh=QV+I#Hk^f!@}3Jc0r?;8NDb& zQLI`tR1LMtDz#R2)KG+?qApQ04#qB0*yzYO<;YZHF*v_FYTwJ*=4hzK8@V6K^t&M* zO%gOzFj-8%KJ5Sw%6zO=AoBl`on3wSL zVSnDzrvE!S<`h1{)Qhui--1XVh~U@za z=}r|D1dtwQM=#}}UFP@|QH9b`16P53@%eK_o9$Pwmt?_Y4%@yWx51F@zwA9ji})}w zXn}Kp6xO2^)?78%+Q>vmqHQ9vDc{=4NnBm)hCl5g5?HnDN%DWwCz6l|w)MsC-#vqW z;SNBov;{xkE$-BY>2>|E`iZ#fox9eHpPme|DkSilgqMMAvU4vk(OU0vnXP)c))Hf= z!t-`Z^2TFsfO>wV-)-Qt8EtNRT?pO*=c^ZjRSTt0U*I*#GNB|SnypMCjRwg-@a0aA zq_9u&ZEKY8mv`W9B9~hrG1^t-EAdIDs_zG@gU+1~$lr+ge6~e;c`Dfv1#}szq_h>%8)u!TjTi>t0GK-W8oCvP#yUKo2;FwBF@47pqm*XYhUEXDdk=f%-7s(VAgk@%(n9Ohg>>fz9a zfaPOL^4KF`&Rl$phzN6TBIcriTlrY!^4~%VNVm``rLiHEEvA7M+xQQE50^oBnG}`kFGO8+|e%%jK`!H+nVhv!m{_^sNoCvaD-c zzBe4GgJMg+)7^H5mz*b*_hnF+2tFaSJaXvjZfz^{pJ@QlC6{A*j4Z)5hqB?`crNNd5}T9X#F0mPIP%0}az001c}!m6$fSxRr~ZLs dmz;qce3!I+Ud+91Ubk4zWz-3S?4Kh1{0|^9yNdt- delta 2206 zcmZ8ieNYo;8h4vW=hjc?DaB6R|5NWEwfHF#mI!gc#6)|VMYbiam z2@q2ZHO%4{p1sA=k+!sk)1f%$9|<6bbJ~LE&EOqggXPrg^m<^=n|8F*+m%3XZvV+X z&+qqq{od!@gp47h+EQIq4F2yKQeQ=J)mIlzS6=^paLciKhi*Zop-U0eE^$c_=GJ$i z{%_nzH^%-Lg|#G-KoYfyM;T@SM-6J;#sWNQFq2;ZXxRt_VkHtXim-;`Fl>$*p!gja zWtR=_MjZ~MQELO%Vj=+=wTMTD%`3^Nc}V)dkWZ+z99HiJK*2$*ZMhS?iQpy=nocN!vV5dc~U0Jd{Rtjwi?*}qVv%t%wxw?i;Ake@L=ijPgvdsDhp-T(coi6aXzL;?~PtoY-)gR zPZ(}?z5SW}tUY;Fzw3;C)g)1KI_2H>FXtBy=LPys^_|e**?l~(2)hbsYg^M;#7z@T z#CjvzrWhmqG!ejCTkHNx^|*=lus4j|Ah9eI4AbNkAE!UN>+F_f+Zp}c9&(__`@pdy ztKigs?&oKcy@9zaGaW;BPFydO`PbLKp8INJZGFR`vV-*vP1`*ESkgPkcHWt_pPQ|| zGuy*_Q0#rM^*&be{HfT-C-0XO6lBg^qL6?@SxW-&yl~1YxF$zD#S|_RFLfp1JEWE_ z&;!=h!Hpk(b3e(iDtu-&!h3(lZo)26ap54O42*)RUm(F! zU!QiffygH%+X#036wn%HN7uk(h=q-lR=koNO7rftb}%z6T2%}7RZ6SJgYpk?Opil9 z!OZLSgJZ-SeHu@#G|kxo4IJgn%50q^b(SvUotje0!HPXHjJ%(@S;V=OI+ruckfw-D*cE|@wSdw6&!jU2ZzDV`rVAG()PY4U?fe3$bPJkxm@5&%* z7WYYs8+mHWO7i&24Dwoq2v%4McgC~;4OZb^+ZZzuV5qaUotTS_|Y`i-6{8 z+jcx*rK!Y!JLBk={8?})rpy+MTUb+<%8UcZjAJ1t^O0L4`8837vhv>F0c~X4mW?ap zmwsEE1OFh7uQN5!YeN^vBdk&i1DXPDy@bq;S{)_>$Zh0eRSFlBSW)0`iV~Msx5Izx zB2omk-09lK?BR4IRv10v?|2En>kC7Iw1xF_VmlS3+j?NbvbawzTb@cbjEoB^q)3`% z7l3A@eLGN5jwvy-!>oOwHXbU&O|;516#ogZk8KJ0XsM9V<#XG{;q`F7VWz!o#X%& zb(+(wvt8ZVCr<4?qadAT3a)bM3ZvV%pgXXb&^V_R&k8Cx$F#ba#3B1iYAD{gq{!BN z{hJv7l7Rim`@?XQ^U*{NJh>#Gb#Pjnus6!NoqRw^L^)R`>>I;A{WF!V7Z9L~TkfDH2_05e zRhZwqwvP*F2y{q9dhA!Zpnya~NbYHTiU?l=rBWt*4H$x*^VV8I%*i>MC++DMC74!_H&Ubg+}f46ru)gr zab`RMgnhlN=~MhUbbPuU4Dk89=gCwyMl_?a@pJ>z%ZxMPO6RJR)+EeSE7gk$KQwmR zJbQRgn;zlLX>(nMJpB_xnkYR#r{5u56Q6IpIc<5j*!1-CdZ@E{wI^-$BYmb1UEYv+ z^sTQ-0%_LHerqTDhb6Ic9QU64p580*&w0ViLf=rQCweoasg>P-8|c;~30KPIY2+n1 zIiJ*wz7AvDW*rIjar<@pv>4o-CRt^q01mfhlpoFzhB&$oYO^69#+9a6VOYa+13JTV z2M=j_WL1T8$eXkt6-ZFT-caVFid(lO-tu0RUhflg?6U-kM;JRQ#z+;@r zs|piMNkIl1#_SYgM_!-=+HMhjcuaI2Q3@foCXpE^5eVMfs1VL4i&4ANg`CnRkvz~P xl82v>3qH`=bYd9 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 K6v`|y{rnph%ldWz diff --git a/piet-gpu/shader/gen/clip_reduce.dxil b/piet-gpu/shader/gen/clip_reduce.dxil index 0ccaac9931c3cd4794fa780051ce12667dfc0386..0dff71b61fa0aa0d74bdb368fd1693463e98304f 100644 GIT binary patch delta 1212 zcmYLJeM}Q)7=Q2DyB^1RJ+7P_E1IhyQ2E%EA^7dJMTQ7VVMRfR9tdWR56h+rY$Uz5 zd^CnXs?~+;BPoiLB^pYc2{T*PE7d=s%Ze@wBMkvUHnJ^CU6zGR_Hir{-@l%(-!H%C zdEPuDS-!0FvU-d4)a|0D8{$8@3E}xgyXDGd2mnA$rhl#3-!o@@UjOe#`^DbBsx=Q| z#~pp+y4$fb&)g2CF|IqHp*a+;3oKZc?~Uno0rh zl>=`cwQwHfegp+XRDt!f095TM~kFVqYe~rJbzyp_V8inpjC5G!qd( z_|uRaDC9qi7<6L?T6+rHx-PxbYrCj$zWXM;?f%C|KI|_h&+VOr+5*rkUfFAgC5{z3 zZRr;R=sCVc1RRDAW|Y1C(ro8jq|NA4y+2CootH(l(t+Mef^6~tGY?IO6mn2J$$P^) zil@J1l(+MZ9@Vb`}6$5tl$X?fG5jWw} z^za=*l?(_yb&Usqj>E*D9zFs*4d^bcoFIT&4h05E>IaqwqhwT^Y9>xY#QAhQlQju| zQhSWs%SMSsF|}L=2k?DUG(0Y*e(tW7QamUy^Wz=MsqlQAS13?aFYN>t%ubg7*P}mP~Oj z0kct>Q<~{s8!*|PQJTZ-UgW^6FV|dPwFmK_8`>E$uqB-P5Gyf6f+w9}Wxf#^MCsg2 z6a{Wk8dnuW!w%2RL&_k7yfVn%+@Zq(z-FSDlIA~~E?jrzC&F)8z;|47tpzX%_sON? z7faP0>bDxzEBuEPNb75J?Fro(J}afD)JoSQKg$_*!@i-pelWF^mwW~~@?aevcCwtZ zLwQX5O9F=u4ri-F$k_%VIbpC?y=Hsnl6R%e z2#(P+ctWv&&y~sqbQP=xz^zIt^H-|P@ zx4H#7rrSMA%Ez&sZaN3jYM@3<#TKZfoBov=>-W*dtMu=Vl;Dl^Ezp3@xJ=5GSYGKQ tooCkGSCeQ2V9GUUM2}z*aW;m#*pBow2Fg=lEl{@v+k!)aa#mix{{T4%g1GCsX=gt6-^rt-ra=s=WgSFVz_mRKAJM${_~Ws0VTZE?}8 z*I&@NYP!LU877utoSD^iRudMT_9#<=Owp)WOk*%I!s3=V7o+=QZdW5&viHyTeO}(@ z<@0^-eZLXo5o3X+t)2(}GepMpcLkTTYAbZsV_Wol+e4qW9GlgAQf+CoIZR3b1b~AB zC;%A@62##W(2!U*C&U6i@NG z)wyv)q?)>c0bRhy+{`~bTWy|>Wur_ZCBB!6s8fV*gx$qAZ2;%@SbK&a{&{!yF!8LR zb+#d^syBb})vnUh>O-gDyK|jgop``*GIjBf8!69<9jR%rneL`nR+4^oiVmCUX4lrl z&K}#MvYz2VE!Hyrxc#?@nb}+S(p<~Z}~!B}{g zJu+ZO^?X(~xbIYdVcFoI*71SNok-8kJc-`Fm7beDffZ&NpJ_mod@du!q6CC~)N>x` zJZ@eXl0s%wWN2=;vtUP@*vfVYfFX%1MV6iax!r7sn2G9&M2QMYUG?BLvk7+rJ#>2M zxe$^m;P_A=>~3N>8*xfOeH!^zpo6P~^=ud|UY;TX98AWMT&Q5zP_P+10b!5CIuVAe zkrA9yFCqxw6U5Ny!jtBwl3QUT~eV)YOmPsvC=tagY`y$!?N;_FTgA~I;>Kzuy8jMg}eG2#=^op9K;5qCieYpw+ zFthBAA$6N;#E?)dqj%GaR^Z>zJ4!Y{3Sg4(Io@RQ*U-V60dNw{ITHY-G=4goCyYfA zj)LE8T!B}U>%6vLvlXv3ndjrB?Od>$Y?hkv7H6>bND12jp8l{h+ zF(K5qhwN2{7!4udd|kxPc5~Ps79_BVkQb3B!aU+s2{s+g(#U-*cgTG#o^)wU;L6K^ zd1%L@xawm@b&>s&0&kA{1}F}{7}Y;V!!!d(pOmM0;8c27gcoB;e9MNY^6`>~3xqL{ zx%J|GY*q_--L>2RmOh{GwTf#iE`db^DUXo-J+<;;eKJSh1Gm(gKZWjB)@RX`9H20N zwsG2<@7qf^lA`L8=Pa{edfA#JY~C-#$AeYQKU}I!CWZd>b3bQ*LABYGfCm*s8NKZ* zUG8cWXy&N5^c*lsS19(ay6P zk7BE^C5Gb``|&_sJJwzDVxIJi#XiEvwWIdfn0+c$?)4*;r2Nn}5^s@LglkhuiS91g YY@q!Wd=&TJ#I&s=j&TidK$b7f`C)%RY7y}sW+zW(9!+~>TXbI)_mdEVz- zMpFCIJmS(tvFZPr*J~abf3hQgaMRx|-`)TL07&3rGqs#foPx$m7!2Bu)AN01V)P86p6n&j6x;hUgeZ)=W5NfZM>&h`Ykv`^vzQZ2~YODIsY0LnH*0dRl`0BPC^ z>RJVxVBstz!IRE94lt}fB5{*3nHXgLgLf#z>$iCLN*4{amv8%%;{bMHJo~fSz=ZzseJ-! zi?QQ}3m4B+RA0QYmaO7$-5rY)o}6`+=XB8-8a8?Ve=dJXIFoN}t zlI26rBmf2vLdckmOb(+HqHO^g4-0-HnV29+#hF2(?nfX4Dp-E9_k$7@cidbe#1wFt zn;QWFnOD&3UB+AhkW}U(N~T^T;!SE#ItM83flA_kpi?x!wG5QXDd|dIR}LgA05~K< zM&OL{F2yh_G=fqZCH;87=B4N5x4M)yE)MBt;8$GQkq%dq9lp3t^%bEVg)f~kzrhjU z^@u$r#2$SqHt-!e$Dy7KN|cL7OF-1B>|Y^=k31Daz1bo_N^^>sd#6X_u!v~|gUc4; z1o(Rew*Bp~!5U%k#4J>9hn|X>6nWGZE=Hgxd92k5h7xI1DIf!;woN)=T?_UAyuXkU zU;&@AE?p7eIo_rm!k>@?)DVpynxhctZ(!}xK6Ek;*3OO(z?m!P^Mq~e0;l?-q@JVL zwoIt>5J~M=BJd&Tf75H9(;*BPrRBNgfqd<07mpYr{X8^pVF+^eH>xae@Np7l!e(bs zT0qZGicPiyN1N#vX+0L?yo?UI-D&BUaEoyv+Gj38$AhvmCKCye^08acU)nfE7*^;K zu06;Irr?vuaksFL*zvaZ6Gm>L+@wWA-WuHnI7{)0X+`89_k_H;26N$JxZ!gpwjMfUC$ys>!F*le41W0X?4cp z03l?ZC|q%OKBT?l>bY#{>Ykwl3$cvpiP#1{@zFb%i17Z-R~*6jHReF<8~7`Zu{@1g zj^#JuSyIkKpm3=qlU$_@ar2({dao^lCrR%Y#KYP*-I$8?gpHnC4VqiRg~W~I1-Y)Z zcqu%8gYvN5O~JiB&Cb(bBW@~Va!_{={9aXfyaeZ?=@Y9+AcIn1eulEdjt>{j?{L=j zp>7SCZ+Gj7TGDPDFBFN#yHzBco~wTRTsBBMhUS*npN66{q#9?RjIXtL_Ye@EAX5l5dv-#W5S|tm2#Zmp^5#bxkZ|SvWL6N^sd9d1y z7Yxw#X5=c?f)`88@>pmY3|-R`cF?5UA!-eG>ezpO!fnWbmTfS53S9I3{BcG#`0lfX z%rFR350t?*3V~z4_as5hRvqFLZX`hIg>X%QV?33Lo-y(B?s|epjBBs-bxil(+01$~Io?V*AOXbUte7ksJAZSV)IPeXBBAz$&mCuGyOp`;=rk^{Hb_eo5iQ?UwHlhhPR!FY&)@B zA^+0!6UNeZkdk!*p2U#~o zwt*shPL!cL1|(7P3C_MzW7tJV!UWtr8F`YX*i5Id7Bjjf7EuRf6_25i+!J;#}^paiEoe3W!u7NGSBtMJR2{lV}1);2EIgT!MWS6=Z}<^ z!)uMvs2p~qvQB1p$#Qf~rpdRBp6M=)Fq7%&6|_X#7U#+VJ}zwNK{W5gVG z89-mR8GaNa62gDD82HM{xPUH&fKO^&I=BP&5C3+ARIUR=9Vck5b zJSJn+KS)vIl$Zkxy+(wP%!n3bhJt!M<$>ip@{97L*~F(?@^(o z-5Mhiz8)_TVi78nhcHC#E+v|o5)G+T^T$xY)I8~AOr*?;sv4mlw?4!z7}C(l6|_gv zuox&&L&SOk#l)>b;?}*$)NN!89J!%%B)kV%LFRtgEgyDMyoX#@;$9AQb<%~{L#uQ& zDJ;q$IGO{mcu#{NBPPOf9CBgaHxZG}W7dQf7Ew=Fm(}Tl#NmQux=JI;FjMTZ=zF5i zTrOGJm#hw#t3EE39B66#ly z7l=f;_p)D|b0Gn#TBE&O^+95VuXm*{tJ3#L^Od453{z#3UCmY>UZnSp)cbmT>^pT4 z9QJ@o@l+3lISK;mJt%c1HIDs>FFUR7sEo9Y{0i1%<_6IRb@c-zlgRHrXq-&B0CsrYUq6_MrJWqE!+X?3H;M}1xzd`{JER7Egz z;No`?{!*urieL+jvN(5ni{a^x`f!XN)NgPu#3F~$jAyHd7nPx}Qn{-rri9i>Uj;LV zgbUGS(TY+L+ucyx`~AEteY{llVUhKbr~H{kO3JZUaYFY(i7tzaPb2kv50LnfpI1mW zS{IVbhx!hymfkij&8T1cvaXjHrlMHwcK+fQ-dm?Xeky!teK^Iib3ft*ai$(SnqZC= zn4{w}^;hT$a{(g`0`U1%9P{=QhOlQ`L7H$WR|DxD1Vk+{$|sW zs6onOyXeCmJdHb9zh%-d=CL1(&n<^*U{_mc^ZaAd z48N2=8ZUn}UcN0G5hQK&eNo0-g7z}c#fmNwiQ7!)D(T!C60bvNT&JCFGWSHokVwfb zE##I~a(}Qon*KYw8dBIYH1PPK1OChc4V_m(cdCB68cH-$uwDg)lyp9+MbZN#E}QFS zZwFPUQSpsSkZWC3LATM(*~BJktdf5mp_|=j5lWctke?3n$0SxUN;lp%BY}e|SC5bT%D?Q={J?IAAnz7tXAi13T)q&BEDRi5}= z&`*Ow?WyEX?CYm*1|3f=NOTMyqX&1SI{v$Ea0#wR)g&ec|C$zjA=Mc*YF1Cfy5Qi%jem3{W;3Qx8&R%{-DJcgTxSslAUbBb?z%Rp zqay0!x`-le@bTFeQYlU88j8P*I>psQm(r3mzFLg*0<&Bfa0y|7S+1*!emdy+N7@R5 zOXLqX1I+;l)jeY>dN6yCFN|w62P180ORbAko^0o{==Pgl_z6qmge7?bC$4t?9p`#R zdtxrm->3XhwOSdq^wGWKM+?NarsxB7ORs=vGGo3lV!pW4D=1!72?lDmnkWxg$P*DZ zslG6(5J6yJphXFJhWz9Fmn)be0TnBDuwLOhshzNcMP9hJjDd6uLzp1DzfM-IEFF}m z_`jR-JU^vX+Ph*0{;6GNU_@7>X;PL~q`as~X_sPF+G&tiozlPSK z$Tr!o=ELF!Q{AE7x|wh4w%#YeyR3_tb0qMn;nj|6jD{|toDm$Y;on}Q^Y1BAI++ak zHaFZR?kTvLJ=aCxhIMiHuQbkD?2PE)pZ#~hNPWeDpBhF}P$l%wC1@`rGjT!t8Fdsy2?r+#E zu5DSv)A^Sa%8qppkE!*ICb-7eJ>QpmXL@#dOridH(h+U1i?-PLj~`I=*x!h0J$Z^( z;}H^pvfTZ)qz4~l??kAFPvbSgXSZ z)kp1zcb>)=cbX_|rlTLV96*enMm$>Z1b^oS{?2`5>aY^~mf$;q`{t$NsH-ROKi|Or ze7|TTL0*D2sEsO0uicHUt)CoiG__srZyV@un`%DVt*R{lOodd9rWeyZg#V4@FVWUF zk5+6i9bdd`KKNPd=V<{KJX&p~W2U8XVn_RI>8MpvhQzIc09)l?5_9dI^9bs^yXcd_ z)}EuSU!L;k6e}qXs|xqZzZZCJV+|NQRT$?U6=l?JmtW9lm}Z6kTz|{C2QBB)THoKyiLs zi|Xw+ftPKQ zHt0q!@9nN-|t1Oz?+dR66ff0Vb|a=-o4_=gRuK{WU0CphpqL9?M&;IK~J zl4EC8LoZv0#O*^5nnMvGG$%yLYq#{;S=BB6`dt^+KWyAaz6^@E5J} zAT+nf)a(vtNS9-6XOsD>#SSQ}W)wBy4s{qPAIa2Xtk(-1C;QN)pZ@QX0y)C$x6YdL zH^uE^gr^(pLzp>oKb=P*1$R2DpqOL(0K9%F8!_P8r$`FGJ%$GKleC0*0EztU_g>=p zAL#+N``d3E0hl?O<^t+A^1V!bFa54CAG=?dr6V3B_1_3;5_H?LKjQi0pbM14$1W=l zKkPod>)bZ-IEa-2V&oUFP3je-KKPo62(sQ`z2a~Rg9^F0t;Q^FQ33T+Y7H{d)Iu8X)<|E)MViep{ih@@f}p`H6kU~!qHm*UNi?eZ&LR{% MgWHNY>fgWr0leT2-2eap delta 5495 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 diff --git a/piet-gpu/shader/gen/coarse.hlsl b/piet-gpu/shader/gen/coarse.hlsl index db1e496..57b400e 100644 --- a/piet-gpu/shader/gen/coarse.hlsl +++ b/piet-gpu/shader/gen/coarse.hlsl @@ -615,7 +615,7 @@ void comp_main() uint element_ix; Alloc param_14; uint tile_count; - uint _1453; + uint _1455; float linewidth; CmdLinGrad cmd_lin; while (true) @@ -809,16 +809,17 @@ void comp_main() el_ix = probe_1; } } - uint tag_1 = _1222.Load((drawtag_start + sh_elements[el_ix]) * 4 + 0); + uint element_ix_1 = sh_elements[el_ix]; + uint tag_1 = _1222.Load((drawtag_start + element_ix_1) * 4 + 0); if (el_ix > 0u) { - _1453 = sh_tile_count[el_ix - 1u]; + _1455 = sh_tile_count[el_ix - 1u]; } else { - _1453 = 0u; + _1455 = 0u; } - uint seq_ix = ix_1 - _1453; + uint seq_ix = ix_1 - _1455; 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); @@ -827,39 +828,47 @@ void comp_main() { uint param_21 = el_ix; bool param_22 = mem_ok; - TileRef _1505 = { sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u) }; + TileRef _1507 = { 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 = _1505; + TileRef param_24 = _1507; Tile tile = Tile_read(param_23, param_24); bool is_clip = (tag_1 & 1u) != 0u; bool is_blend = false; - bool _1516 = tile.tile.offset != 0u; - bool _1525; - if (!_1516) + if (is_clip) { - _1525 = (tile.backdrop == 0) == is_clip; + uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); + uint scene_offset = _242.Load((drawmonoid_base_1 + 2u) * 4 + 8); + uint dd = drawdata_start + (scene_offset >> uint(2)); + uint blend = _1222.Load(dd * 4 + 0); + is_blend = blend != 3u; + } + bool _1542 = tile.tile.offset != 0u; + bool _1551; + if (!_1542) + { + _1551 = (tile.backdrop == 0) == is_clip; } else { - _1525 = _1516; + _1551 = _1542; } - bool _1532; - if (!_1525) + bool _1558; + if (!_1551) { - _1532 = is_clip && is_blend; + _1558 = is_clip && is_blend; } else { - _1532 = _1525; + _1558 = _1551; } - include_tile = _1532; + include_tile = _1558; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1552; - InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1552); + uint _1578; + InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1578); } } GroupMemoryBarrierWithGroupSync(); @@ -881,21 +890,21 @@ void comp_main() } } uint element_ref_ix = (slice_ix * 32u) + uint(int(firstbitlow(bitmap))); - uint element_ix_1 = sh_elements[element_ref_ix]; + uint element_ix_2 = sh_elements[element_ref_ix]; bitmap &= (bitmap - 1u); - uint drawtag = _1222.Load((drawtag_start + element_ix_1) * 4 + 0); + uint drawtag = _1222.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 _1629 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; + TileRef _1655 = { 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 = _1629; + TileRef param_28 = _1655; Tile tile_1 = Tile_read(param_27, param_28); - uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); - uint scene_offset = _242.Load((drawmonoid_base_1 + 2u) * 4 + 8); - uint info_offset = _242.Load((drawmonoid_base_1 + 3u) * 4 + 8); - uint dd = drawdata_start + (scene_offset >> uint(2)); + uint drawmonoid_base_2 = drawmonoid_start + (4u * element_ix_2); + uint scene_offset_1 = _242.Load((drawmonoid_base_2 + 2u) * 4 + 8); + uint info_offset = _242.Load((drawmonoid_base_2 + 3u) * 4 + 8); + uint dd_1 = drawdata_start + (scene_offset_1 >> uint(2)); uint di = drawinfo_start + (info_offset >> uint(2)); switch (drawtag) { @@ -905,11 +914,11 @@ void comp_main() Alloc param_29 = cmd_alloc; CmdRef param_30 = cmd_ref; uint param_31 = cmd_limit; - bool _1676 = alloc_cmd(param_29, param_30, param_31); + bool _1702 = alloc_cmd(param_29, param_30, param_31); cmd_alloc = param_29; cmd_ref = param_30; cmd_limit = param_31; - if (!_1676) + if (!_1702) { break; } @@ -919,11 +928,11 @@ void comp_main() float param_35 = linewidth; write_fill(param_32, param_33, param_34, param_35); cmd_ref = param_33; - uint rgba = _1222.Load(dd * 4 + 0); - CmdColor _1699 = { rgba }; + uint rgba = _1222.Load(dd_1 * 4 + 0); + CmdColor _1725 = { rgba }; Alloc param_36 = cmd_alloc; CmdRef param_37 = cmd_ref; - CmdColor param_38 = _1699; + CmdColor param_38 = _1725; Cmd_Color_write(param_36, param_37, param_38); cmd_ref.offset += 8u; break; @@ -933,11 +942,11 @@ void comp_main() Alloc param_39 = cmd_alloc; CmdRef param_40 = cmd_ref; uint param_41 = cmd_limit; - bool _1717 = alloc_cmd(param_39, param_40, param_41); + bool _1743 = alloc_cmd(param_39, param_40, param_41); cmd_alloc = param_39; cmd_ref = param_40; cmd_limit = param_41; - if (!_1717) + if (!_1743) { break; } @@ -948,7 +957,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 = _1222.Load(dd * 4 + 0); + cmd_lin.index = _1222.Load(dd_1 * 4 + 0); cmd_lin.line_x = asfloat(_242.Load((di + 1u) * 4 + 8)); cmd_lin.line_y = asfloat(_242.Load((di + 2u) * 4 + 8)); cmd_lin.line_c = asfloat(_242.Load((di + 3u) * 4 + 8)); @@ -965,11 +974,11 @@ void comp_main() Alloc param_49 = cmd_alloc; CmdRef param_50 = cmd_ref; uint param_51 = cmd_limit; - bool _1785 = alloc_cmd(param_49, param_50, param_51); + bool _1811 = alloc_cmd(param_49, param_50, param_51); cmd_alloc = param_49; cmd_ref = param_50; cmd_limit = param_51; - if (!_1785) + if (!_1811) { break; } @@ -979,30 +988,30 @@ void comp_main() float param_55 = linewidth; write_fill(param_52, param_53, param_54, param_55); cmd_ref = param_53; - uint index = _1222.Load(dd * 4 + 0); - uint raw1 = _1222.Load((dd + 1u) * 4 + 0); + uint index = _1222.Load(dd_1 * 4 + 0); + uint raw1 = _1222.Load((dd_1 + 1u) * 4 + 0); int2 offset_1 = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); - CmdImage _1824 = { index, offset_1 }; + CmdImage _1850 = { index, offset_1 }; Alloc param_56 = cmd_alloc; CmdRef param_57 = cmd_ref; - CmdImage param_58 = _1824; + CmdImage param_58 = _1850; Cmd_Image_write(param_56, param_57, param_58); cmd_ref.offset += 12u; break; } case 5u: { - bool _1838 = tile_1.tile.offset == 0u; - bool _1844; - if (_1838) + bool _1864 = tile_1.tile.offset == 0u; + bool _1870; + if (_1864) { - _1844 = tile_1.backdrop == 0; + _1870 = tile_1.backdrop == 0; } else { - _1844 = _1838; + _1870 = _1864; } - if (_1844) + if (_1870) { clip_zero_depth = clip_depth + 1u; } @@ -1011,11 +1020,11 @@ void comp_main() Alloc param_59 = cmd_alloc; CmdRef param_60 = cmd_ref; uint param_61 = cmd_limit; - bool _1856 = alloc_cmd(param_59, param_60, param_61); + bool _1882 = alloc_cmd(param_59, param_60, param_61); cmd_alloc = param_59; cmd_ref = param_60; cmd_limit = param_61; - if (!_1856) + if (!_1882) { break; } @@ -1033,11 +1042,11 @@ void comp_main() Alloc param_64 = cmd_alloc; CmdRef param_65 = cmd_ref; uint param_66 = cmd_limit; - bool _1884 = alloc_cmd(param_64, param_65, param_66); + bool _1910 = alloc_cmd(param_64, param_65, param_66); cmd_alloc = param_64; cmd_ref = param_65; cmd_limit = param_66; - if (!_1884) + if (!_1910) { break; } @@ -1047,11 +1056,11 @@ void comp_main() float param_70 = -1.0f; write_fill(param_67, param_68, param_69, param_70); cmd_ref = param_68; - uint blend = _1222.Load(dd * 4 + 0); - CmdEndClip _1907 = { blend }; + uint blend_1 = _1222.Load(dd_1 * 4 + 0); + CmdEndClip _1933 = { blend_1 }; Alloc param_71 = cmd_alloc; CmdRef param_72 = cmd_ref; - CmdEndClip param_73 = _1907; + CmdEndClip param_73 = _1933; Cmd_EndClip_write(param_71, param_72, param_73); cmd_ref.offset += 8u; break; @@ -1086,17 +1095,17 @@ void comp_main() break; } } - bool _1954 = (bin_tile_x + tile_x) < _854.Load(8); - bool _1963; - if (_1954) + bool _1980 = (bin_tile_x + tile_x) < _854.Load(8); + bool _1989; + if (_1980) { - _1963 = (bin_tile_y + tile_y) < _854.Load(12); + _1989 = (bin_tile_y + tile_y) < _854.Load(12); } else { - _1963 = _1954; + _1989 = _1980; } - if (_1963) + if (_1989) { Alloc param_74 = cmd_alloc; CmdRef param_75 = cmd_ref; diff --git a/piet-gpu/shader/gen/coarse.msl b/piet-gpu/shader/gen/coarse.msl index 96f1026..29174f3 100644 --- a/piet-gpu/shader/gen/coarse.msl +++ b/piet-gpu/shader/gen/coarse.msl @@ -646,7 +646,7 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M uint element_ix; Alloc param_14; uint tile_count; - uint _1453; + uint _1455; float linewidth; CmdLinGrad cmd_lin; while (true) @@ -832,16 +832,17 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M el_ix = probe_1; } } - uint tag_1 = _1222.scene[drawtag_start + sh_elements[el_ix]]; + uint element_ix_1 = sh_elements[el_ix]; + uint tag_1 = _1222.scene[drawtag_start + element_ix_1]; if (el_ix > 0u) { - _1453 = sh_tile_count[el_ix - 1u]; + _1455 = sh_tile_count[el_ix - 1u]; } else { - _1453 = 0u; + _1455 = 0u; } - uint seq_ix = ix_1 - _1453; + uint seq_ix = ix_1 - _1455; 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); @@ -855,32 +856,40 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Tile tile = Tile_read(param_23, param_24, v_242, v_242BufferSize); bool is_clip = (tag_1 & 1u) != 0u; bool is_blend = false; - bool _1516 = tile.tile.offset != 0u; - bool _1525; - if (!_1516) + if (is_clip) { - _1525 = (tile.backdrop == 0) == is_clip; + uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); + uint scene_offset = v_242.memory[drawmonoid_base_1 + 2u]; + uint dd = drawdata_start + (scene_offset >> uint(2)); + uint blend = _1222.scene[dd]; + is_blend = blend != 3u; + } + bool _1542 = tile.tile.offset != 0u; + bool _1551; + if (!_1542) + { + _1551 = (tile.backdrop == 0) == is_clip; } else { - _1525 = _1516; + _1551 = _1542; } - bool _1532; - if (!_1525) + bool _1558; + if (!_1551) { - _1532 = is_clip && is_blend; + _1558 = is_clip && is_blend; } else { - _1532 = _1525; + _1558 = _1551; } - include_tile = _1532; + include_tile = _1558; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1552 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&sh_bitmaps[el_slice][(y * 16u) + x], el_mask, memory_order_relaxed); + uint _1578 = 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); @@ -902,9 +911,9 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } } uint element_ref_ix = (slice_ix * 32u) + uint(int(spvFindLSB(bitmap))); - uint element_ix_1 = sh_elements[element_ref_ix]; + uint element_ix_2 = sh_elements[element_ref_ix]; bitmap &= (bitmap - 1u); - uint drawtag = _1222.scene[drawtag_start + element_ix_1]; + uint drawtag = _1222.scene[drawtag_start + element_ix_2]; if (clip_zero_depth == 0u) { uint param_25 = element_ref_ix; @@ -912,10 +921,10 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_27 = read_tile_alloc(param_25, param_26, v_242, v_242BufferSize); TileRef param_28 = TileRef{ sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; Tile tile_1 = Tile_read(param_27, param_28, v_242, v_242BufferSize); - uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); - uint scene_offset = v_242.memory[drawmonoid_base_1 + 2u]; - uint info_offset = v_242.memory[drawmonoid_base_1 + 3u]; - uint dd = drawdata_start + (scene_offset >> uint(2)); + uint drawmonoid_base_2 = drawmonoid_start + (4u * element_ix_2); + uint scene_offset_1 = v_242.memory[drawmonoid_base_2 + 2u]; + uint info_offset = v_242.memory[drawmonoid_base_2 + 3u]; + uint dd_1 = drawdata_start + (scene_offset_1 >> uint(2)); uint di = drawinfo_start + (info_offset >> uint(2)); switch (drawtag) { @@ -925,11 +934,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 _1676 = alloc_cmd(param_29, param_30, param_31, v_242, v_242BufferSize); + bool _1702 = alloc_cmd(param_29, param_30, param_31, v_242, v_242BufferSize); cmd_alloc = param_29; cmd_ref = param_30; cmd_limit = param_31; - if (!_1676) + if (!_1702) { break; } @@ -939,7 +948,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_242, v_242BufferSize); cmd_ref = param_33; - uint rgba = _1222.scene[dd]; + uint rgba = _1222.scene[dd_1]; Alloc param_36 = cmd_alloc; CmdRef param_37 = cmd_ref; CmdColor param_38 = CmdColor{ rgba }; @@ -952,11 +961,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 _1717 = alloc_cmd(param_39, param_40, param_41, v_242, v_242BufferSize); + bool _1743 = alloc_cmd(param_39, param_40, param_41, v_242, v_242BufferSize); cmd_alloc = param_39; cmd_ref = param_40; cmd_limit = param_41; - if (!_1717) + if (!_1743) { break; } @@ -967,7 +976,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_242, v_242BufferSize); cmd_ref = param_43; - cmd_lin.index = _1222.scene[dd]; + cmd_lin.index = _1222.scene[dd_1]; cmd_lin.line_x = as_type(v_242.memory[di + 1u]); cmd_lin.line_y = as_type(v_242.memory[di + 2u]); cmd_lin.line_c = as_type(v_242.memory[di + 3u]); @@ -984,11 +993,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 _1785 = alloc_cmd(param_49, param_50, param_51, v_242, v_242BufferSize); + bool _1811 = alloc_cmd(param_49, param_50, param_51, v_242, v_242BufferSize); cmd_alloc = param_49; cmd_ref = param_50; cmd_limit = param_51; - if (!_1785) + if (!_1811) { break; } @@ -998,8 +1007,8 @@ 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_242, v_242BufferSize); cmd_ref = param_53; - uint index = _1222.scene[dd]; - uint raw1 = _1222.scene[dd + 1u]; + uint index = _1222.scene[dd_1]; + uint raw1 = _1222.scene[dd_1 + 1u]; int2 offset_1 = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); Alloc param_56 = cmd_alloc; CmdRef param_57 = cmd_ref; @@ -1010,17 +1019,17 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } case 5u: { - bool _1838 = tile_1.tile.offset == 0u; - bool _1844; - if (_1838) + bool _1864 = tile_1.tile.offset == 0u; + bool _1870; + if (_1864) { - _1844 = tile_1.backdrop == 0; + _1870 = tile_1.backdrop == 0; } else { - _1844 = _1838; + _1870 = _1864; } - if (_1844) + if (_1870) { clip_zero_depth = clip_depth + 1u; } @@ -1029,11 +1038,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 _1856 = alloc_cmd(param_59, param_60, param_61, v_242, v_242BufferSize); + bool _1882 = alloc_cmd(param_59, param_60, param_61, v_242, v_242BufferSize); cmd_alloc = param_59; cmd_ref = param_60; cmd_limit = param_61; - if (!_1856) + if (!_1882) { break; } @@ -1051,11 +1060,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_64 = cmd_alloc; CmdRef param_65 = cmd_ref; uint param_66 = cmd_limit; - bool _1884 = alloc_cmd(param_64, param_65, param_66, v_242, v_242BufferSize); + bool _1910 = alloc_cmd(param_64, param_65, param_66, v_242, v_242BufferSize); cmd_alloc = param_64; cmd_ref = param_65; cmd_limit = param_66; - if (!_1884) + if (!_1910) { break; } @@ -1065,10 +1074,10 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M float param_70 = -1.0; write_fill(param_67, param_68, param_69, param_70, v_242, v_242BufferSize); cmd_ref = param_68; - uint blend = _1222.scene[dd]; + uint blend_1 = _1222.scene[dd_1]; Alloc param_71 = cmd_alloc; CmdRef param_72 = cmd_ref; - CmdEndClip param_73 = CmdEndClip{ blend }; + CmdEndClip param_73 = CmdEndClip{ blend_1 }; Cmd_EndClip_write(param_71, param_72, param_73, v_242, v_242BufferSize); cmd_ref.offset += 8u; break; @@ -1103,17 +1112,17 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M break; } } - bool _1954 = (bin_tile_x + tile_x) < _854.conf.width_in_tiles; - bool _1963; - if (_1954) + bool _1980 = (bin_tile_x + tile_x) < _854.conf.width_in_tiles; + bool _1989; + if (_1980) { - _1963 = (bin_tile_y + tile_y) < _854.conf.height_in_tiles; + _1989 = (bin_tile_y + tile_y) < _854.conf.height_in_tiles; } else { - _1963 = _1954; + _1989 = _1980; } - if (_1963) + if (_1989) { Alloc param_74 = cmd_alloc; CmdRef param_75 = cmd_ref; diff --git a/piet-gpu/shader/gen/coarse.spv b/piet-gpu/shader/gen/coarse.spv index bc272303af7cd01f07e7ef9bbf352afb980bb1d7..d246506f188134063483dd02d569b3f612a658a5 100644 GIT binary patch delta 12777 zcmZXa3A|NR*~T|;??qHBLLkjjGn|KG%Jia~|BB@BCPIJwVW=Ywh>!a}Lwb>2=Zt zz54d*xlZq*=uxa#tWZ2Tw{M@p2eucNwHHO_*v@gC-BX5lO)ZM{qE|5+ZOVv4z-`5K z;K`j6o3^&%4)~E>qo*8NG<@%YGps)DVeqs%?kE=34jw$H&+kyCbdBvSYG(`{wBOUP z2_q(r7+3dcEB@NT7q{?N;a!u5j~d%Gf%xsk8x1~kY-jgqLZEaMZ?)I%U3Xyl9;V5o zI=efEj~_E;a_5wWxmWQK`e>ZJluy7JYq-@ry!7Fd$99eCZ1}eoUukILMoc~&kM?2{ zc-^7C0F5}CqK)jDGH%3##uUEWQPj3vcR;yMeQb3p+lm9xMo$`XWR|lNUSE*<^xKLt z@amEr+QO%{@M+8Oj^b#z@yCttt}R@*Z#fE3 zc|GmLMc}br-JPFpb6asKT6Lb6x9}?)yj-@oH?%m+Y2i1u@S9us?eIy5j2w}TxwpkW zzlA?g=jCUI>(Lg6$6NTK7XDldf1!oH)WTnB;fvv;%5kHIvve$CTk-D}hfi8~!M#{r z(!MSHb1l4I3;$9J|1!L+23)hnVeJ+^7~a)Ay0dZnwiO$|IZB&n$v1=NZt{Y*ZyCR1 z3*WhSvC48+v~TU=4K^!Bwz!RM;S*Z;q!vDSgggLH7mRqqgPeOzA2c0 z^#ZE@p5WsYis|=l%;@30iek~cy@zbsURsm2Y>%70b-BuKY~j}Fs@*zW<<{!(KEzv8 z;V;6i+_BSdTKv8uIKW~ahke{{ca>YetK9ls z<<{;BFYCp-A`}+xDyMKS$1UJhyTv=)HL-Yy+grTDy+Dh1_`srMUn{~;9IW1Pu(x_w z`SccU)vnsD*i~-T4u6SwR_^eD?Ql2IsvWMsRXf}juxf{!(5fA7 zZ`BSj4QSbpV8Hnm-U+vC$F9FsJ6wOOcDTJ&J6wOOcDVjl?Ite^XKdMygEO{lhmVI_ zw!;l*)ebkHRXbdNNx1%2?Qs3A+6`VdZdA*592{WT4tIcMJKPCdwZomTRXg0?s$Jz) z?QrXfRlCkhDuoFx+jRkMLd$meQEwCDp^__ov)MsQs3%rKR&;lQR61oLGTz?CE zxD$A6-YvV%T)#Yx`m+mf?axw`uK-`##tlWkBiG3(DXs*o@5Hl}kJa+nt^&_xT=>;+ zeWnx7vDbk0QQrmSU9?|=7m(w%hP_-i_*x7aP2~H6Jb|wVA6MbO0Xy;QNwfliZUC!& z0RDjSbHTno<|4Gsq1{URu;^LGiF;Ff*$8w(bH?*8%to7f~Ki_J+@ZTck6Z6(A2nZWH}ul6>Y0enYP%YZw<)h)XVK7ghkpS!{8j`tl? z9^1X(>iDkv5Z0h+h|_$qdiecdCldYu*ubYZSM5QtKI+-~hrq_s=0xtP&F${L+-X~g zWo_C5S|UFJRu6v^T+RF#+{~vmGd~X2M?IOJ02@b}nSCfw1DEwDf=_!k5_oc+#4w*D z?5X)J*q5h9{VAH78!FDE{s49j4ekSkT$}O!2sWNJA135OIQlDMd#0UQ`wYNA8WZqY zaCKAu2fhPMJwE>nRuBIZxH{%J_?z5U>hXELw)uqqrPqH_bG=>!KTmt1;`I{P2dS*z z%V7P~Gwv0z`W-A?{QeAgR@(OB@^|FQ{sLC_@_lxCrky7S$zq5`*J3vu{|5dJy-wQn z@##!G(|-*-o3^ky`Pac}-kjH=x!!+=t9z3f<5jSl_zn6`dvb>xQ0IRj=-_7mlirt` zt^OuW&CM2P68{2UU#W3#!!M&{W!?dQt4C3&XJy_6J5Jk9CCT0bC?@FpV6_Zb0#=(y zpcKjv;O{WO_0Y6u?1x}&Ug3N6^4LBG-&&dMQh5Daga?{S_-_P7gC_ZZ;11Mg(2wZV z67*BBS|-L0F00_$;@88HPcz0R=yGhOTG5j~irKebaJAkXsO*)Rg)-Yjbr;&y=5JP+5fwJZ3<+8aTG``(A%m;0{10!__*7hCmbvpOq+O}G?alMSO^ z2~GXl=HXiztdEnb~>u~*fIb#i9q#@R4EOroG@g@FP&QjRF3|I4mr%C--q!#}*!TP5* ztPNLNi}nx~NmqQ8KTFK7(I9@7QcRF_zy=Qg8n{|52gB74sN7QP!mHJCJ-B}A9#)^D z)(1aLZ~XOk>lJCNZo^J+wItpdtmeC$iFX0}GO@OA($q{W_R4cX>Y2!{Lm~BK z3hgaJ?(*+SuPpv3wk(tzS zU?1hwGx-wiIBmu}x?_DFsUQh@Joso@2Alv^o7khaJD^XR_~ zKcAj6T>OH5F#QGe-bwl;?k~aS$|_#$PGuQ2#_?C+i)q$5zn{JYtmb4dqL=II$F|GB zvzoWyrC_p`XuRX zO+Bk2*G5;|!JirKe-6W);M91Hal8wx%^fU;5_gXNjbli(ckMPPXj`BUEio^k^^P=_S^ zEm+;jnOL5LzXR*9&BXE~{5{w>+Dt6ZXQe-YpQ3rl|47eF8mC;t(=Phe{ zcqR|tCu~=*-k!}rHO+4M^WZGhb6|Pq{USIE^#WL~&3oWwaPEPZz;bQg1Ahja$7_0p zUd}yG){nZL8(r}?{>-4|9(Wa;dq7+KUIS~(@p&D**xmEo z8CXH54EQ_PN}DtI23XA}wb3eMsC1T5Fqjjac@#K3N) zbw!@?(-V9vKE`vL_QpA2{o5c0t=6A*H1+I#2UyJ?fg1yf0nRv+%Jr+>bmuoGXwE*^ zT-BVN72)r=|L%jvEa6IEjakB#!D=S)7LsSRRsm;(39t#dmXSv%VY+1tUgKlwWglckZU7cu`ak?wEXJOPiN~Pq-tr5v)W-0{)t<4NfVI{4-=88CV*EN-?IEg_v)vr5b}R?gLpcm>3%L4& z_{g^etLc+CTfvQ!F z`5s_j-bdPYr>S`#iJgMq0)GeW@vnXh{9QEl#Qq*w&C7FU#2Ho(WWaox`hBp8oUQ{* z;tjnQy)P%C&z`h>Xij9$+UqmcDLt@Wyk9l^0E;OcrH7u`#vg*Sjr)S-jcw#R6>xTO zKd@XIlPL}W=K*eiuspTyN1j28odF%FLlPbcR(EnHmM7ssVEwh3Se}FjgN>uj#PU4A z{TNKr`qKP_o_nydHX4T06uokB^%$sUVxz!WiIHG=Ce{hgN{j}}{SLwB@G;=|^p4S1 zKZm{t9RkTY%vBtUrk(@b1y=J5gdE_*;2G!D%Jr*mp<9`lhl8(TMG|u?yj08=nHm+V zSAGGTm;l|)0Qo*`JY20hUQK^*{fXeL)C90xn~xKd!A!pKb;~4(LJ}PT&Y_tCmgms? z6zrKXpyRYB;gMkVoEdo%P6g|qGb68mg7lP5gBU1>MxH}+6xgKRPsh;v@_tf3nx^KN z5m#4EJrkP_&PtSEd3|E;{|S&Bn&ZK8jk{qx37j{`6TxyPc{2TRw7emn0`?8j;KtBb zpIrT^O+8mH*H(JAUj63yO1M7iPVy>xUmoIq8fViK4LrNn zZ)X28%syeS){8W``>%nkRi~*|ou<>RuAA#8-@3Vu_VO*7d@K5wi?-T{dk-kDW9&8L z%jR7VSIf^*+SD??-!%QhZ_po~8`yyrxZE4z`l!ce4!8@S@VW5A8e{gW54s6KCk^>^ za~{}W+FZ|D=zY1K+HR()xtwAzZ~;N(x75yKKneNJPdX|u7m#0#rZCz&wTY+KvQ$RV&`l5cof_$AA8jQ nubF~I-%B0`r+hpHmgimf3GjvZJVLL{2`0h9c_YrgWZVA(PRoJ0^ULA+Y8##_|8@lG4@h*z}~Ri`I%!jYVlL=r;9N>nu{x3N)= z>rE07B%(@H#k;MdTIF8#Xca~4wkYvv>;C_H?=M#N{$=j@ePfI{#+Y->Io3LR<*duv zW?a-Zux*7+`WHo?Vx?lm;*LcF2MpP_t+=+mD5i8CU$hr}i<`icyC!vXPb=#DC-76c z$4oh)khc~0z){ulgWyx^xL@&DZPJjz>pY2MO859Kg!R$Cflur_sk5gxd&uDO<*=sq z&n^5_c=zOv?Y$h&*TPKem$ zpXgW?Lp)X7Ep9Jng2#9Fc71xO`W9y+tL8bYg`eBtWoJ)wA{Vt7T++fXZQ+-<@T=e_ z9Y4A=*X4#5{hSs)ug*)hM>B!jS_~Go@Wn0s{ucgV3xBwUKia|{gCAG+jOk$MSj4`? z%Pj`4wD8wj_`5Cqy%xT-h4N3d`488};MyDa&d z@a!Tdv{B1=4}Ue@kp9KN%L#UEG1$F@@7colYvBjf?%iVB^5_<6R|`MBg?G2`aV@+T zo-*LHrnKl!UY>7UOj}-1+}gqyE`EH=@3-|?y!h~;E3f?36}U_rvV>dV8d&t>Yl8}Z z1HJ})L-cFliGTGXsQn?}F$#(q_ifGSj<%v$ym-;D9okE4shZs|v%jT*w5pK1O-ri~(j{VT$w-v!!7+8Q~FamA?4j)jPz1N`9k{gM=%TeW)+A6oy zRyk#MIlg@hx87Fmt+nAysVpqE5!hR7!(9W5ZMaji*oHeLi*2~Q#kR`Fws4E=r}~o9 zv7Df&SJ@c6ghMNBxCxwH;g`UzveDaHWy7_%$cAfgkqv*5_=QzA0s~rQ!|koI;X1U+ zhU;)ng?GWNve9dAkqy`0A{$-`tg;a}z$zQ=0IO`c+t4Z-Zo*dC@Ck6MY`Fd`vf=u( z$ToRdIN-HU1%(5wvef}r*>HQSY`FGT*>D3`Wy4L_A{%bP7TE?b8wb@Y8v}c*Y`Ev& zDjRMTLhuKvghcbxUu z-b$ps^*CI6>#@Alz$LOE$G|1BAcxyqki&IoK@QiU1v&gIxb-+(d+Twy_6r+)@wgG^ zY+f#+gziBiT-M@x3eqgvaPH5~BEJEAP2Yw*Ha8+uJ_8%a%mH6VQ$8HYyU6B(A7R|< zO?}4BL#}R59;kc{hL_8N&qr_uEyg#4O=basR>aW)u(GA#r8u|^?B^qrS9dGz4%!FB z3UwSm3z6yP%x1!iz{=id?C_#&%=C5y$Iw(};9{_Hv-NHw{}AT}Hi*HZGpVXhoA~)L z*zrl=POy_zzUSsR_tvE_1MUKwaW2E%;5BQrdk1YJGNd=NpVBhoXW;6Hd*SQXp6VS` ziehyi*jV99ztz|KU6-rVKtboe{44%K;|mk(oVE1`QD{0zNg)WzTL!L!(2%P!+H;N58| zV)QIndHDZ;tIPSn@V7Wg%472!Sb6v#z^=ww&DDDztc~*3V)O#UYd53z_QXMDOkYCs zBJFM#FAM!gxM`_7l=<($-2Mbs?)-hOan53&Y1FwE`(pPBcoe-h>a_8}NqI7Pt-Uy` ze)=D6=KB|v2u}|sE1kRwRwjOf-m7i3v8=rbf3mh{@}TmsAX&Wp4XjKr z^O~3PEx2+^$lvMxxHXjjA5EECL+k;(u}@L_1MDAFSTwKcM$x^2(RCmt+nw`=#_| zs>2V#CK3J-*fpHnOzLB>Hp)#ZKJ1g!zr-{X)n5Nz3s0Up$35X@H@K%O!Tt@_$c#Us z_hZJ&|3g#e7_no#rS##;Ly&UN23O`^4hGdoS?t@v+Lzf;{SheaM|+4_(iJQ6Wyx2k zlfLxI;$#3=!|;{B)l;=HT-i~?kIgFZ`k`vX=qLsv&`^cj)0^n3;HT*gpgw~?12&1b zx$bnuXZh0BB;By;UDmA7C+)SXPF{D&YKYHZvN^7+!Ah6;?{lfvrC*QcNB#Ouy*<9l`sVu_WC=mM z=Hhi|4%Cr2K|c>RSdP;MU}a9gy|WS6kABo`NK>XCar|rycH%Rx@(? z%YZL{l_l^Hurf=cfj0yDF|fK#Y03;NcIKIo^7!4Ngy=YeEy300-wN*XZ$Ymvc3Xqh zW%=dNZ3C{Z(ondvtkM_3Nw!qEElr`>ip|z*CRZ-cGTJB54q%hdjbcZzGLK+vb^@Es zDy;KJqV5c)SQh)!(3QpMEE%$57rsrWzgv~X@vdNHdH&fAd`(}TK6IJU*AS}6ps%+KIvoC1?eS9w zm$CQ;l9{BEy>cY{2%7TP90i_^O;+n@xOU1j?werc)rXN|;AW&Q4NEC4usZ#YrI$xH9=yyi@rxb=3i~%7hy3HK7aqsz zGk5}6osP%R%cGkFzO%9lC&3N=K=W`+1}ih!OsbrMz=0}tI+0#koSqE6r{eS!xPjwz z8dzD?>8WtXsnh3FdS&r>8rV}rW&T<*1K{W5Vql>{J_7z7`ZdV(bo%|^)9Kmf#ToQN z=u3Lfns#w~CU|PU+KZ=eSz5OIq49f&&Z3#eOnSNIKJv64<~;DVP2IU*`LO1L-w(jglU?1R12ss%^T7r(pn>HHcmY^@bq1Cv;D3Sjqt3wc zJWc)(Y*24=7t;IrsNiQA6|-pyT_~}43Kv+eJc(Tl&PrSamM5_vfwK~qfaU7^Q{gi3 zD4K~~N-tM;i2M2qh)b^Wa(ekN>K@y?_;2v5^aj(ZgSAP}E1UAHhFl$8aW!9V(;UKU z!1f|bVd7NAaR%SgKgYETTW$N7xaFtaebCIK^8JV2O4VN{m?&n=GTVL98}(nWIiqDaRFGFEznP@o&H`Z8q*xU}Zj?Wx0O~&vL8J*x!NGon9Q;DAG?u6dL>`9Q+<^@I3Cz zwTXjgz}4W-!j(Uz=r1*~6vzD6(i zkXlt=2j5u?ZoDvXpa!|3Z`KRWUy-~?%XRx3SlJu2SiS`|e6GD*yXrBU4$oTr9qc;h zy8i>5HB%S6x7~0mvuN*t5!UD8?w4!q`ur1|^?4U8SLgb?56=3$2bL$u2jCR3rC@oA z*oPJztC$WQs6hgL1Xk|C8d#oyAA_}5XJB~({tK)hbq1EFi2WPkl5SLt~Z*$}+ zI0L{I9E0i9!P+F~N=#G>vPoBi zE2|cl)!}ihK4S-g)#=x_Q1a;3>d*Qse27A0wu8ZI(Wd*L$qYs!TN|$YL2TsffR$+z zN9)4%lQHXom1WHOU}cUu6hHpwgU`X&@pYj}v-6#p!Z`gr*p-kwU<0r=I`BUYZ3xyz zxi+4XjltO)zEhK{^OSr6oW0@uHTiZ19s%OWU3FWZ!J@k}5EonX<@VIxmSxxmxw`z8Gt^z9aM|x8U_U+$ zpe(kfeUaul5}S}e_-+R_K=lXT?U5;u^Bus-Ou$6r$38!s?&z*Dkl8!HAfD)*>HV0< zj^LeW!)PWV&Wv^e&tYY=W%M#quAK6HXv&;n&tiQY zoi_P_>u|WT>Ud?^d)B`J&fJdx%QN?*z|Far^>^6{66l-YY=fi0@@#`+z-|K_9!XQ5 zfZqZu&o+=J;IUxs)frgch{s{+faoaOK%Q;zZLmSz2BYcyxDAwd(v-PU;_5a~p2Wt2 zvl3lkc@jIJgk&4|mi~mMa$f?S2+l3B8!R`;ar9$oxdV;|dk56HKD5;)L3*0<%wFD@ zJ%?oiq;z{>pd^t&W78LUjbdtoX#E8zbmkgMZ>jx0`r zWCczJ%MCJ(UPr0>r-C2BnGUp5pY48Hz3zVp$!WA4jMKr&s(+qNhZ`+*U#?yC;<^3h z2Q-ht4D^}mOz?2zZiutMem*Yx7s$)HpdG=PD2C8~m)_kWkAv@ltL615(b*@+`QYl| zzW}bRn)C&GBdBI=_SI!{Ipym$m(^arc9XAL+vvje%Gr#XM>@HP7s8e0Ws^E(Nv+nj z55EY0Gd8z!Uv)VyhHIldHkW|Au?hbX{KUqXBkF@LMWB(2ytBLvtTT14>lO5VTvv6M z)0DZcVyE^9PUTnBR;z8b)0If4R>EEdpAOGduZC-*JWr(8)F#yim)9b>hPJRdsq4U6 zD>s)L=#z`O>uJi2EzU%51fN>TU=Dm{C4;$eZIma2dG72ZF!IRw_hFpfgb~VRNzDiA zK)I7o0`_@2xfyJNE{ygj=LBw{&jhqtKvU)f7WD6E1htghhA^e%RtDXXAr226DE6I0;G4hyc-=$~NX#lp-e!E~e3XrfteP(y%Cv zk|@PL7>+}6<>Ua7EZb}t6|CuG2Fb!iB^yji0;xw=llJ9-y7Y2b-UVHZz*qn5*ohvxaZ%Gsy;Y*2us{r=FaT?qKThxwU!?+IDUaUQ;sE@9!){e-LS#5cjAWd~pyMdLh8QpR(VjLF04*cCUi<0+U8* zarm7q#@klSIkN+MbIq>SD61S;6K_u@UYJ8XlLc7tvQzs(JB|AK3~agW5S^C-3NW#` zZ)@SrL*7JPI>KI{!Mx9-@yU_!p+EUVGwzuWC$1g*-$ES#R{21vV%}p{$m(M`Uwwm0Nt^RT zTbFDoGH%`{uB*RKe>AZf*AUhsFp0+9cr*fOvtg#$giL{1B?6P~T5y=a_XC_kVB4t%V1CGuRUe;lPKa57#P5(?GCA<{Ay6nrR z+Z;YG)}d$=!`0K}5tkRrduXnY0p$vFi3Mj)(tdy{qO^#zf_@C`XbE9hN099i5+f71 zkH3YUWqF`_4zxTlGJrr}B!9t~c@2A;v46fGp*k*@!H3RJ_-RkRQ)vOzY{a*@%cNYy>`ZS(Ew+W4wQTf}_`%_HB-xQRj8!e0 z6sc>=tkS?IITsYt(^574e;`@JM^m-)aLv;=PdG{JcE+xsrtMlz7wR%MEV+_}wLlsF zax0xe5oAPs=f%Z%H?dyyJ9{&}iz*Kadn3q2qZGEfK5?eUx z|7PQYsa>akz8P5C1S@@US;->tSWL|p74Kn14mW#ZvSy_sGQOO*YN@~PYEin3g@?&d_3+xWHYX2MK2iWq);UzOaH~u{YS4Wj z@Hr#@9cFvYET1<8Mh$Nik5YF{Df0mBPS4qI)08IF=hUj=4G;Ee4i9Hu5n9xK-Pc8! z#FxY5JeutJWv*GJH%?U@e^x=~3Lnbz(D_rHRj-E76T;^sU()6yw%G9|@k1!7-2*PF zQf*$1q2E{gP^XebzQ(hu9W-{ z-d@$5_x!E24RB$Sr0!G>LEY$WakOXCm(z7iI;Jrp%yS0!DXE2C6S<`fnAFr+G@*;m6V&_9OarUO!*;w<2s2--W3!vF~~9%Xk->;u0BI&<^fv zezkLG=G%qZ0&nZ!`GxK+SKQ>F$t`0ms_-n~Gty-?oaLf+*(<~3D`T8PG@EGTLYXQE F{1>|^dZGXT delta 1962 zcmZ8he^gWF8UAkW&E+P!7cL2b3rX~ns0}}=7ZyQUYVRfChrlrH0U9lxH<@SBib%J$ zN1c+J5Ro#nlQot(+igj!J#nLs2s+u^X#!yj3@zGtPNbIO&N!aU<95)_o&I6l-9YHs zdjGiRd%hp<`@G-tyx-+5<6H7Awi+||#s`UbJe+?5tGaifeEsF2tD&STx4HL+y-OC` zj^@Xi0PsKxK7;{CVIXcN#S=^7e2qD>Scn5~Y3vsE6(p-*p4OcD1u=Kc|5v%cKsy*L z9Sq>|AdrPhNOv7*cpIX-QNf+>|B0g2sY1X4L(9szc}Ai_=mj6CFym%3P$BGs4_BD0 zSH}E;uUcWYh+_?!@#ZG1qkjDKoXTK^n<^xa=jsa7Ijd!2WW#%5&{B4H5_x zs=z;Gy66G#XB9a=NBKSKii$r}{LFNryz=)&ob@>VQPcGK=I+h^yn3LKH5E?%AguWA zSc(5_CG}c-x#RBqWPEn%^kRHA`988Ezq~qc;=;u5o|*_>m?(<2oxndjJLhfLoOSQX ztKRPJ#${-11m`7?(NAQ((s+}5A;xI~(E&~((3Iu%JG$<9^kv5312l$S*B!-lS6l@{ z)CPdLIZp=fo9A>R(E%4EZl-#BZmtcF_1yADv-Hj{TpIeeW@r<_N{v3yCPQ^&uR!?s@;x+F#yA0qz*D-$sJ5L+OjRKz z)ICV&QR9z%nN#xqBi0N@QlNhcQ57`05A+jQFki64dLHG6c`5{|3yDFOJfgZ0_$D}N zZs>EwB7h}v@<(xLN9YjNec3LH^TR>f?eN&5r1CRzgvXq+BV;?{u{?v9P&Je5FulMb z%m6^MBSwi^Pp|w=Z8W0Az{B?00}>W9QU3?(a2y~}utWB`?Svh68&EzeB>Pi@O?Hv+ zKq&>@YmlH*1oVs$E$u5q3@9qzurT6zdVHz}c9xz*sJU{w-WmqV7r3fOTKtk=)+O@( zRA&vyc{P)92q|-&Z2Gr(Gx8;Kngp+%frltsv>2pT(NP80kTOuwmmn?Q^;pB>8djN- zuSpPPp0scJ6Dtj9I~^jp5nKVfE(cy2b4I_NqV*=SG2<&xLS558;a21Of~rY*|5)-3 zyL4*TGO~6fw1lcHwOZiXYO4hqLuN%QZP=R%Usr?1#qg`3MFi<0y27eQtg^aHB%CHT zQM>cDdFSUbv94BM?ly?SIaqYyfV6RJ~e zE^S-vQTAq+9^CfEhvabOJBYIr|BI$YZ~9;1C;RjfFi65iH_i_S@8M!3j(!$^!7gIm(`BMUSU#+us7|11gG~Dm<`@pn)F1l1mR^@~#Ol$UV?*_O z0_fq?ofCHoHzL;Pp-$;tC@s`K>W`eN3#9g2k;7}I{35#UT=w{%Me!2$b!%}3u4L>- zmQ%^k`ZCfvxB4NqA@^KEZ?Z11J{2RUcP++~{-@O6sXANVwL$EDvHAO^>zg->-XWI0 z)x?N8x{=K5jEt1$)_(w*8i{E0%+JT%j;%co7}y|)5*6=E(z)o wE6DlUdb~h<1|r3IyMOABw98)%t6!Y(?~=^TyE}OC{hpVLO}@8D0IT1B0ioS~F8}}l diff --git a/piet-gpu/shader/gen/draw_reduce.dxil b/piet-gpu/shader/gen/draw_reduce.dxil index bfafc5fde59e94065d4a62a2961b1d60f44a2e7e..4df0ec51bdaf0e94f98038ec143b59dbf32c351f 100644 GIT binary patch delta 862 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 MPRk_$XW{?;7nRX8X#fBK delta 10117 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 CKLN=A delta 9885 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 G-~R&!iA)sEF9}c}V4|9?#ycVeMc0-TBOX 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 D17*T* diff --git a/piet-gpu/shader/gen/pathseg.dxil b/piet-gpu/shader/gen/pathseg.dxil index 7ce4684b8acb5f9f24e0a5ea3ce7ad9e2f305a72..61307126085e84b143b3d7ca3aa21481ee768937 100644 GIT binary patch delta 5201 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 Pv=JR~t*1X0+W!6x9duC? delta 5157 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 delta 1220 zcmZvbe@q)?7{}l1UEAyRT8=B-t`^1>T88|X2V)e%GH5%PPSC?G6`GmcA!0RR7+DzV zmR^5Q*uoz~YDBUu$LNxZn6OODFj>+YXf_xL#AR!0X3#~9_+y5c_>VEZMH&;c`{T{? z{l3rhzMtp4_l?_SyX9zy+XMdhAyBi|EaiCp<&RB!AKc%#o8BsJzjh8y9qo9obx8++ z0My{L3V@6TFr9)Gv(R^YlHb}$0Q}d_Q zk}9r`q;c@j0+tVgydGHp4g-K^yi(s5Fkx((V|7)o8`UZk)|4Kj^d8dV0VYgHkCA%M zVHjI6?Ihcs#t^v#H+(MI?9qv6^h&AV;d|L4Jt)DOT~{hAR(nJ8D<({yWWoJt&>A&h zQ@szPsugMFlUrZ)JlK4{#k<+!bl@{%-z}s*xU+io=0cm!HB!<&cwj($Yv8s16RK&W z3tkLmpA)YsNd%QrFhX;1XWqL*v`^zL_hYn_g{Em#~|Sikdw>*m#k_0=}r;p<Dhs&%ejngur-t`Y$a}Biomq z@)?wH%JfC2%oE|0x={d%H98OyHfDp4OF?FESIsGoIAS@st3E?&)tU3-&FE%%b^#KktD#BWD2dp zX8>AI#Q_RKr*rPHiDL51QW7*#jDl_9fJxvSDJoX%`@& zZpUZVvH*|vJZnq5nv(@M#SO{yku1OfVh;Iwkn$$=4#2!*o(=g}A`6ft0{#qu56J)^ zW&V0UI5dyM)LQ<8RWcWnUgmdO!Qa9VQg{!^gF-BDi%_Io88KDRBBrF$7{b)DBi$fs z7(pzOh`Q@ELQ29%kqHN`DFehvSd>+=RL49?1Y{ML!y2Ri9$3>K$lkZ7wrn>DFA}we z&a&Z7jfi`h*6;U4%$o7!usEdHw}Txbr#oK??XE(yEGet9L!v8GR+1e$LvULjtIIGn zOJU&&qJ<;_@Q;EE7tZz#LvZq9rj=U~1G`X>(Tq4E!oKil7_iu((kvR33Y9i7_mx%Ol{8D4quZ3yUrAR-$|1|xWdtPAS Hivr*u$E9|F diff --git a/piet-gpu/shader/gen/pathtag_root.dxil b/piet-gpu/shader/gen/pathtag_root.dxil index 48584bd22a13f8f01c186da6383ccc3ba77385b3..77f12e6db0ec75e4d05be227c033a9793a2cc1a0 100644 GIT binary patch delta 1493 zcmYL}e^3-v9Khf1-tPU{MdyPA8+RKdGCGS z_xs&9FP3^cH8I~|vHme|xADuD-}`*#z9>-N-*O!R0MwmMJR)98JU{gYe)+@5BdTkY zX}-929Xt1?WL6$s!c>pN%4f!BZ`_*sYJ9d=v?W<@JfhE8J8bM5G~}EaUKz&0z(IK} zx^lcH9+RCg$qa#1*}F5Fass5x5!i?A;I~QvNFk)4m5c7%5Uju2!NeI{?P>1pw<)m3 zA3msIfTY!Yl1NgwoRA{6g25C*0vA)ChVO|u7A`v6l2^e4Mnb5PeC~LExW)qF=YRDf zD9>o}n{7l1N5GB2dE0q+61j|WuLgO_t4SBaK}5x3P){Jqg4RP_l6*zbj7#u8x)*#F z7!ZX`cnG*Caw~`riUmM+2~Y(tm{}VVL}CP#0c9vzMAtEWoT6$3ASQ}jVGm$>$t}*H z1v_GxCd&jUk*6>Iw1w>)Sg0HiAIAwtv4Jz}|FMu!;m7g}@nytL~!H`MbF~xl&vl=_Gfpe5{_R=YKB=STq z)O_59DC*t9HUB?|K)zP?eKwD=cE--?>qi~%mC`oVEWM3 z2Ln5oYO;lk$9!fC)>%|Pp?0w<@2HA)s^}~`vMuyrqG4K{rSgqx=?X2ax1)}S{)Ibg zy~;nDMOS9gtL>gG4}Bv-uU55>n&~PtZLoX)^Gzz+pz0j8)75r*jgu}HTE@s>%WQ`L mRso+!kSaWq&k~RQ`5Cz_R-ZT&y{6wC9;^nQC?-rVe*Xdj6YOFD delta 1497 zcmZ9Me@qis9Khe*wbvhB+f$%kSH)xe&I@04m5MQLQ%##gA0F5$0nE=mxV2CBU!eXZSNF~+xz32d_M1c z-+S--UfxW~Y>L6gS*+lH1A$zB$#7b+wxHqg_zh1~9&_FOxGQZ@la1T_YOfjq9>~E( z6aa|ml828UZud=Z>bI})s8syeup4y z-Uxc%0c0k5btQv7 zOFegEub_$adjJhO>3DhTr{SCd6N0C8UAy;f^M=%hbH{d^nJm9^_S=&}wWZ}j#p3H#Z=~g=GCu{Uuf)3j$2-1Qb?tb^ zr6Sdd?8<|g4X(yL`x|z;8n>anTEn?l&KTb-Pn_7^W&CdPB*6NQE~r6Yu$w}Ry2p&! zFF5QU?Zd`Gf_yA5gm3DQP9+&v0WUxG*2Zw%MEeqLj$24&bGt~eDiC>>qJh%O_Ta|2 z`uA0c10P7nl`xsS?D<1>x7q@Vzy3LZpaMPdVnjY~`I_a^x+xm? zVNLFk;42A~BupX(6`)0< ztfT}dc8|oNX1qvPvzTWl$v%{dWh+^xf(Nt`cjK#@Et!4!bDqo}hQ_SRX1o$0Su+yM zp;^*Q)*PC^I}m(6^f6IvO-4HLt3w-8Tk|`u{X?Yg!IY%e=EJ6T6Ji))Q!v<5ViXWY za>xXr<_R$)A~n{sBpx<4HOiVGxc@_sVUKdJqm82AWk4*t&&L31t+O9*&=7ExNrBXB=U z$v6)0o6u(~7#|KJN%)AgdZ$_14}uR%aGrr%XL> zFLA~>IIVG@M3o_!ykfPW;GBc14rK|oyCStYq2(;!>hw>im3bw7dPOhrxz!AeQrLM4 z7<$1;tf7z6UAW@eJU5$)^`0r#uTp{>v#jA9evBfRFCe@h_;=-fRE> diff --git a/piet-gpu/shader/gen/tile_alloc.dxil b/piet-gpu/shader/gen/tile_alloc.dxil index d4d0b494795d66f02dc6bf06f5d8b217406e4f49..7759910ca527b4ff12fbe9ba3ee03fdb6a428ca7 100644 GIT binary patch delta 1523 zcmYLJe@qis9Dnzt*K2#i6<4{^B3GeUU8h%c3c4S?!kA9n8dsGff0T+04KTzXQRmj{ zQA-)bp;WBXZHLa;L|Ej9PLjE_1q>>4z}SS17+{*Jx=@MghH_P^tm%R7=em|f0 z`F`HZJ7sD#Y4Zwgxp`-PYkb;K;|LeFWki0|_d@^xqC@)xL6t>9cb67@7tNVIzxz}3 zSInU9gzwSnp_3ow6|OC)PyyfqGVn7DfV2l9kQA{FF>cF^+%^yZjC4iuaX5{-ei~P{ z0tK#vgc?+^22MfrPE4!?`zZi6G+WTz<|itpM~C&%nYdd}hiEY3_u1#UDGCG9;26khkA)l1zc8H7$`Rcyhkz=V`PC255Sy)w=|Wj*6lh;2cZ=#2rFQFCDmOr zW+e+RRhrsV;p~L%Rl5(~{%K-l^7hR2i5ctFq1YX2{n?Arj$>Zp3PHEGadw4FR*6Sk zydAscpHd-~F=pRZ8q;A}G-7G~M79uy&op0^(Hh~`rm3D_&+xUo?3J@U!{4q~WCPHZ zhB@J8S0buiB)TydEi_AxB#9G!&TaKNY>PC_?PNR=G4gT-a8|-2`YH8`l;4Q`#VHBSit6kM5KYrTn)f zb&V7)MxkW6oAE_;jhU!*&Sya~5`ZM8>OC&(b-iaWT5bcxN;vT)1ys#;{?IqevRU;-6Bad#y+vf#ihjZV&{`NkqR8Fkr}Sk&Z=JTjl8#{_ zfe@%Qp~;|Bl{)ZFUj$f5B3MHon)JY2K@alxGt<0$!a1@S44EN|9kL_kIHCc|1AfL1 zG01jllNIvMI<)EzKYx_Zkq!<-A<<9fcTVNcX{7X$QqF-9UzA-ZkNP*_|-se_UOy#%87_lx@LX8y`An; z`hx>?oCkI}sw3v8*f5Sc;x@dUbdO8u#e7KwXLt%~r~H$t5myVeh@ZlWvgJ%@+nSIN z*mYT5D+4SOvQO)43>h|eM*afIk}a99GWM~_Yuw8XU@;{RgS2iX;@80}u>`nVSf?+J zb4{nlrabyL+{R5dW0|6*1c4VGg{T#Djg8`*aM`n4(x13ccYr}T=#8}UkI9`-|igM2@yA<9bTLb6DBGOen`ni2-SHE#+^I=rV^(VorKpN}M5@*n5a zwV25GpzpNtz5!Pm%&`ULhpm&Y%rE(zu`D;7Po#*dBG0QrLv@@P?W9$mGj*#fX5-5m zLSuD;`Dmx9q4PnVldpdaQF}GP{y8gWa;;bwF{&9%av++>hH?2u$XUEU2h!kn_N|!! zi-_-QU)7Ph>FVzOqVCtWbRSylD4EAhkaQ_?!|sflqlX}i_-%kKSRp>(x*@0_ZH4v& VvDX)R*P^8twngeW@elrg`~wV|=~n;% delta 1582 zcmZ8heM}Q)7=N$5Ua#%79EDa^-ac36;Lp=pq<6%4!#o2qHAS)8aZ?JbHWY?j! zfeJj>5HXZtdhA+$1>>ggkR=MR75Cap_Ez=&1P@>%BA%%N2Mv*+G=exL@|%n;HS}~# zS?l2aKW@!;BY&6fnlBaRxs!BP>T`yq9}Ho(+6R_;i@;T$on3Flkpx#BQ-D!wWPh;c z$pnQJU=|ay-}HXhwe#1sUFW8{n#%D?O{8^rwZCu6yRCh4ykcUZ`eAtH;nle_aA|5@ z@y8o45F>eCpD7&4yR=Hb-HqLN<$U9#p>0j)8k@>Z(`@ak)&1W7b#j;#FxY9%n4prwOA0-pB}Yif zJl8lA5psH7Hm+696J{$1gcaX3sF#>ukzI}nzY54Wofo51#g7fAWQ%1sCTd&@hdV+L zt2^=Mf<*k1SDC_XZGYT1xOxfuu5m-|qh;((j}6p}&&9x*a1xrKY-0GW!1)_;1a~Mf z?Q3yoiAE9*v-?TpD}cV_3Mq)Cm9#CXz?a`w%TC0Fq=jP!5*fwXZSgl(qr;9G?O&Pz zP%2W0Emn3=2c*bE5O%6qzpLnUBnS<_dx&`pteep?RQEuO zBc2bl+l*Akc9M>FA}p(g>lwNy8bT7voeJmvJ0R;@_D2o6 zrVvONkOpkseXqkY1gOQNCB@hnowkp za=%wv^@EblaPyBz&A%r#+vPj@1y~`Bs;2TPce4AdAu)im@5f$bH+q$tWF&f3qbjV) WcCIm&!Itx~_tN3B-~Rx;>;D=6 diff --git a/piet-gpu/shader/gen/tile_alloc.hlsl b/piet-gpu/shader/gen/tile_alloc.hlsl index 9e370ed..73e0a8e 100644 --- a/piet-gpu/shader/gen/tile_alloc.hlsl +++ b/piet-gpu/shader/gen/tile_alloc.hlsl @@ -185,10 +185,6 @@ void comp_main() Path path; path.bbox = uint4(uint(x0), uint(y0), uint(x1), uint(y1)); uint tile_count = uint((x1 - x0) * (y1 - y0)); - if (drawtag == 37u) - { - tile_count = 0u; - } sh_tile_count[th_ix] = tile_count; uint total_tile_count = tile_count; for (uint i = 0u; i < 8u; i++) @@ -204,46 +200,46 @@ void comp_main() if (th_ix == 255u) { uint param_1 = total_tile_count * 8u; - MallocResult _396 = malloc(param_1); - sh_tile_alloc = _396; + MallocResult _392 = malloc(param_1); + sh_tile_alloc = _392; } GroupMemoryBarrierWithGroupSync(); MallocResult alloc_start = sh_tile_alloc; - bool _407; + bool _403; if (!alloc_start.failed) { - _407 = _70.Load(4) != 0u; + _403 = _70.Load(4) != 0u; } else { - _407 = alloc_start.failed; + _403 = alloc_start.failed; } - if (_407) + if (_403) { return; } if (element_ix < _181.Load(0)) { - uint _420; + uint _416; if (th_ix > 0u) { - _420 = sh_tile_count[th_ix - 1u]; + _416 = sh_tile_count[th_ix - 1u]; } else { - _420 = 0u; + _416 = 0u; } - uint tile_subix = _420; + uint tile_subix = _416; Alloc param_2 = alloc_start.alloc; uint param_3 = 8u * tile_subix; uint param_4 = 8u * tile_count; Alloc tiles_alloc = slice_mem(param_2, param_3, param_4); - TileRef _442 = { tiles_alloc.offset }; - path.tiles = _442; - Alloc _448; - _448.offset = _181.Load(16); + TileRef _438 = { tiles_alloc.offset }; + path.tiles = _438; + Alloc _444; + _444.offset = _181.Load(16); Alloc param_5; - param_5.offset = _448.offset; + param_5.offset = _444.offset; PathRef param_6 = path_ref; Path param_7 = path; Path_write(param_5, param_6, param_7); diff --git a/piet-gpu/shader/gen/tile_alloc.msl b/piet-gpu/shader/gen/tile_alloc.msl index e6f486b..961be50 100644 --- a/piet-gpu/shader/gen/tile_alloc.msl +++ b/piet-gpu/shader/gen/tile_alloc.msl @@ -204,10 +204,6 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Path path; path.bbox = uint4(uint(x0), uint(y0), uint(x1), uint(y1)); uint tile_count = uint((x1 - x0) * (y1 - y0)); - if (drawtag == 37u) - { - tile_count = 0u; - } sh_tile_count[th_ix] = tile_count; uint total_tile_count = tile_count; for (uint i = 0u; i < 8u; i++) @@ -223,36 +219,36 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M if (th_ix == 255u) { uint param_1 = total_tile_count * 8u; - MallocResult _396 = malloc(param_1, v_70, v_70BufferSize); - sh_tile_alloc = _396; + MallocResult _392 = malloc(param_1, v_70, v_70BufferSize); + sh_tile_alloc = _392; } threadgroup_barrier(mem_flags::mem_threadgroup); MallocResult alloc_start = sh_tile_alloc; - bool _407; + bool _403; if (!alloc_start.failed) { - _407 = v_70.mem_error != 0u; + _403 = v_70.mem_error != 0u; } else { - _407 = alloc_start.failed; + _403 = alloc_start.failed; } - if (_407) + if (_403) { return; } if (element_ix < v_181.conf.n_elements) { - uint _420; + uint _416; if (th_ix > 0u) { - _420 = sh_tile_count[th_ix - 1u]; + _416 = sh_tile_count[th_ix - 1u]; } else { - _420 = 0u; + _416 = 0u; } - uint tile_subix = _420; + uint tile_subix = _416; Alloc param_2 = alloc_start.alloc; uint param_3 = 8u * tile_subix; uint param_4 = 8u * tile_count; diff --git a/piet-gpu/shader/gen/tile_alloc.spv b/piet-gpu/shader/gen/tile_alloc.spv index 3ae10738a3100148fb250dd94989ada5ce5d0348..dbc02a8e5b33b11e2aa77b3e30bc20d732eaf669 100644 GIT binary patch delta 3176 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 It@h}D0Fw`|H~;_u diff --git a/piet-gpu/shader/gen/transform_leaf.dxil b/piet-gpu/shader/gen/transform_leaf.dxil index 0c1e37624dfc3d26fcfb6bec6f7c42bcf6883e72..f9f31e6ea1417ccaabda3cd5ad47c1b5642a4e85 100644 GIT binary patch delta 1610 zcmZ9MeM}Q)0LJgG*W;)KTiQZtQSSH>OEIm=hnwP+9yKu8nptL1bO#7BKdUp$O(J(y z3ac(_KjX0?*Qz>VW$AfSWEvc@G?)T6SNqXU{-pOt+7{<5~@@#~Q(ek-bn zV2XNbV`+&yLhbhIhrBY0hjv8*KbHbEUx8i<0a$!aUZoc4!xGSSS(KAru7Kg29@$W) z!E6S!4W|5>!ZMWCNo|-VA1&j@y%WpFV8)+-j$SInzplbut`mur*}5Hzn*$`E)x?Qp z{k84R(S-__{1U@%xEQS~1U|m~Hy1Qa51;S(vGmu64VL#FTGHatbDp~$fg@MhGvY7^ zI>~m5u?XK2UTf?ayZXR%<#fl`wcOz40RQ<3=}sv7qUrP(Or)2qF+nt@Cbv_&N({&c zh9VDup~zuv!3NDKMpLVf15l^w8PfbYve}2kA_(B5Jfo&luZJV1%k1+|UFG;Z53~CS zSC$FboY}#kjX>TgqJ<=7^eIMhRxrkiAj7OS9_=$JFAG}Z81hPMOzZ+x-7^6_uQl7k zK~6OyXv+JqHKlHx2@lNViT=yevB&3X;zVm5RS!a_Dai$27bvB`@TN4{r0?sQMwWQQ z`S#ls;y18&=B8IhSwlHO+ztLNliGkXpexg01-;;ugcoU~I|&x401a?~H?b37tC`|- zgI;GUEh#dslF9&>qjQ4R2M$bxTNIGj<)Gyv7%&;U0X*U*Hd-}y5J)sfP<;SM$fRdK zny9j(pA;^|0o_%x+DHI0Sd>#ae?Oyy9O_(@E-D8tvzh0DcBNNQQ9@?R#@Crs$D?ex zp_*pP-7(qoZ0&-;fVw`lcI7dA=&|vh`FD%BQV`b0P zO!oi^XIQW)lE0c?33 z{LL|x5}OM=S%z%{d(fyj$byNIygcXtW(XJE%W39z&;8O3ROjb3RbMM`U=* zz?ZilyKFXE!6{}mw4V?Yb28sl^5rF?e_DC-@~k=PoH1h-@#gH5eUtrfKO(PXIeJ41 z2*fWH%WVrtu>&uO;AfB3b)t!YMYRWS6OgF8B4GSpygvf0Y^A8W9|TURz#j-UT{k9R z)=9iX1GW}6*WC~>?+o51V0+y!Ji78IESl{hGRhgIqE;e$VPA?&8>{)sZt#_1i#_#n zw4#=nD25@SIJ>%?sTkSEH~Sa=n>2K?7y_de=<{X=S2+MnGW@WxRM{WG`e81#mp{q! z8HoBn)G#1_we?Ry?FHjD!Uq|FUWC+1Mf^55I}JSaCBg#G&KW0KDWb~h`3Ch4bhk)a z8d;00jRyY29uQ}2icNKC|A}E83Ki&PU5Z3-3wuGavIr-;sU}mlb6xcmEqQ5nlYH4& zYV#| zu#B}TnS}A|Wz{7gi`;>1{$^)ACGEHAn7xbjJBh=~@usx)nil1-wqO(cw{inm&gQA& z!F%jJRb*7wBHxJxTr28doaE0;T7|E-obRqNiTFLSKV*HXNU(|>QfXE`DN6E&O}afv z9Sup}?UrBa_eg5hOZj(?>0i_yqvO6sJ1-@5_9UeSJ%$e4brEa%H8c4TEWD-s_b)X( BF)RQ8 delta 1694 zcmZ9NYfuwc7>0K@%d(ISBqW4DY}tTvNg|T~2BZadLqNeBRTyK%HUcW85-EbkDKl&? z1WIwt5Ts~F1?z=Uw1Hp&Wja|dl0mG{QinPgMbRp)EkpgGGo4O%1^nUuI?wl>dFPz( zJ?CtTvPCJ<>9wiA8(*hLiSjR4>hFonJ+Y6i(rvsW{Wez?s)XPI!(Vy_y|2B=vQ6^+nS;HQ255V@J2d_|L7r zdDLjkoCjS5b`Z+ALY_ZG2cM&BNr=KFI-}u}y(*+gm1hTV6q%6bo(gHBL+T|f0n|*w z-pv=0{ca>2K>)MCK1p^j568(N#|uAsmFR7|sq{Eqs0Fgk89rb(fh6TotW$RAIg_xB z6($L9)nZK)=<9XQ6;L=Ts1+44z~c1aVNpz4l^b%_%++n>#XP8Q?DgYdFUt^2pwWQEmX4iR6dpLHI+&wbM$coM9N{S zsd7xhc{!y<7CH;C+5Az7XQUz4ek^(~9vaSnAu+i}P&g$WpI2Yx&E{{FdPYub?8g$x zVn)6Lq=>Qk&H>*2d=NbIh&KZW4?6p0EAk+}rUa{H(-6I2D{1ywtDi3Mi&uN!kp9@} z$P`3Y86jklM`uv9(!z(A4urKj<-YC;XLGJkyzGh)>@aNLojapTPiuhcC)UQTu+u!VdMHey!OcdX=&8>)XHbKeCATq6b%22H0gZ9uZTki85acTH zg<*<9d%-r3^4#q(YE2dPX{VTWf`T%RYNLwD%ZYcVsO7vM4 zBVJe(?Tex|h7lK+?0ho3<%w=0tz?jwOCT=HOOPF@^D2>*2QjOU;`O6ZKzd-AY?#Fj zydPLxRl#CahoO)+&hnZ{*&|l2<^9BB+Sju35U^uU3vZIeoQtwy7Tvtt4BB$?@KDEf zCbG{>mGvQqW-^gnH~+t38AHAB4Hy}o+R(z$MMScFkv zoufmzE|1hPGsq0{`!(~F@4u<-Iwo#actk)JP%qc%GSe6=374~&xoHud;V~>0W$Wr# zbv`_n#kxFQdpe{a#3M8;wioF#*E48{NOEiznIfh#*4FGj!l}EP!CddOd7XZm3Of?3 zJV*$VWlagap3|Zm(p;#ij^OsDj}J1zwV?>HXQ{UDOQg!Yswdd!L-*{;#o6aL6k zv;@r7*%f^aimRo9u3`JK>n}0AVRHI1daX-wZ9t*%o`WniHev_U9Met+X8%Y31NhfJ ALjV8( diff --git a/piet-gpu/shader/gen/transform_reduce.dxil b/piet-gpu/shader/gen/transform_reduce.dxil index fc3a311f97ad90657935d6f92e7e0be1a2fb9238..978dd98aca8a278bde85fc024c77ca5695bdfcda 100644 GIT binary patch delta 1313 zcmY+Ee@qi+7{}jh-(Jt!!nL+~(6JsrR0tKW9RhLKU4KYAD6ZQoLBbyg1;YX}ZpLJD zWW64hRR_}9ZgV=5&N+g{EI4tdYO>xyVU2FkHA}vs16#GkEKqc0!Kdc;n>hKP*j;R#%pJs&!wz zcmA%tPy!j|FHe|M95N7xqQ*oNSA^J}ERfsCsVg1J<~W z;n=D*5Ke{ggpIP>f&PefXRx^)W4dRA{QF}hISG-*a-(AyPfoaggq_%+3VM(@oW-5P z2fm2a;al1`*0~0@PEnmBLw?fS_p`f+VD{}urx&N1lH-Z#`2lFvnXA@aHpgPa6&H(; z$$--G!_|`B8(+G1*D$Hvk-eYTSLYXpJND-ndyi|#w(+H=xx~$17v`=dZVtd5Ip(U5 z%@tc>Rf8AHDlWx}tn%}hWm%H&k_sYO;d`oT-wD1fV68y&(N%zB@XwGPy*v@(gH{Pk z5{}p0Sza7%qgoh1V(3AAW$S;BFX}6Wloiudc6;D_-v&sl`Xe|kJ9d~L0mdORxk1D7 z?KY5N(Umu!3G$j=F^ia1GD{>U;$L%A3_W=(q37ACReMUzw0l=Ft>G-98(J>-Bug2> z4>EFm((5+LjZkqTl|tzQG%oQ1c+EjB;Bi)KUnnRI~-rCQ0nTWB?52 z>X=c0(73X&k&u;R&gQaQkRWA*i3T{7F06IUs<>B)I*hHUMyi!KfIOQ#;0c8znQGmB zzixqSUoInmQYL&UGuwwr|4ysXJ0`Dk&O1hoj~y|E`is1zp*BHV1|t5hUV6q0C5C+b z0pX92eOeys-}*XfcxQ^Xpce$&E`88I#m5vCY`+Y4Evl9fbVS8(VR>UW4)ak|m|7?p zD4ny*?vWQVk+Y0*)w@`aDoAIuc}vy>gHO`H$2E^|r5;B%gMEwLsTbf7H@n`EN0gJ2 z4p4JjUKGL@S+^_VpgL)o1|GZSm5u6nHhPRc$fQ~93{p5>aH>9!-K?xQr{RYXb%T_u zrIa3Uk{q_1+(?j{$hb<&NQLcrtyISrVz=CaeCx6FrTxp+wn4CuzjtUJIv?669eZ@0 z)HHqtW?eVq+uSyn^A`swCK8g35(WEmb)ECJh)Hf4YqmS@i8v)Oigx=;&VNMwjax>| zPUnejpo5r~Y!dC-M&~&Zm$*$5pMq`vP-weRX#3Vy($GClTk1dXcU{jD=HeCRGA_*J z|NdjpvNq=La=j_o-$kpM^9Juo`Q^J6UP^+ zUV;FakK^xT@3XEOL18f=6*_#%W&$HVC_ghK;Scr*m*Ghq1^3zE7Y!6!+XFlQy zZnmevt)h;$Rfc9Xt)fqPZp8t@pL99YkM_sa-s- Zf0jSAl}J*A8m8#J*wOVgF5Y6|`WK>fx;_8^ delta 1371 zcmZ9MeQXnD0LI_DdwaW<>$q;$a9s<%bsucfjTXoF5ax9yb)uU^>e!}#+*p~5ZiJv& z&@Ab->q_}@MM_fn!*r9G2{U%i7-k^$*s%N54riE%2FO4|CL$qoB$#+tHlp4iZ|?Uz z_db{RdEdKhxz}>(Z8ha~@V~2{PNq?t`$uvFUk3oe|~0ac@v^bP}n{luuM(vt~if3&blt1W3pGa)?1vQq(n z4b!bNpfe$InVoF61HC`(6ua*VM2_bZ$EU8R3juij8yx*;!iN17ZSoEp7l zyU;T@HCd_LGVqlm3suy!05B*1R69IfVoA{U9G-(KfsdzpkXJ&8E-VIZsK7GY-f-&N z6y9jr%>$OeNA(-`EZ!c{Z6qP`>>jIj#F$^i;usueHZQ2TZ=m4vX} zfjCGCKvB5b;R>~LT1O@tWn98yWSduehiytlrY%N#$liSi6k7;h&P+$=4SXjuPxH%> zd6J)8m~BX`Ha>lkD{J+8+ssPrVI%{;-|r@88^)NC1Odw&>^&>$?bHx$6SdgGnE}at zT|L{7%o<4qHwv8!tgSDEE!1%F#4oIow_Kz8FlJ&MVO!eK3eSSC%;jAE@*^s)!cYEo zke?BV(?|hoJk6N|Em?$Qh%rRt#GHw;iofk(4a4uw_0?mh7#^iPA@mTawoLe+heP-_ zLCvkt&F;uR`s#ZRg^7SV7|jxVRpp2C(3&A3)2t!&ly^NCfJ2-Dq?JEIV_HE^cz$=1 zF7Pq?h282zBEDq$B~HPs9=nBvY_g3e$$WeQ$E$?lXI+(WmxvFk#TP=N8QTH#hW&IE zjQK?Kep3`Md#3%amn5_my(?qS>|+#*F3Nc8fqy#X7LUo8=Q-X%*TGnztN3zia#x4z zRSC1#UX`)h>usArrDAjN`_>An_LEZWW^1T(tD7~pk8uC$|0s98L8Bi@X~j@XmwJe6JSj3P(h~@J5$XFg$9AlE+uF>-WTWnAHnTU_@dIeD4PeT<+0pW&6@`IceXDBQ!|=&Tsrx&eM4(!P24dXr=E@+sYM}@ H`j`F#T7JoB diff --git a/piet-gpu/shader/gen/transform_root.dxil b/piet-gpu/shader/gen/transform_root.dxil index a33ff7f18731036eecfff1788ec93557c0699844..5b4f05930600267411a9865e166d35bb5c6578ff 100644 GIT binary patch delta 942 zcmZ9~Z%i9y90%~{Y446}xq~Y(XsyUWsg@N+TQ{6znT0ltYSF_Kg4uM}RTtvi;$$XH zx|AM&R!tX*2Zo3*s&k7>T+Xo=%ygj?w%TCqDr(h^)C5WAn8QXRCcf~lzVqeh`F?+S z{^UvPQ+kcPr`6V95h;9f;&(^yt?c)6N!J_%0Hi+A94L5n{ZO~=&I4CYU%SKC@9H~o z+1}%DItu|{0Sdm60U#NObxNGrDXzEL=2xo;0OGSB7uXQpew? zl%atU4M-jVhDpdlcs;@dn`3>@oB&$kSwH z?Jo?5b_O8&bQtP8mFLyWE9bS$HMq;#p`c7{fTIIG9q%Tc@Fo5dsf83DCk2?{`-=>a z<3A|+!nfi+G1!of?x{a6pkDUO68UMU_^vSLulOTUS^mi8!oJVtnt58TejW@GYzPvT zfzGcUYd>oTMm5XTa&CD|I~JzLLVMl--KOP52NK2X0%7gYSN~ZIXIMcofsc@Zux8*g z)B0e!9@ zEuqm44_!4Fv+ir7H_bAie^iBggVv14oe_KY$TiPT+Sm=#?$D?L@jB^@X92A$HEb=H zNGER*q9z7XNHZZ~e;zOYA36*J94n-+AKF?HU_`kH#K)R85%U6cD;Ff3qa;A(brEvv zG{d`8_09k}{UgqzgRiC9tk87vL$dCc#8X*`+rK2Ie~|e4RzAH=*5%9nf&EgNB&TyY zOWM4X5-;ZXWmRhTTzd;43m)V)s$<^?HO+?;fX1=%$uJ&3%of~SqT6}+#e~kJK8`^(E%l6db@6>0)prV zQES%Tu5&NUHQo+7$xMlwxCN67TM$i5+On65{m^JJtroK-V=Rj=gor8Mytkj!^X+&3 z&yzgooSdAoVAR-MRvY-=g1igYG(Ba{emMSv^3F`=y6Mrrk2)4oqjuLpC-npXG?0L- z2mrx=FIVs#d-#2;E&gjY2Eh08UzYs|k#71ACmWN|5M!Zyr%FF|rBQwb$h=WVye{=K z8orBdmUj=IQX>(hkg_Hf9hX4Kl1bACKA9{>c15_-|-4ept*WXX$8 zg~H4D?KD9?!6B(|`b(ecDcWRGM>+VK~FRa7&`;P50U;2B)WF$TguYH{h zUCU2>*Co5KxBquGp1Mlf5aW(>=2O&_VXchss7k5H0 zJBRBaV3%!FB^m47?90RoesFUrdkEo} zKvUch1L`BiA=Po7usJ1gY9yp8rOg?EccP()K-iKKxP2m&?GeUlSuOR>gjBse*IG6O z9vuz%oLceYoKgC)^(40LIjl*o=-a}RT?0f_Fm2iIARe@e1_P5y)OW$M>T$>Ty0iGY z=ND~ig*1gHWr)v7ta_4?s>=FexyKI9+4=8FoP+hSA7+@6Jw16XqW1oK;U>L Self { - Self { mode, composition_mode } + Self { + mode, + composition_mode, + } } pub(crate) fn pack(&self) -> u32 { diff --git a/piet-gpu/src/encoder.rs b/piet-gpu/src/encoder.rs index c25c260..62c59c4 100644 --- a/piet-gpu/src/encoder.rs +++ b/piet-gpu/src/encoder.rs @@ -134,9 +134,7 @@ impl Encoder { /// This should be encoded after a path. pub fn fill_color(&mut self, rgba_color: u32) { self.drawtag_stream.push(DRAWTAG_FILLCOLOR); - let element = FillColor { - rgba_color, - }; + let element = FillColor { rgba_color }; self.drawdata_stream.extend(bytemuck::bytes_of(&element)); } @@ -145,11 +143,7 @@ impl Encoder { /// This should be encoded after a path. pub fn fill_lin_gradient(&mut self, index: u32, p0: [f32; 2], p1: [f32; 2]) { self.drawtag_stream.push(DRAWTAG_FILLLINGRADIENT); - let element = FillLinGradient { - index, - p0, - p1, - }; + let element = FillLinGradient { index, p0, p1 }; self.drawdata_stream.extend(bytemuck::bytes_of(&element)); } @@ -334,9 +328,7 @@ impl GlyphEncoder { /// This should be encoded after a path. pub(crate) fn fill_color(&mut self, rgba_color: u32) { self.drawtag_stream.push(DRAWTAG_FILLCOLOR); - let element = FillColor { - rgba_color, - }; + let element = FillColor { rgba_color }; self.drawdata_stream.extend(bytemuck::bytes_of(&element)); } diff --git a/piet-gpu/src/lib.rs b/piet-gpu/src/lib.rs index 5c5c78a..e12f824 100644 --- a/piet-gpu/src/lib.rs +++ b/piet-gpu/src/lib.rs @@ -195,7 +195,7 @@ impl Renderer { let element_stage = ElementStage::new(session, &element_code); let element_bindings = scene_bufs .iter() - .map(|scene_buf| + .map(|scene_buf| { element_stage.bind( session, &element_code, @@ -203,15 +203,21 @@ impl Renderer { scene_buf, &memory_buf_dev, ) - ) + }) .collect(); let clip_code = ClipCode::new(session); let clip_binding = ClipBinding::new(session, &clip_code, &config_buf, &memory_buf_dev); let tile_alloc_code = include_shader!(session, "../shader/gen/tile_alloc"); - let tile_pipeline = session - .create_compute_pipeline(tile_alloc_code, &[BindType::Buffer, BindType::BufReadOnly])?; + let tile_pipeline = session.create_compute_pipeline( + tile_alloc_code, + &[ + BindType::Buffer, + BindType::BufReadOnly, + BindType::BufReadOnly, + ], + )?; let tile_ds = scene_bufs .iter() .map(|scene_buf| { @@ -265,7 +271,6 @@ impl Renderer { ) }) .collect::, _>>()?; - let bg_image = Self::make_test_bg_image(&session); const GRADIENT_BUF_SIZE: usize = diff --git a/piet-gpu/src/render_ctx.rs b/piet-gpu/src/render_ctx.rs index e9a24fa..024dd2b 100644 --- a/piet-gpu/src/render_ctx.rs +++ b/piet-gpu/src/render_ctx.rs @@ -228,9 +228,7 @@ impl RenderContext for PietGpuRenderContext { 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, - }); + self.clip_stack.push(ClipElement { blend: None }); if let Some(tos) = self.state_stack.last_mut() { tos.n_clip += 1; } @@ -334,9 +332,7 @@ impl PietGpuRenderContext { 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), - }); + self.clip_stack.push(ClipElement { blend: Some(blend) }); if let Some(tos) = self.state_stack.last_mut() { tos.n_clip += 1; } diff --git a/piet-gpu/src/test_scenes.rs b/piet-gpu/src/test_scenes.rs index 118b727..ee5839d 100644 --- a/piet-gpu/src/test_scenes.rs +++ b/piet-gpu/src/test_scenes.rs @@ -2,7 +2,7 @@ use rand::{Rng, RngCore}; -use crate::{PietGpuRenderContext, Blend, BlendMode, CompositionMode}; +use crate::{Blend, BlendMode, CompositionMode, PietGpuRenderContext}; use piet::kurbo::{Affine, BezPath, Circle, Line, Point, Rect, Shape}; use piet::{ Color, FixedGradient, FixedLinearGradient, GradientStop, Text, TextAttribute, TextLayoutBuilder, @@ -13,10 +13,7 @@ use crate::{PicoSvg, RenderContext, Vec2}; const N_CIRCLES: usize = 0; pub fn render_blend_test(rc: &mut PietGpuRenderContext, i: usize, blend: Blend) { - rc.fill( - Rect::new(400., 400., 800., 800.), - &Color::rgb8(0, 0, 200), - ); + rc.fill(Rect::new(400., 400., 800., 800.), &Color::rgb8(0, 0, 200)); rc.save().unwrap(); rc.blend(Rect::new(0., 0., 1000., 1000.), blend); rc.transform(Affine::translate(Vec2::new(600., 600.)) * Affine::rotate(0.01 * i as f64)); diff --git a/tests/src/draw.rs b/tests/src/draw.rs index 692f943..4372da4 100644 --- a/tests/src/draw.rs +++ b/tests/src/draw.rs @@ -17,7 +17,7 @@ //! Tests for the piet-gpu draw object stage. use piet_gpu_hal::{BufWrite, BufferUsage}; -use rand::{Rng, seq::SliceRandom}; +use rand::{seq::SliceRandom, Rng}; use crate::{Config, Runner, TestResult}; @@ -33,7 +33,13 @@ const DRAWTAG_FILLIMAGE: u32 = 8; const DRAWTAG_BEGINCLIP: u32 = 5; const DRAWTAG_ENDCLIP: u32 = 37; -const TAGS: &[u32] = &[DRAWTAG_FILLCOLOR, DRAWTAG_FILLLINGRADIENT, DRAWTAG_FILLIMAGE, DRAWTAG_BEGINCLIP, DRAWTAG_ENDCLIP]; +const TAGS: &[u32] = &[ + DRAWTAG_FILLCOLOR, + DRAWTAG_FILLLINGRADIENT, + DRAWTAG_FILLIMAGE, + DRAWTAG_BEGINCLIP, + DRAWTAG_ENDCLIP, +]; struct DrawTestData { tags: Vec,