From 44bff2726cc844fcb4c370a76bf2604a1f48d7bc Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Wed, 17 Mar 2021 16:34:21 +0100 Subject: [PATCH] collapse FillCubic and StrokeCubic into Cubic with flags for fill mode Updates #70 Signed-off-by: Elias Naur --- piet-gpu-types/src/pathseg.rs | 20 ++----- piet-gpu/shader/elements.comp | 20 ++----- piet-gpu/shader/elements.spv | Bin 65976 -> 65588 bytes piet-gpu/shader/path_coarse.comp | 16 +++--- piet-gpu/shader/path_coarse.spv | Bin 42488 -> 42804 bytes piet-gpu/shader/pathseg.h | 93 +++++-------------------------- 6 files changed, 30 insertions(+), 119 deletions(-) diff --git a/piet-gpu-types/src/pathseg.rs b/piet-gpu-types/src/pathseg.rs index a679e44..c6067fa 100644 --- a/piet-gpu-types/src/pathseg.rs +++ b/piet-gpu-types/src/pathseg.rs @@ -3,32 +3,20 @@ use piet_gpu_derive::piet_gpu; piet_gpu! { #[gpu_write] mod pathseg { - struct PathFillCubic { + struct PathCubic { p0: [f32; 2], p1: [f32; 2], p2: [f32; 2], p3: [f32; 2], path_ix: u32, - // trans_ix is 1-based, 0 means no transformation. + // trans_ix is the transform index. It is 1-based, 0 means no transformation. trans_ix: u32, - // A note: the layout of this struct is shared with - // PathStrokeCubic. In that case, we actually write - // [0.0, 0.0] as the stroke field, to minimize divergence. - } - struct PathStrokeCubic { - p0: [f32; 2], - p1: [f32; 2], - p2: [f32; 2], - p3: [f32; 2], - path_ix: u32, - trans_ix: u32, - // halfwidth in both x and y for binning + // Halfwidth in both x and y for binning. For strokes only. stroke: [f32; 2], } enum PathSeg { Nop, - FillCubic(PathFillCubic), - StrokeCubic(PathStrokeCubic), + Cubic(TagFlags, PathCubic), } } } diff --git a/piet-gpu/shader/elements.comp b/piet-gpu/shader/elements.comp index 1289cc2..b33ed66 100644 --- a/piet-gpu/shader/elements.comp +++ b/piet-gpu/shader/elements.comp @@ -293,7 +293,7 @@ void main() { switch (tag.tag) { case Element_Line: LineSeg line = Element_Line_read(this_ref); - PathStrokeCubic path_cubic; + PathCubic path_cubic; path_cubic.p0 = line.p0; path_cubic.p1 = mix(line.p0, line.p1, 1.0 / 3.0); path_cubic.p2 = mix(line.p1, line.p0, 1.0 / 3.0); @@ -305,12 +305,8 @@ void main() { } else { path_cubic.stroke = vec2(0.0); } - // We do encoding a bit by hand to minimize divergence. Another approach - // would be to have a fill/stroke bool. PathSegRef path_out_ref = PathSegRef(conf.pathseg_alloc.offset + (st.pathseg_count - 1) * PathSeg_size); - uint out_tag = !is_stroke ? PathSeg_FillCubic : PathSeg_StrokeCubic; - write_mem(conf.pathseg_alloc, path_out_ref.offset >> 2, out_tag); - PathStrokeCubic_write(conf.pathseg_alloc, PathStrokeCubicRef(path_out_ref.offset + 4), path_cubic); + PathSeg_Cubic_write(conf.pathseg_alloc, path_out_ref, fill_mode, path_cubic); break; case Element_Quad: QuadSeg quad = Element_Quad_read(this_ref); @@ -325,12 +321,8 @@ void main() { } else { path_cubic.stroke = vec2(0.0); } - // We do encoding a bit by hand to minimize divergence. Another approach - // would be to have a fill/stroke bool. path_out_ref = PathSegRef(conf.pathseg_alloc.offset + (st.pathseg_count - 1) * PathSeg_size); - out_tag = !is_stroke ? PathSeg_FillCubic : PathSeg_StrokeCubic; - write_mem(conf.pathseg_alloc, path_out_ref.offset >> 2, out_tag); - PathStrokeCubic_write(conf.pathseg_alloc, PathStrokeCubicRef(path_out_ref.offset + 4), path_cubic); + PathSeg_Cubic_write(conf.pathseg_alloc, path_out_ref, fill_mode, path_cubic); break; case Element_Cubic: CubicSeg cubic = Element_Cubic_read(this_ref); @@ -345,12 +337,8 @@ void main() { } else { path_cubic.stroke = vec2(0.0); } - // We do encoding a bit by hand to minimize divergence. Another approach - // would be to have a fill/stroke bool. path_out_ref = PathSegRef(conf.pathseg_alloc.offset + (st.pathseg_count - 1) * PathSeg_size); - out_tag = !is_stroke ? PathSeg_FillCubic : PathSeg_StrokeCubic; - write_mem(conf.pathseg_alloc, path_out_ref.offset >> 2, out_tag); - PathStrokeCubic_write(conf.pathseg_alloc, PathStrokeCubicRef(path_out_ref.offset + 4), path_cubic); + PathSeg_Cubic_write(conf.pathseg_alloc, path_out_ref, fill_mode, path_cubic); break; case Element_FillColor: FillColor fill = Element_FillColor_read(this_ref); diff --git a/piet-gpu/shader/elements.spv b/piet-gpu/shader/elements.spv index b83e06592dd21d03e1b5cbcbfbabf877fc7bf591..a49255bfcc597ed2515a34e010569734c9de2260 100644 GIT binary patch literal 65588 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 OHUO*JKgUq+82&#TQZ8Ho diff --git a/piet-gpu/shader/path_coarse.comp b/piet-gpu/shader/path_coarse.comp index 663fe45..51264bf 100644 --- a/piet-gpu/shader/path_coarse.comp +++ b/piet-gpu/shader/path_coarse.comp @@ -94,14 +94,13 @@ void main() { uint element_ix = gl_GlobalInvocationID.x; PathSegRef ref = PathSegRef(conf.pathseg_alloc.offset + element_ix * PathSeg_size); - uint tag = PathSeg_Nop; + PathSegTag tag = PathSegTag(PathSeg_Nop, 0); if (element_ix < conf.n_pathseg) { - tag = PathSeg_tag(conf.pathseg_alloc, ref).tag; + tag = PathSeg_tag(conf.pathseg_alloc, ref); } - switch (tag) { - case PathSeg_FillCubic: - case PathSeg_StrokeCubic: - PathStrokeCubic cubic = PathSeg_StrokeCubic_read(conf.pathseg_alloc, ref); + switch (tag.tag) { + case PathSeg_Cubic: + PathCubic cubic = PathSeg_Cubic_read(conf.pathseg_alloc, ref); uint trans_ix = cubic.trans_ix; if (trans_ix > 0) { @@ -133,6 +132,7 @@ void main() { } uint n = max(uint(ceil(val * 0.5 / sqrt(REM_ACCURACY))), 1); + bool is_stroke = fill_mode_from_flags(tag.flags) == MODE_STROKE; uint path_ix = cubic.path_ix; Path path = Path_read(conf.tile_alloc, PathRef(conf.tile_alloc.offset + path_ix * Path_size)); Alloc path_alloc = new_alloc(path.tiles.offset, (path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y) * Tile_size); @@ -212,7 +212,7 @@ void main() { for (int y = y0; y < y1; y++) { float tile_y0 = float(y * TILE_HEIGHT_PX); int xbackdrop = max(xray + 1, bbox.x); - if (tag == PathSeg_FillCubic && min(p0.y, p1.y) < tile_y0 && xbackdrop < bbox.z) { + if (!is_stroke && min(p0.y, p1.y) < tile_y0 && xbackdrop < bbox.z) { int backdrop = p1.y < p0.y ? 1 : -1; TileRef tile_ref = Tile_index(path.tiles, uint(base + xbackdrop)); uint tile_el = tile_ref.offset >> 2; @@ -248,7 +248,7 @@ void main() { tile_seg.origin = p0; tile_seg.vector = p1 - p0; float y_edge = 0.0; - if (tag == PathSeg_FillCubic) { + if (!is_stroke) { y_edge = mix(p0.y, p1.y, (tile_x0 - p0.x) / dx); if (min(p0.x, p1.x) < tile_x0) { vec2 p = vec2(tile_x0, y_edge); diff --git a/piet-gpu/shader/path_coarse.spv b/piet-gpu/shader/path_coarse.spv index 16eb64c1c7bf0d53723d75569b46da359878c2b4..b4cd985aaeeea5b51864b9168b1465fec8216d4d 100644 GIT binary patch literal 42804 zcmai-2Y_8w*|jgsBvk3WCiLE`NC^Q$@4YxoW+ovp$%IT25vzq_1$&OI|p+GbyIjz(j)#@vlL z8_x}HG(QVAW=Cl>=4lLW)+2V=dzW?kCw8y1(Z=iPFkhps>8H>9_za?Mr;P0!Gfu-i zm={1-TaYq@qOYZm|IJQ)AEcdLN9@uuV)xxg?6Q4F*ZA=r{S&A5_H^`)8Q0U%J!V2r z*TgZCd-R*L@EbF(t9Md&=`aY7vVZxU^f9crx37!Z4CQ|MMvdz4nb<&?qcJahT+h)R zo%*ddY5gtuzdp8~dw_2{bJ1w@k2!{Hv=3(7jmECchI{q&PwFLNs~>egO%t_!t2y>j zonv}?x@|wGu@HRh%#K@qI#;v$n7gqAd}80EuERUV_KaPvf8vBmT@%+HX0mHfTEEKH zTo=PH{mB=H&l=}Ejpg7+PZ%??=YNdT8n|tjuEknrK&-aLvhc~By^LV)#){wxJ)PbE zV_59Q97J%*sNT-e{VoZnW{g$zQEc+Tjn%35 z=$v@?@JS=bbnVqM3fi1&bw9J>4{EFppXm#BXR7%b&yEgvjmED(i@Q(9Z!n9y>&I^> zZ^d-ajVFhWF;mb6H)DD&Oq|d;u3wQ)e7&?-!M-EeL4&v|=w?<<9nRwazrfXs&rF?R zHW%KwgSd{?rS7b-7v=<}!M#O_&DeYQjBd`1IjH$5=VfEK!SUOtb98H*YJMgn*iPQu zyEEs0{>J8LRl5%S{@27?IkeI?=S^vwoHqlva$c~pRS~nfrvLYxl%dJAt?`v2_Leha zw>P!{@580%WH=_dpILJ;Ph)$yJ{@Dmb@xokkg8U*F1Kbs!|`q9-QL&^+-ySaULQg2 z+@vqLpILpiH+F*Sqi#NOKO;x>&D=9;&ih1iYVG;?8oR-5_kT|fy;nQMdD(?_ne$!2 zt=tDS_5eG=a-XRADf8V6UimfimHX+NFlMwTzGF}`-^m=>eG_JBUPDtmdb&rm@8jon zG_Ge#^UNI7Sf+6Ryo%q^Jf|}Kv(CEeQka!(b9e*QwI`3-pjk$(zxF^&H65NN&d0v= zm-*Na+?tQJ#{S^eTn}y>WKLekqxvR{ttQC))&0zxpTUho;ia#3&lGh(V>>6pTYk+o zHEwU`M5cs@3pH~o+yC$DTY3&$=MLg!T!(>MYn78B@4>yt6r$xf|2KJ^d5Mu;x7-{mp;_ zCdafL=hyMeynI7k&CBuPW~@Pt6TtmPO_)^R_HubDM+1@x8 zzH86ez6nf-dr$6%Cy9>uMRz>vJrgE)>Eb=8>F>DEn=#D!e7GO`yOi2Raed|AukqV! z{LUJGu*M%6z}p%R!(D&-eTLe*sr@_;p3r$Tv)|$`QI~oArN;jX$Di44`M*}Pzft3F z!trMXTK;d>?C;e0dvN^Oy)FL_YW9z6{1Z6-8&NgK^Lfoa8;ennrwxw3x8bJ$95wq~ zH9k+vf0OvnU$ZY*;|sU^y)8H6FJ7}RS>sE${5OmL@-_R=8eg&Hzj^#ut=U(v@ikli z>$||N_qsLv`Zc~`f;}&r8ynBFOd*hcies7IGRO7#?@!!_?V>SMGjXzQ2&(-+zHU2`4zgpw3)%fc* z{*M~}XN|u-fVVZ?gJ-Tj0GDg}@c`fU#(!)4vzGtNHJy!vb-*=V4IPXOC?P9?K2gb9}b~ zp9=0?Z~dlzrg;4gn)qCCck5cd5ZpDPuRpP_fluK|GS+QkX2@&)L2!RpXK(9ys;%(| z-21b(N5Qk^x~=iJwyNC|HQUqh)_2>s#tY!?PGbyeyaI0ChpSGE`wrTav90$V@(BM>^bLgXMMn2_jOgtf+1b0}xXFE8ofF6OjoZ=h5RPen?5$_E z_QnF>=Ho9m@5gdKxp&*=f@s70#*G@o1Dp49xu0hqJ9ev==KGYHbFu9tpJko1g{t}JVvdlSbG%5U zIp52H{hsSwt^%I5e(jC5YJ5X@^HH}Mr@gUJ&A#~nKB(~(cq>Owjn+OIK2vj*)!G}o zMyvR41LCwd_O9_u;5?^ws|2d=exm2@xW=H_k#N;_Ka`k z)z)|b?z6pf@&|D1`I~E{*~aU#z3~LNoS&y_{Mj0RzQ$h~z}p(Hz>ngg*Vu0iu(db- zQR8pd_`5a!evN+~&i*(4Y;4vt_qG}zRO53D;BAcs;C^>;pDhj^)6a{_)~lRm{3QnX zw>Oq;^45DH`yW#A)_k`&R;&51J%A5ttef`LMP!Vx4De}hY+d8S;dy`HI*!m@oq@Z6 zCzG-(ZmhlF<2w2#wbq$Erk$^c{gcLGZ)@xW&we-*oc+)RK8i0V#^?r@b2_@lkErpn zH9md-Z)^0!vmd4mu<@O%#=lYH(`tNrjh`M~?T0hMn`_$MIIG6bsqym$@V3SU@JZF& zURbkzS6g*|xpaW7y>Yp=;vVv2_{7c$qg(Hz+Zy-l&r^bH@Q}XMHTf`@TTxSgQjEbh zcuN17-@*8v1kakjIKbB4c)7-3sqt59{B?MFe|x9NJFBy-z40-8YH|N-s*>s~X=1;E@&H2%K?m1%F`d`k7c&-|ByvrW>Znd@?Dol^>pXGYtxz|O}SP274m+(KN< z&Gz7CUroP3jUB^_G4F|1j(M*d-zROFV{U640PpMVZjS%Jn(x5__@G92+O{5{nr)6m z%ll1ppKhBf-=7a?-`=>R#_ufn2XF0Xf&*wNbpP5FG zhi%)MxV`z_W(BYx`#GO_Xp^$gCmvBjF&B8BFh=(j|n`P`_MobA{C)P_*fhtG;?D>b$Dna_lYm1jhK{5W@N z{J%L@J};JYCwJ}~w{!U{$vJmRQWoZE+I1L8Yuk$##mD@IQ2Y#mo4ZAQIXul)4toX@bKjwNWwYhtJ#C|$h|23E^ zuZuG%`kqOxuiCQMat@o|m*8b?i^3g$?90MEL&8^v&sFfX z;d2*!WB5F9$G!#FSYFGvcb#@eOMdbL;K@gRFucrX9Q<=$jHmrkaL+p9Uja70*OmPG zihJG3hcZ#x-OKW|D&E@v?Zj*}Hghr?Cv0te`L<2o*e3jtCf{Zz9}mC({j0Z%{V4dq z57=!cpV0I_VJ1Hw{-4#BnHm2C_)_;SJ=6ZDrhjXE_Wvw=wIj#v=5;z36XjeuU*L8rkefAz4xhQT^5Cx z`({b_M%Zn?Y-RIIUW?VXULMVTZ_#H}xbe&O!_v+03t?*;#8as1sZi8QU z?HV)Z_Ek8at&RT~*!)^&OKYu>8*lvi-KM|uvJ!k=YUh3!*!@V=%x_zO?bVI9XT_(Z zC7-3)$Q|Rqy*(G_x)GNeg9SRcMEQO-+#sK zp7;G%co+8B+6VHs8u$HI{Eg@PuW)PMe}#Lm^c`5ZweP=5?)$HB&+8!tcl~|;6}!(x zzW)l>?)$HBYu|m9+;?B$UZcYc?s$Fo6?-?__g~>&!@mCt*Y5kTaBJUxg=_a6Sh(@K zYP`F~eHT{x`!1~Hz6%TQCZ6xY!j12{u#)>etmM8AE4lB(N(_d>>YF--nglcVZ>?omk0zFIMu)Yuxu@u{$647rYzpyRq2iz8@>O z@5oB-d$N-Io-Ew>zAG#F%QgN=!MpMIU0M9)zAG!a@5)NnH-E4lB}!p+xrYT?H7om$C#pB6q0f8V8*-1lhV z*1kt8x$n`!J->X97H;i(v~c_PJzBW=`3|k*zC#Pw-*;#w_x)MPeRo!J-=CG-cWB}E z=XYJT_PjPv`L-}koUnFw>E4Q+PHb@=!_uN|!Bv*-sr`wj;C z`51p~gD7gvXD#Ya8?!aBn*I3P{UwUe;>Jin^Hus*#PqpLK8)O9|AW1Fru5= zP;hc9=WPXaZ8ui)wj$WJ>dxEB)P9^dZ7WgKoHw!Yea>HvlK76@Jbdn7y|V3DjcJWa zGp6(Gx~_@lGpqCESmgQ{!!fT7cC6ZbmX&W#zkcUfr-@tbwPh~UKO)EEYMuVp1v_8m z`m6_6cg!15`}u_Y)a5+pG}fnf+}0WQ#^5g+_a^AtGVV>mYJQT(X7G(D8Mj=&jQh*r zjN4~&x#RY`_ZHx-sBN#!ar<1ap7>jW)%-r5eX$i>U4NhJo1A%e4{i-tyS~~B+kn+_ z4Q&hd<6h7!lYvUmNcLA$Aw&B$Btkdq`GAH|Yf9^rimUY^*(i~^zaWAypC|M`De#WrheZcl- zzk5^5T_@jB>;oQI>S zXPjfeY8F4`93O#ZeDf;j_((Ku8D}rpIO^$pEV$nHI5hS2-3L~))aQ6STKX>M_$YL3 z>3ag$IO>_Jey}-d%Un$an@>5%li=!UHyLbO^|U)0oIIRkxqjN6<0;_!IH#hiXPn1? z)hvF>IX)K6_%qPUIX(_eTgLfyuyNGW_cy@xzK=&!Pv0ki)hzWno`#mb%Q-#~U0eD- z32dCEUhU)QaC6d@xjGqKpW|<$sZXogeG6<`^|U($oIIRkxqcbvx54#seg{oG<2)6t zX7N+b@o8wr_nmDy$ETxd%Q(*f8%I5Tp9!w_eHNN}`aT=1W~tBdIcVv-oa1xRwWaU# zz{XL}T%E6-qAhcE0oZ)XeS9HYJ?$<6+g3g8E(RwL=UA?v&kNg9dq1;||98RqyDvT8 zJd-YktH{k_y`;s>Z*Tle~dVE4N9 ze~9%E^{**@wEw2ETc_{ef{hXWJFvOr`@`?S`l$PyDE}43*!Cq(+lRr%$}`;~U^V9~ zV|x^?ZX3t?7})V-9sdZ{N8R!Lfm$td`y{wNw@;y|>;D9`JpO+I>t9~S&%o97f0|kz z|L4H^muJJD;p+N7OD&K83t;^{e;t$8_KR?J{hz0nXS^?i9h0_~sO6jU6BOJ11w4V; zF_@Qq*-vhr!8anJJ>Ol=hK^Tb^CpT zS|0zm!1|YS`cJsJ{{Nts$Nyho{mVIh2d=LF+tl*-zX#U8oYQ~9)%AauS}uN{+A(Dg z{{wao&DlJRt-pTyze24~*6IVWTF&ne!D{}DF+Lx`y=KEd20u=j#+KGOQb164}rl~#mg+;;Ia$i`i^7Fo+E%ya~_M**s^j*l3;N|Eu*NS6X3QgT{ z__G-K=J;z{8oVmC`n71j`&tI9o<96}j#~Oy4!j|KT!nAuZ+SFz`|#&G@_e5k3SOi+ zH?1~VWBXqLoA$(65p4T>cV8K-wh|?4vkKUD+WhW5f;g*!)$@IQb#U3I@fRS6HPE%? z`}&$-H9r~OT5x{`WuA^luAg{qYWwp0xxZtu4tO_e{k7>cgj(HPT$A;{YQ}qulCiFj zrY(LO6n=Sra*j4c*Oqr28-Z=Bp0*o<)5rToADf_Si{GY&pX-}kHbd8zJ~jv2Ry}L+ zWw3o~i?#(=-QNjGA6vrB#XVTA^;T%woFji`Cl~wkI^#H}{$9y8;CZR_(WZ|-^HXNz!|S&*b)Ej(bSKF52OAnMa}lZD{lKPe0PAmhm)V@>W*mY`j4QN$A2eq-G65^ zb^SeG+cA-`i??s(+Xm7C3e(L*x^DMS6 z*fY)AXR-aM51{z*%sQ~LTPLT3z{Uta7<@B1=UMC!xIXGWi^=z+7~8(YY5O&>v2u-e zfYr)pvBTi%wsDR+!S^=Tpmm;)gzKa3_ztC3%Nq26>uWFyOf+f zKMq`<)32kc>whe@JpRXn>vMVnn!5hqpq9t~L~wmhPeN1Ie;T!1Je}GxWe!gUJBQ|M z9>&&RKmGfu^~u_P6RehJsBeMQ%4e}t;9lEl^KH0mF^zM?{qY^JKI(~cDp^i^|E1LO z#Jdb^Jaz5grB-vyw!H$Z7XAaUeP*Bk5Uh`S&etD-{Z6aRn3q$l8DlyzuLSQ!>8tv< z3apkst_JTy$@AScV13k$_hV``&)RFLJs+(-i?64?f#OH|Pb#~0`u{1|{=Ij3&%Y6@ zrd@s$cmYbD(S8QjNBwGid~UlLtnSaCZl(6)xvhQ+Ma{g#8Q0Ij<{o|Vb?4!Y5z{vEhJ*S|+o&p!SG*tY8C@es9IVmtyiMtSW%3RjQM zW0g;NJ^m3*J^4QlHuk)nAFlBe;Mu6xp%_npeazuuYVB$JG+0gBQ`GWY+kXOkZL4d4 zl3Fcop9QOhKL@^ml6m_xSReKHJP*E{l56t?uzu?H@eH+^{+`({fpgZr2$sk87jQqt zb}v)QWBV((tFpa9El&=A1KW@7UZs|M_S)ZT;3KH*%b2#+M_>1m_HrM&pR!hOfJadB zeZaN&J6t_JZ-R|e`uqc~o_CXPfnC3qtM=M`Uhjtg6YO61_pHkpZ=-9=-2V$~9CdSl zomwq~pU>dx$@Oz^=GFGvlPjsr%(aX$8@jg4>+IlW9BOm@ zm>6owqa9q&br70*dv$NP-7w?WiTm04s ztNT0jj>+G1R7?JwBUOK4t!!p{Zy8Yz|g)4C(jF zVEap+TY&XbPrI*x?N3|$wgjtZJpNv$TH|yc805! zeeD8IU)mFQSFkqY?no_9+}**RMTxrySgnk^Cp>YrXAFCRwUuMo8?J6&yHU&S%emY~ zo#H;(ldMxXuA)Z?>%-DfP@90)eQwJG*t41Ka@+SB$Ruyc_3 z2ZPNad)0V{psB~_(8?$82le?HntF2R04E3gFor&vbM49DFtF>J_?>ccDCc1$ntFV? zDxY#5y3y2=Lk~DP*oQInF$eq8o*YJjU7y4s4X)3_;b`jd8B_U`^Kb;3dU7}toE+@K z82V&CXg3F+$Hs!2*J{Pb!M*;IV;|VH%6H50VoLVvQDEDsPh(FRa{}17+U&EJS}kLk z2zH$1JWfJWkI&@Fr(BPt(bRp<>-tXt+fLnn`l;2D`!V2hpB)RY&+l<)>WTSvuAgSVoj{Wrn-sK@79 zVE0h?DPYH(Hs1#8qn`Y~12&end}luutZrT>QOk|#_xIDmYI$#d23T#!>YdM-U^Txd z`Daqk0xv|ZZoJc|)toE;jLq3#wbQ}&;WNlNaCM(Q&ZG9@^N0Gm6g8hQ#QA+?HSgK} zoZ>>TF;50tlKVwy+RWnuYPorI<8ukPejoiVntJy4rC_!7D7jC45A5~jeM)=I`0s?|>jz-9vacV))0g)2^&_x0`?`!;p1ytzu0K0oiKZT( ztH9=yGuM2sMpM6&`EgCI0ozX9b-9k(kL#lCT8f(MBF-MX0qpqA?Rsi?Y(D{;Z{|oI z+fTvzXH0UR2h)djd~X8pSoz*aE!X#F)aGOD`>R{1Z>9Lr{`1OiomjVljS+r3csI&T z)jZq*)<@m3%WtL_+rGqU`wOtKa;@D3R`bvK<_x_XuI@PRq?V`sFTu{8KZ}@7&i8`V zyjEO0@7Xip^|R(aGst&Dn81M(xLO>GLQ>&2fpd7JmdgUzzvE!OnYm-+BT~J$vOzu_i<;QCxXho&B%KZEOQ@;sV)=I{lu?bNT~ z9ChEk1Xg#yy-4kzd4^g&^YRz))PlbPcAm0l{|eSeJ@=Pa!RqEWjM%S%hcK792W*4( zI-0tD{*78LeuLWf{)|<>zk|1@)<>H@FH@@<-}}Koz-lLh&D;CfTX6OJ@R9!$tTqE| zj5on*@qZhvmY)m$3#^ti)ARpb__~b4_V0k@;`gZaH)pT2e}nzA-uh^Bz5he)$9<^% zeTtgvElwUEfXh5SgsYi{_doxP%SZ6@sU3^;`-;>nH_FBZO%`-K75=XZEX}a z=SQ5r27~P@`)>}onz3^Z&k0vA&*8b?>aLf6PEDTcXC83<*~&b))8|7| zH#g6%`N76cn+3r2>vBOf^?bix2y8p`#90`;5M#{ylSSkdb)Wm~Yf-T0=Q#WVv;EVAIUj}ZQ z+^3d>+sCRDeYG3cKNqMi?Uo0ZafZOlI78va@qVYTcH{Wx3AJV1D}sBge4MkD;48y3 z_bbEoQO`WA0?s^W&pfOO)|MPs1DkiowmLXt(^tDW`DYrnC8ssPWln3s&1o9vlsT>q z*GD}$tphf;zmuyyIjsxUmYmiDI|sQo)(5M3Z6wbP;F&wy>tmk&Sxaq+wISHt!#4tN zRn6se;%y8c4$t?{P2k2|n_^r2^~oG)PpnPB_7}dHensrf;brVE!xP)K`sqYTZrO$Whq4?Ykq&s-b=wyo_Brk3ZPd??s^vTd|^&*`A{ zG7S6lo>f-hjMU#;%9U2uJKztx^GX>;GDKWpRobGRO` z_YLRJpYe`@cT=20+spNd|7fuHrtrhzw)dPf-Wa$(>WO&-*qH7oW6JdtA4%=+ZW+(# znO=DLyDXt3?n6K4u|Ue+r2*r{;+ntFAQJqGT%<2}|~%|*Y=k@n zacJuC`8v4%4Dk&#^?WZn9&Dd0Q*5t2IiCP_?0Kf22G(EQwK$2|k87drM2ebgAx@l= z!Nv*yCfGIKquMXu0_&shSf^8~WgMq~>tp>kntFV`1FnztR5bOxb2trbJ9YCvgF5+Z zJDqYa#r(zQ>wZ2HY);{4fz2oT{cN~C>gMA$bPl-O?{fXT2JP2A>?<+P1KUU1pAWWu zu0gpz@xK7YeXt+*g|_ce)Eu)oYjzp9zGj!BsmJFEaDDB6fTo`7?T297splEyM_~6gRYQB8 zMSl#|wlvpb#(5vo;_~u{7V0%FWdrT?5ufJ#DT9 zFIVvEz{be^{(7)J>Q`2AZU7rgn{)kBYCq1kwx3YcoNIB;j{H0|HfzVySNU3-m*?4y z;3FwngPXw4Pwtm;ee|bl{EYt`K*_Vi&0zig{m<-QHT}}&7O?j&pCkPH8gGTG*{6SZ z#cklzu-o1?-ivQXQ+G^1rEVhlUlwx_ei#9<1X+4)V8;s_T+Ro z*qnS;0XFX8KWcdwtxe5&+lJaXwzj={;Fn<6FV8yng4J@*)23$oEvaq4HMQ-X_Zi>~ z=p+0-xX

$VdDAa5eoLn>Mxd{{XnZYHvOd!hIG?KEHyi>1TUwYH9xv*zY~s{5~W% z*IU8nY8~HSV=KQG{|2s>v1(JZ{m-iQw-oJvi*2v=S-JfVu9o)N)G`;p2k(Lw{s*|f zN0zyH7_O$D`D;_t-!uFXuxE`n&l9=1-2irM)^dM0QGPvj_Wz^!o(?~mIO+c}H1+U5 zg7?NJ`8*C+)6YJ&sU@E$z+GtC{GBVg{U3m4|JM2u>+&Rue#z~dVB0uX z>ffU1<6Jp5xjy>a=P4BJpAlD_eEivtKiBc&-&vV_76hBa!qnz)D)ng;`^w+rcXo|m zTI2p3Tl$-$KO;JeVvNk6{0xeA-*;U|@p(Jz&D1t7qL@qGZG9K4U!JwKJ6?0qmihS} zSWTOG$z!_=Y)ozDDEIq=^K?1I^|6gMb94T$pqP8+SAIDqF@FHIzwjS|?IU~VM__%_ zwk^qR#iWYryLHdrhtd8(-af)AiJTyf!b|Pwu}4+lMye$TNSx0Xu)T(U$r9Em)iL_j_tT&Y$}4C~D>` zcE4OwarN~32-tozXODt2XWHWT7+9P6IWBo@e*~-9hd6uEd0my_XJv}>ItTSC6!Th* zIx(KC^oOc*;VHP9*OqbRiMuvU1=rtym$0-Ct??BLuK%h9 zx1IkkVcFh)moQxabqlV(evNNfaQ*#v3De%%f0r=azjN1rmr(A##QIr^`|e~)_Vsg> zp7(!$hO5n>crCdn)#CpGSS|O=7r|;?yZU$zzf5tj+y14Bi`}pKdv18`y+ZL^dx@e= zANRa^`g;{z_V+iq+QpTR{k={}f3H>CSnhZI)8F60_NR|FeY|GW)89Y9Wq<#KtG!kE z*x$b>>CbCMZY-}C{nOvOVEfZYn?7E1>gn&_;IhB}z}4QbeC+Q-O8WDflN;+JYW>sS z$6))@N1Hxgv+C*Zzu>aJ&){mGRzCLU%YpRgH7hrk*Q@^NZ+5u->7z{_uX*+K*A6cG z8w^+T?~m8V{^kUyKd*VYvAo{(Pk(cR?N1+V`gmrjr@wi@WqI+yO&`x3_4Kz0xa@B+xSD_eefnDhoc=s>)s)&iIPtpiu{-v>y4>w(jsXQtd(o|pQkzYW0l zr;j#$Jag64-$vlFzfIt3{`&*zZ!>WE^UReS%kx(M^!H`3{pq7kAJ1&{^tUD0GtTb` zYf^8et*~zm_DqU>8@O8D2M+_=M%{D03*T+Qp7oyV_9@pdeGUhE?j+`RaJAUC2YXJ$ z{#CeI`Wykaje7dr0c@Xs@32p~eu=pw*s~xpcY>?MzBAZsH}+k?YUy)Vux-@S=Wby8 zoKf{D*Do>m0DFBV=AK}+*!Kc^J;lB^SS@|-1GbHN`rH?6pSx2Wr(D0p+z;$EqyHS_ zwLe(@tEwF3`o#Z0uzNoK2Z8lJfMR^PKJh;U?4C`|hl15&{~Fjm7JCO+En_+iY#a5A zsS|9U2UF}*uAeb|b{z@U?sKg;&$Sz4+nnNO6H1^&=~uIT_XLbKrBzXf*XaryLGen?ZZ?_C9h1+*}-!eaOYe*FV>3FWBo;A8q=W zqk86bELbhi`+Z=wag_Ls2kVoZCV}isEMrO6Kz`6?Q(i zq&S~jQ)m8;Ax7rY?-IvVJo7ghZoBe1?`SmjJhx2&t9jq|J@e|+Q{n2F&tt*n;{4dB zTx@^(I-ic=>tMg{=%dYXs%4zpVB4PJXIqNn97a97!j5G-isSq$b;fZ5G4v_NF%3;U zYj7giw!Vw;nersK+Om|4bvoE~+VZpclfmldDo(CD5o0%spPeaLlU*vj1NE*HbKRXf zd;An)WKFD3E4X|9%z|q_yT;Egxc(OuT>pz|{E~v}|Gk3ie_6q=0RN!kncHu}9Y;C0 z-$7H)em)hfHUmG`-7%_V?oS7+WuDIftCimc&VoC4ws#KXV#lw4uE}%2UX%K0)5kef zPk-lu%l^)Xt6faH?AZ(9>CZWo8_W6AKmA<{wm*He>Ejxxr@!xl%l_@ zE8|>K`6SM@a5dxX!A{Xya=rZ&tY-UR zw7C&%`_rrTa(!&?HF#5H_xcp)`kWox0Te&`P;!0lTj4#a_p9*U)caGsRu81kwR#Kj zyhd`K-d%9@U)K1&1@~HesNnklrpA9;aQz=Exc-mV_!9-!|G9$e|9p+VP;mWUEx7)# z)%fcL*Z&^{*Z-e2{&vN4R@@4APRq06=V z>aU;n1NYTG5( zC&A{bzkb@2>r>z|*QeoX?-#lL37%Zbd3^?5TXKCCtd?B=3{I|IKXUW)+OZ$8*NyFx z>x*D>)n7mD$@L|0nd{4NHJ_KfF1o4z0yozg6x+G}ub`!&?={vBNA`6gU#Q03$G@fJ9JdhN^Y$Ln5y_lf7gzrc=Xck1$5 ze+RD3Hl7XgC2H?d8ud4#n0<@$)rG&g+f}A5481#WQ*&bI+yO&|B9diq-gT=uspT+K5q{Vfhpf9^@SvD}aP zr@tk^_NR|FecaRP>2GOp+21m7wel=l4xawp({f|EpY>0FL%{Z@k2Zb0Ce+j4ieUGU zXRT-NN^rHuRs4? zg0(4LlU{%3F4sS?*8w|!iM=jZE%x=mjyLx8!D@N0vjNyP>h{@1KO2JWGtbm={fy~3 zyisNMnOdA@>b0;PLGjZ=@r*X!r~;2J@ZlBq9yo^L*?lCnXSLd<#P*D`U)N=GxPJMa z#4p=7Mcuj4Urm2=*#d0eY5x_tKH*zdJioWN6`gN>stakl|Gj>H)TH*Vq# z2diyMNu2G#w$qk4+k>5h#Q7@R@ukfOxIXIB+z;4x02@nN+U*D~+wBC`Pd)8+20IpQ zuA97Ew+Y1d(@V*^jVaUhL z+7oOZ8S7qfeZu#yc;<>oxb{Lryky4@yyvo_ymf2d?wX=Cd2hpH$VG78hjK*TeKXI+iLv58h@n5AFc7nYy62C zf4atBsPR{7{GA&Au;Q+#_kq*k&R6*9aOcu!WUa=T|NM=YfqGem+>Aw7&qXkGkz$54BWsYwY@gcPL$1-SV8@p~zx8vle(H|h zYgR3N-wt-qm1DmHt{$H|!S%8K0!=;n-37LtdfMF$Hg-Aod*JHv`6akM_IuIP6MF{O zcIwlrvEK)_Pi-0d{or!!55VmR}1 z`_;8SLammzPlC-|+Y{9Cw0#O}TXpS^Q>%%erv4Kpah?I2SN_c1b6~Y+DIehfJhdNx z$5h*&DQez>#EJ7F*nYxa0-JN@@@23->Y1azfHOzh&F=+j^~Cur*!>S4Ljlxe`{=C`W!N$<;ocx2@k8`5!P0GJ0&WSkj z-vT?H@PC5MHGAo8us-Tp8#VtNg?$*$xM}|`_yqb5e-CcF?8AS9^-(w8JJf3Ne;-`7 z{}0^!lFtWVebm$DBd~Fd_aU`B`|M+|`%FDKd;&I(wv0)w9Ft>{XCGOozyE^Wqv4-| d-ACb{f!$|&u$n$ceGaybe%gH2QuA5s{{h1>7BBz+ literal 42488 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 diff --git a/piet-gpu/shader/pathseg.h b/piet-gpu/shader/pathseg.h index f3b2dec..749771e 100644 --- a/piet-gpu/shader/pathseg.h +++ b/piet-gpu/shader/pathseg.h @@ -2,11 +2,7 @@ // Code auto-generated by piet-gpu-derive -struct PathFillCubicRef { - uint offset; -}; - -struct PathStrokeCubicRef { +struct PathCubicRef { uint offset; }; @@ -14,22 +10,7 @@ struct PathSegRef { uint offset; }; -struct PathFillCubic { - vec2 p0; - vec2 p1; - vec2 p2; - vec2 p3; - uint path_ix; - uint trans_ix; -}; - -#define PathFillCubic_size 40 - -PathFillCubicRef PathFillCubic_index(PathFillCubicRef ref, uint index) { - return PathFillCubicRef(ref.offset + index * PathFillCubic_size); -} - -struct PathStrokeCubic { +struct PathCubic { vec2 p0; vec2 p1; vec2 p2; @@ -39,15 +20,14 @@ struct PathStrokeCubic { vec2 stroke; }; -#define PathStrokeCubic_size 48 +#define PathCubic_size 48 -PathStrokeCubicRef PathStrokeCubic_index(PathStrokeCubicRef ref, uint index) { - return PathStrokeCubicRef(ref.offset + index * PathStrokeCubic_size); +PathCubicRef PathCubic_index(PathCubicRef ref, uint index) { + return PathCubicRef(ref.offset + index * PathCubic_size); } #define PathSeg_Nop 0 -#define PathSeg_FillCubic 1 -#define PathSeg_StrokeCubic 2 +#define PathSeg_Cubic 1 #define PathSeg_size 52 PathSegRef PathSeg_index(PathSegRef ref, uint index) { @@ -59,43 +39,7 @@ struct PathSegTag { uint flags; }; -PathFillCubic PathFillCubic_read(Alloc a, PathFillCubicRef ref) { - uint ix = ref.offset >> 2; - uint raw0 = read_mem(a, ix + 0); - uint raw1 = read_mem(a, ix + 1); - uint raw2 = read_mem(a, ix + 2); - uint raw3 = read_mem(a, ix + 3); - uint raw4 = read_mem(a, ix + 4); - uint raw5 = read_mem(a, ix + 5); - uint raw6 = read_mem(a, ix + 6); - uint raw7 = read_mem(a, ix + 7); - uint raw8 = read_mem(a, ix + 8); - uint raw9 = read_mem(a, ix + 9); - PathFillCubic s; - s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1)); - s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3)); - s.p2 = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5)); - s.p3 = vec2(uintBitsToFloat(raw6), uintBitsToFloat(raw7)); - s.path_ix = raw8; - s.trans_ix = raw9; - return s; -} - -void PathFillCubic_write(Alloc a, PathFillCubicRef ref, PathFillCubic s) { - uint ix = ref.offset >> 2; - write_mem(a, ix + 0, floatBitsToUint(s.p0.x)); - write_mem(a, ix + 1, floatBitsToUint(s.p0.y)); - write_mem(a, ix + 2, floatBitsToUint(s.p1.x)); - write_mem(a, ix + 3, floatBitsToUint(s.p1.y)); - write_mem(a, ix + 4, floatBitsToUint(s.p2.x)); - write_mem(a, ix + 5, floatBitsToUint(s.p2.y)); - write_mem(a, ix + 6, floatBitsToUint(s.p3.x)); - write_mem(a, ix + 7, floatBitsToUint(s.p3.y)); - write_mem(a, ix + 8, s.path_ix); - write_mem(a, ix + 9, s.trans_ix); -} - -PathStrokeCubic PathStrokeCubic_read(Alloc a, PathStrokeCubicRef ref) { +PathCubic PathCubic_read(Alloc a, PathCubicRef ref) { uint ix = ref.offset >> 2; uint raw0 = read_mem(a, ix + 0); uint raw1 = read_mem(a, ix + 1); @@ -109,7 +53,7 @@ PathStrokeCubic PathStrokeCubic_read(Alloc a, PathStrokeCubicRef ref) { uint raw9 = read_mem(a, ix + 9); uint raw10 = read_mem(a, ix + 10); uint raw11 = read_mem(a, ix + 11); - PathStrokeCubic s; + PathCubic s; s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1)); s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3)); s.p2 = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5)); @@ -120,7 +64,7 @@ PathStrokeCubic PathStrokeCubic_read(Alloc a, PathStrokeCubicRef ref) { return s; } -void PathStrokeCubic_write(Alloc a, PathStrokeCubicRef ref, PathStrokeCubic s) { +void PathCubic_write(Alloc a, PathCubicRef ref, PathCubic s) { uint ix = ref.offset >> 2; write_mem(a, ix + 0, floatBitsToUint(s.p0.x)); write_mem(a, ix + 1, floatBitsToUint(s.p0.y)); @@ -141,25 +85,16 @@ PathSegTag PathSeg_tag(Alloc a, PathSegRef ref) { return PathSegTag(tag_and_flags & 0xffff, tag_and_flags >> 16); } -PathFillCubic PathSeg_FillCubic_read(Alloc a, PathSegRef ref) { - return PathFillCubic_read(a, PathFillCubicRef(ref.offset + 4)); -} - -PathStrokeCubic PathSeg_StrokeCubic_read(Alloc a, PathSegRef ref) { - return PathStrokeCubic_read(a, PathStrokeCubicRef(ref.offset + 4)); +PathCubic PathSeg_Cubic_read(Alloc a, PathSegRef ref) { + return PathCubic_read(a, PathCubicRef(ref.offset + 4)); } void PathSeg_Nop_write(Alloc a, PathSegRef ref) { write_mem(a, ref.offset >> 2, PathSeg_Nop); } -void PathSeg_FillCubic_write(Alloc a, PathSegRef ref, PathFillCubic s) { - write_mem(a, ref.offset >> 2, PathSeg_FillCubic); - PathFillCubic_write(a, PathFillCubicRef(ref.offset + 4), s); -} - -void PathSeg_StrokeCubic_write(Alloc a, PathSegRef ref, PathStrokeCubic s) { - write_mem(a, ref.offset >> 2, PathSeg_StrokeCubic); - PathStrokeCubic_write(a, PathStrokeCubicRef(ref.offset + 4), s); +void PathSeg_Cubic_write(Alloc a, PathSegRef ref, uint flags, PathCubic s) { + write_mem(a, ref.offset >> 2, (flags << 16) | PathSeg_Cubic); + PathCubic_write(a, PathCubicRef(ref.offset + 4), s); }