From d9d518b248402c7c98b7cc5ae014615b580e1fa3 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 12 Apr 2021 14:41:03 +0200 Subject: [PATCH] avoid non-uniform barrier control flow when exhausting memory The compute shaders have a check for the succesful completion of their preceding stage. However, consider a shader execution path like the following: void main() if (mem_error != NO_ERROR) { return; } ... malloc(...); ... barrier(); ... } and shader execution that fails to allocate memory, thereby setting mem_error to ERR_MALLOC_FAILED in malloc before reaching the barrier. If another shader execution then begins execution, its mem_eror check will make it return early and not reach the barrier. All GPU APIs require (dynamically) uniform control flow for barriers, and the above case may lead to GPU hangs in practice. Fix this issue by replacing the early exits with careful checks that don't interrupt barrier control flow. Unfortunately, it's harder to prove the soundness of the new checks, so this change also clears dynamic memory ranges in MEM_DEBUG mode when memory is exhausted. The result is that accessing memory after exhaustion triggers an error. Signed-off-by: Elias Naur --- piet-gpu/shader/backdrop.comp | 9 +++------ piet-gpu/shader/backdrop.spv | Bin 11680 -> 11824 bytes piet-gpu/shader/binning.comp | 8 ++------ piet-gpu/shader/binning.spv | Bin 15756 -> 15988 bytes piet-gpu/shader/coarse.comp | 31 ++++++++++++++----------------- piet-gpu/shader/coarse.spv | Bin 56952 -> 57588 bytes piet-gpu/shader/elements.comp | 4 ---- piet-gpu/shader/elements.spv | Bin 71052 -> 70948 bytes piet-gpu/shader/kernel4.comp | 11 ++++------- piet-gpu/shader/kernel4.spv | Bin 36004 -> 36080 bytes piet-gpu/shader/kernel4_idx.spv | Bin 36108 -> 36184 bytes piet-gpu/shader/mem.h | 19 ++++++++++++------- piet-gpu/shader/path_coarse.comp | 9 +++------ piet-gpu/shader/path_coarse.spv | Bin 42804 -> 43040 bytes piet-gpu/shader/tile_alloc.comp | 6 +----- piet-gpu/shader/tile_alloc.spv | Bin 14704 -> 14764 bytes 16 files changed, 39 insertions(+), 58 deletions(-) diff --git a/piet-gpu/shader/backdrop.comp b/piet-gpu/shader/backdrop.comp index b640d14..12ae5b1 100644 --- a/piet-gpu/shader/backdrop.comp +++ b/piet-gpu/shader/backdrop.comp @@ -35,16 +35,13 @@ shared Alloc sh_row_alloc[BACKDROP_WG]; shared uint sh_row_width[BACKDROP_WG]; void main() { - if (mem_error != NO_ERROR) { - return; - } - uint th_ix = gl_LocalInvocationID.x; uint element_ix = gl_GlobalInvocationID.x; AnnotatedRef ref = AnnotatedRef(conf.anno_alloc.offset + element_ix * Annotated_size); // Work assignment: 1 thread : 1 path element uint row_count = 0; + bool mem_ok = mem_error == NO_ERROR; if (element_ix < conf.n_elements) { AnnotatedTag tag = Annotated_tag(conf.anno_alloc, ref); switch (tag.tag) { @@ -67,7 +64,7 @@ void main() { // long as it doesn't cross the left edge. row_count = 0; } - Alloc path_alloc = new_alloc(path.tiles.offset, (path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y) * Tile_size); + Alloc path_alloc = new_alloc(path.tiles.offset, (path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y) * Tile_size, mem_ok); sh_row_alloc[th_ix] = path_alloc; } } @@ -95,7 +92,7 @@ void main() { } } uint width = sh_row_width[el_ix]; - if (width > 0) { + if (width > 0 && mem_ok) { // Process one row sequentially // Read backdrop value per tile and prefix sum it Alloc tiles_alloc = sh_row_alloc[el_ix]; diff --git a/piet-gpu/shader/backdrop.spv b/piet-gpu/shader/backdrop.spv index 26aeb4c052b79c9b0757e2c832a45712534e4db5..4b5ffdddaeb949f5a3f376ec0571653e9471436a 100644 GIT binary patch literal 11824 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

AXY0`$khO^S zrm@zh&A9wrcsKPSK8GXGyZH&*lOqu4Ux1E&T?EeiwXus=6OaDA9&S$SaI8FPe*@S# z^qEH<{ks@!{~V()`u9e#KKpkG+Qb zpY^#edH4pw+MGiiXVShdM0}1!?5q7c3bBr((UD^)*}t8B^ESh^4I}22N8ZKYrHIe5 zNbJ{f2_J)Af;h+V=s3@pf@8mYw^|w3ep%x2E;r!jIUR{QN5R_Tx48+{<{2|)HhK$U zE%wSe;M1& literal 11680 zcmZ{q36xw_5r$tfoym}35_S-XlR!cO2_z685k8+FCy|I4 zRuK^q!Ci0^H$YibL~sGbec$)pgZnOuM#b-Y^D1+vl?Qd||EucOty}lr*N-`LO+H|1 zmQBj0Wj)!0ld}BTC7X;T%cf`Dx$awa`l>^R+XII#J93EuGqSEc&X}3m)NBg6gbY<` z4IOtOA4Fy`Ui&VHiHuje_-8WO`AW>(x2oKC>ZyIJPAvCt+EgBHUr?`>>$OI;JWy*@ z``fk6RpWY+xLTvXJ~EI7Od%qzLEgh0E9>=UKf0SLRHB8U;fp2Nm+SSL+Ggg$j_Uy>D*MwYM+1~KYm3m&^Y;dbu8F<{Z_|3T= zI<0Si_;`IgWpm+!wR*ig)THNwt>#d9uwL0PY`bvfIp!FnG3VXcf#{WuMzdXMR|ih3 z4np%i(C#yyzdM@`-w}I8WrKcCj&`3mCihS7`5B*QR(3Fa$JjEF|GN*dF-bM~{*bXN zTfq1VB3_7YQK~&z1YT2VZ?tshmivs?UCIuFpHZtM-+WstloB>+v1@ zS@2V;L(SF&*4&-ReK_UiSXX;lHYbUkxX}t>#rmx;y|38E5{k{0(T;B)IUr}iHO70W;YJWZq zKfc)*tZ@_FXSq+KT+B@IVR!!<0gHp1}7;|3&&yU)U{VQcxU>mNUU)+@`+4V&XN4cws;prZRXQvZQA_)3Y+WEHY>4t@3rlo*zA$Ey%U@FU0c-b9QHz6FA{Tj$F&`p z+e$m`a^#A;ZH$k-)Yg^bQhv|VUV88CrR%o04*=|)-*mh27Ia_cFxv6rJ&3XXUc{#t zZtaTp*+g2mcn-a?UU|eAKcnE<^B6HJe=C3u{ue+s{>Kd!+A}f_rDQMefxF zH-2q_&7og?HsTZ9cU07--*2PG9vja$0(ZY6{u;3Jng4pUy>iX+n+k4EqMlK(`Sssi z`0bayy#wu>o;m$@qK(z=`sCjE82`QkJ0|?T1N6H$-hX|wxvkzSaVq-%pE%aL;~4As zDB3k@a~`?(C++k7aL;x0(FL>|3o`hyYVdk*|c!J_qlGTfg}aDsbdqP>k1Ze!0J;<~0AJ z0y{qD_ct|N&oS^G#QD4fr-33%-|cYe>Kauj#Ko|)6f+8@O-1?`;n z_jW`b+;7g{^T2*j23LPN;qK9w6Yib;O2Qrgt%N(?@14l!{eC#%-i1FT+Ny`03Nx9!ADfb&C<>z*Azf)4b-zmYZ&+nArYQIrZepLte znDl2hZm@ZE^-%TeU1 zoFVVWEr|A8iJ6(}G27YTzjNx|gZB9+@wcLHL$rAo#sAJGOu%;(N;+G0z7I z`?2Ko+{z>V9v#b1eY708ztAzygK+)9KMr>MWz^<+KY?g_ z2-#NHJ_&Z5zBR1#K=h{&?auE#l8e1VX`P>en|~$Qt?jc&)MkBA$L9*)9Yvo%4|l9~ z`}{?;kA2qn1w@;D7MtJq=+}_Qe?Qp#_o2Uz=v!N?=^KR&mG{|m@J+-!Ze6ZLZk#z> z^S2S#s?WPGU%|Zd(ceK1MjWrt7~db--AD6(7txlk`+J4mHU0qXvz@Oc?Q-97-$#7E zsX4N_cHQ#G{Ufls)3f_yxOQvt-6UU8tp6wAxrp{S+dl z+_=a+1su8k4v5^{V0{rcHHoW|E8_ee*B3SH1a_=;=kuMQE#jwvwcSE}GttxG+RW*> zdjiXGqLNtt;jzMtj)f8W+RvS5q7~Eb^$w==h%4Xv6kJ? zKGtH)u81~k5y$!>clgv%=N{mwGu`7ovFnSty^^?ekN3u|FZ#O=*s=VH;N4kgm zV%HaO`z3K{&-TZzFXosHcC7aJZFmycx%Gu@4p@6H5_22?ww6&Oz554Z*Jsb>qUGXw zX!CfFdKfbwyffMuea84Lq&?2i!Qk78kvrxPxG|o2zdsivev=yKc)2m@JIi;MJbp*i zk$(xXk-r=JQn+U}?$qIMziEv#zuXw{5$HG%%fOx$_1~!VDD=^Yk8>|C{OXu{1=t+% zTli$KHhb(jlpl$h%iQ80WA|(+ep^Sbr-0LSJQZ&4hv?JM#2yPCMQgv19Io|gVD0ZM z?$6V~=F#q*I1cS&E&5g>+N?z!a~}^*=RN_R&V3?$lswvF?q`6t$2sf+n@4-}{v@!y z*B5i04Avg}nPB%TenXxG*Jhl1q)(fB5VflxuaB$nrE56_o}P!*aBDKo{BmQ=?|$1G zb<}q%*j_|^Yrxt@sVmNqHpj;qa=$z4i=Ld0&-qV7VvaMw+Re8XEf3$b!LCQ&IwdPfSoVS@AJXNX!p#>pM#j&xy05{Mtg6>=N8yG zD@B~zn)=ZLh>!ki;a5iugJ5$+4I9APdJ$`ouSd*f4dNJE16xb*7l6(6@#4&tC2W#^k9edn@yT|$>&oEef+|@SN+}gdX zo6$b5S>Fhv%{7Z7&la%r$3DpIZN#eO_T91S82du7{fV_-0M<6jys?+s(!I3rG5$qh z`yK1N5WJnS+9T%0VD0AHik64(BCxjjy?+T~jzIu?O1 zLlz?1jp-rB<%QikE&3ccyD#W_Pk@po~^TgS> z2COYT8?S_WHuS}~Yr)#B^(wU7J#b#~aYe9Zr9uxr)s_$$!b+&{l* zZvfky^tb;taP1Eg<8RDs!P-`X(ScG;l92FY|Z*^LdzrnTfxTb8%4|gR&gC~1J6b~MxQY^qP2@}M!Oz+ z`*yH>SNk4&C;DB8kN$TTes#=!3)mdNZw0&7c(2_CHb%SWNd6AQ+|DJAvF`!9j_ApI z!P@Mlwd&Jmygj)C96h-mERS4wfukpPg5}YZ_krz+WAw$C_k-MzfHshmj+G73> zf@A)>!ScxUA#lup4_F?)`@qg)&U?}F6`V}}Tl&M`ebDA}oPK-nKG-jH}*#(3vE2GRc? z@`|ILnc&?JpIM0YINvS>cFtW9>)9Rc_+!yA-aT@EeD*+M{GJ7N{9Xy(8*Hv8qGN3< z!N$ekeUC4A)P5Y?e6Gt_dGz4~u=({lPVTvOT_+;0%`y7kMK82J1JUPi%}Hn<@1piT zM4L5=Et4zUbd`!20apS!f^o zr~SEzHft7pUi__+Yma%K4|d+@Ss5HX(-(2)g7sOS>yn4B0@mgn;y9D`buQx5i`ZBD zH3zYd1JIFUps;_c_?;VsYx6h2yzH)Hffu8XKxz_dsqg`)_>A_iC{78Kch__fUJx_ZqNkj`RImu(lQwF|Pv~6MOV}ur|+k#JmCQ zS|ZOI!P?S1Zz^IU&zs@e#_q|~{Qo()5pE66VGd(FKR2P@f_SDpKdwb?eAMt(ui(o1NPBj>#QdC(`TEk ze^yIhqOE9dFKej5Fr2n6k~d#JI5#DlwOG>J-qF_T_}Xk3e8r}TRB{YO+njSywj;c!v$thg6Pd?% z_jL8P^h|1S@{@X}4g8-ZWsbFL%do7X)!tB0@dYVT?L&^QzVAII)OpT-&m-yEwZ z+ZDd5xdY!p*;sH_TXXA&hQ)5oG4yH7-Qk;K)@9@14drs@>~ia@j`o!c+m=*nsqVGe zw>FyyPki%xt>(3OapyVqwb^#r-t>uIlk@!FC5)Q(NuC$C5~n7c1Zd7<)?}0EyO^B! ze+t<6JKlmo!6PlN5_i0i0>OpeP%JY5F(Y&-9T+35+5dEgH zO?dvFi-_4&mQc&HcL3vK{s)39^BT*rLwvM(HZRMV(cJ6L%HX@tT*S9I(+aFq&Bq}q= zD^uL|#M0-U&mw-*>>6-a^XmMa;k>Ser}Mb3ieF#x&mR~4Z>+N4T*Ysx z`0q=Xulx2Y`yEyMPB`=Nk;?t=uCm|Lhu385;gx$^mpu&TNo#5@w>B-=^emRLNBfK^ zWsgvfXlPqLz&vMoqO7Q+B@^_9(BKc zmUc9q+}X9fv8%IpJu8}5c4Hfme=9L&erHQ_$Gq|?IwLx= zl4}h9-ODNyZYn+)ocA8+eb2#~Y%jDpn+^c`9`RY422P*7hCaL|n*%?GC)K$&g3m4R zTy>sE^?B+!E@el9TX->7=2*&(fv540@5Ae|GJMls;U-u1YF*ZgzImTi4CcBF-50lb z9hhSiT$^1ErtaMx?JaGQ`-+OTqPcrH9(CDzc+{n(v$yPrm~rkyk9+V4c(biGdqTdf zx4eAQz9?l+qNQtks)|2d#h;BBdA?Hid>?yV_7a@?n5JP~rR+`g&fa*Jm9l<3SZUt= zReWF--@1wqt>VL~_$0W`S>@cR%?^N@KQCZWs~KqRt>-X5-aUmqo=dfp3N1ZT7NMo{ zUR=dn65hzVk0Y1Qw&%fI^U!;d=?g1uI?O; zr#G&)X$ALLRnvZAfgNLf`%`FHX(gJ+CSx!32<+k3_ep8>hp{jc9fo*T~= zpC9`-$uo$4FwIN*mWACu;%)^t#;xS`EZPRF<{9}8G2{bj#xk}z#%>RGY|MKH@Nil> z?-6iy>*4viBh53`vD#dNTCBnOn#Vr!>;yK?8s=#2b_T2YK8+fvr8RKAF|S>~)$4YbwM)SR2xyq@)*@8%7g{WFa5eQg^Hk9CX#d+#nR)-fKe z=9w6CodB+$>z-)pvHpo*$ErJzJ?PaM*m>@`$>7*?zGK{bF^9e3+Jo-{c6`ifU$C0* zqR6)&*m2qxu(m10+aIiMe$QCB*z+~L{|Ca2ANdXfyWeBK9Sqk;-MSw_?`7S!O{J+> zcd`3uI{l%vbdAQ}$hgA_+i^vW4~MIHS!18g8F0^i>*Ac{`WeHu%>=t9Z4LDDspR#$ zb{5#baXVgHho!d$DC)3o7AA8B~n^OwgMchaEX>c{ad$we(+Ua0^^0Q2PnF`E< zp8?hu^_NG!Gr^J1?-JKxth3OyMZPAmTAFVWoS!_O_Q=-^)@DBMu{`oE21h>6h{)H1 zt}XJlg4NP|ZE$|_-$%7az9nF7=5rs(Bi~YR;%k?TS*KY1==IbNUG zC)y+SMPT=8tm9&^YmIe$0<0FX{}s$n9^0|5Lmy)sM|;Fx3wECb|0Fog^(lCo>(g+x z$aM*rpFEeb9IubLjH^9je+C>ivfh`%tzo?DKMU4J-ShPG^j^Mmw0(}I<~|lj+%JHg zbL5n}=fl@NeE$vX9Q3`6ULLkDf+Nm4usq)XUjh%O#kuEm@@2Ss?EilUt4*O9|8jb@ zh;b#jI>uMf)E_LKp{v1aSJ56ovrgB5&!pGpJvaAP!RqF@f?n>LzeaC;?ETjKI{kGt zFYVtb?Dnzl>%p!!_&34cyW7a`x91IDebl`d@@r|vHka73&g(|7>yB7AfsGyWz8S0* z{@()ooWys|Ent1rBgU;@?^VRO4XhUD#kawZQ}?VHNq;+S7|r=;k9^+&Td!C7;&8rq zfc5oU@!o2Wyx#?z*F4^bJHcw+i`YME;r~6b{=x48r~CW+aDCL>-#?)DvZmVZrm0y| zam2X?obFk9*nSAMzA?vp!D=x_ZED{8h;1)-Uzp22-8ThM&yB^&diSH}0baQ>LKuOTKa7M z9IhVw;TPaxG{0EyU zub%5;XzDTMw_tO`+u2*caN=()(wvjr}Bj z+~=nf{51G{YBZH+XAu2=!ndKI+Y|JtA-WTs>*zDyS3Say9J@jqxd-%KVx4^M}pUaK<)9z<}@^`>$Yr%0J z-i2qhxDS5^t8Gh*TD=FZuGK%#)MHP+4|c42#A3>sy5Ha7w*{K>(B^vI1grUcOb6G1 z)AcydjkuT4wZ-pDwO})HWaPcGvdOMCUZ!gacjM__YrUSIH$a5eY!PV`>x zYxNyzYVK>X^YeFy&=5QXP z>AjqXKJ_#;=OKPC+akwm=Jy>j20Vv2*5@*MdDwObHx{;a^m6Akmfo25z9YxckEeNQ zpHSHCBi5c^V+5ZFp9hccvc2H?s5^i89yDW{OB`b-gN+sMwY}kL+I`OV0hh7Ib2tUA zk9x$|7wmc?#(r?M*vI>W9j9(>{2Q-Y!h4k_`!%haPrDxbFaP`P>D%d&3{yq(?wt?6&@6+Lq(`KHN z=+z>|8DKU4*6P2Bp9xkA`&r;Un78&B*qh*Lv4&=_^ECD%dbxNpy|KhC^p1=3wiP^w zSo-Uy-8#npv^T!zQXAOk)Ah)gz|}lEjjc^B{FfH~!I#13;uF7*x5M>O_pDq_@8w?8 zb~a7Ty(W%09pLnQl!t8v*mEf6Sca>`9JQ&r#)xe%A5U*Cd->RckE8dTKA7geUAkZV zF7+BrJBYdauJ^yQ3A|N-2h#iBH1+sC zIlIteO&xI8==!a-JZ%2Qo32-zb(f2+xpCrmq?KUzqT}_`?ws6XAE7yC?}uaM`p2BR zz_F&7b2pm0&tosWm(Qbm4^7Q|BsPxUP^)Ox-P*id+~?JW9``xk1MbgrXy$eAij8Mn z=b-&OTG++0x2@@pG_M_K?rqmOqQLIiku>A&L~s1_>0`Y6qMqipGcCsNQeelAO7N~= zV~wVd=XMQPzj%f&D7bSU1pXM!c-DJO!Q-BO9BzDVj+6WEBd+U0nrmA_(-wQ?BCs~^ z$0z8$ydUZp)6|@!IKCy-BIhT;<_!KRuh~GAF`b8F*!|*nk6bl#ruK&$d{Fa34 ze|y69zoUxZnQ;B@PPqQ}B>Z0R`ht6=X#Wb$b$fP24X-Nn_}jtNa5eX?HMb^L)58C& zV6}K>d=0GTJ=VwP_3Jci?RaY@7h5m=-CuR|-=Mkw_0gt}HCK;(-vp=mZh)(uQuvtf zCR*gP=5k|MZ~Y_Rx4`DpN1Hz0Gxf-KD>%*fZMfQPg^&5ZLyLUgGr6(6U;0PB?}E*z zk2Zb0=jxH~d*C$R_u*=H6+Y(s0WI=*&*jFthhG24_d~Gx^wFk|dqzF--3PYDzNaV9 z-%nEu`;WlZB)x!Q`uxkkWPrzzne-LcWu>TaSwtyYDC;iW8<}|KjwYxtbqW?K< zJ?%)EbC>IH?1}WhpslC*yo=*`-w%8c&1-*JJnsh-cwhPhX+G}<)5r7vFt~rgeV!go zxcXxSkLTxCaN{_?SnsdF>hb(M0#;i~(`OL1y*~Kwt!k&ucv8_)n+~AQBP|7akNQ0WcU)S(Kfu-FJb4zZwt?pFWaH@nNK=n`J`Z*-*2kQ3 zvHA41p043fw7qHiXmg!vvCe+rIW(`Cv{>h?0v}F)M1dRVXVYABBYo_l7s34t?jCwI z;p(qd@z)C;HF*hcj@#hsTTM9Ww2V*@D;GyskErs-@vZR@y<~$ kc7FQDeBJ=N&U8L+!qxS6{_^-;_bqTe&6vj09^W|s1DyW42mk;8 literal 15756 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 diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index 76d7fc6..731da97 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -56,7 +56,7 @@ void write_tile_alloc(uint el_ix, Alloc a) { sh_tile_alloc[el_ix] = a; } -Alloc read_tile_alloc(uint el_ix) { +Alloc read_tile_alloc(uint el_ix, bool mem_ok) { return sh_tile_alloc[el_ix]; } #else @@ -64,9 +64,9 @@ void write_tile_alloc(uint el_ix, Alloc a) { // No-op } -Alloc read_tile_alloc(uint el_ix) { +Alloc read_tile_alloc(uint el_ix, bool mem_ok) { // All memory. - return new_alloc(0, memory.length()*4); + return new_alloc(0, memory.length()*4, mem_ok); } #endif @@ -109,10 +109,6 @@ void write_fill(Alloc alloc, inout CmdRef cmd_ref, uint flags, Tile tile, float } void main() { - if (mem_error != NO_ERROR) { - return; - } - // Could use either linear or 2d layouts for both dispatch and // invocations within the workgroup. We'll use variables to abstract. uint width_in_bins = (conf.width_in_tiles + N_TILE_X - 1)/N_TILE_X; @@ -158,6 +154,7 @@ void main() { uint num_begin_slots = 0; uint begin_slot = 0; + bool mem_ok = mem_error == NO_ERROR; while (true) { for (uint i = 0; i < N_SLICE; i++) { sh_bitmaps[i][th_ix] = 0; @@ -172,7 +169,7 @@ void main() { uint in_ix = (conf.bin_alloc.offset >> 2) + ((partition_ix + th_ix) * N_TILE + bin_ix) * 2; count = read_mem(conf.bin_alloc, in_ix); uint offset = read_mem(conf.bin_alloc, in_ix + 1); - sh_part_elements[th_ix] = new_alloc(offset, count*BinInstance_size); + sh_part_elements[th_ix] = new_alloc(offset, count*BinInstance_size, mem_ok); } // prefix sum of counts for (uint i = 0; i < LG_N_PART_READ; i++) { @@ -196,7 +193,7 @@ void main() { } // use binary search to find element to read uint ix = rd_ix + th_ix; - if (ix >= wr_ix && ix < ready_ix) { + if (ix >= wr_ix && ix < ready_ix && mem_ok) { uint part_ix = 0; for (uint i = 0; i < LG_N_PART_READ; i++) { uint probe = part_ix + ((N_PART_READ / 2) >> i); @@ -253,7 +250,7 @@ void main() { // base relative to bin uint base = path.tiles.offset - uint(dy * stride + dx) * Tile_size; sh_tile_base[th_ix] = base; - Alloc path_alloc = new_alloc(path.tiles.offset, (path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y) * Tile_size); + Alloc path_alloc = new_alloc(path.tiles.offset, (path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y) * Tile_size, mem_ok); write_tile_alloc(th_ix, path_alloc); break; default: @@ -288,11 +285,11 @@ void main() { uint width = sh_tile_width[el_ix]; uint x = sh_tile_x0[el_ix] + seq_ix % width; uint y = sh_tile_y0[el_ix] + seq_ix / width; - bool include_tile; + bool include_tile = false; if (tag == Annotated_BeginClip || tag == Annotated_EndClip) { include_tile = true; - } else { - Tile tile = Tile_read(read_tile_alloc(el_ix), TileRef(sh_tile_base[el_ix] + (sh_tile_stride[el_ix] * y + x) * Tile_size)); + } else if (mem_ok) { + Tile tile = Tile_read(read_tile_alloc(el_ix, mem_ok), TileRef(sh_tile_base[el_ix] + (sh_tile_stride[el_ix] * y + x) * Tile_size)); // Include the path in the tile if // - the tile contains at least a segment (tile offset non-zero) // - the tile is completely covered (backdrop non-zero) @@ -311,7 +308,7 @@ void main() { // through the non-segment elements. uint slice_ix = 0; uint bitmap = sh_bitmaps[0][th_ix]; - while (true) { + while (mem_ok) { if (bitmap == 0) { slice_ix++; if (slice_ix == N_SLICE) { @@ -337,7 +334,7 @@ void main() { if (clip_zero_depth == 0) { switch (tag.tag) { case Annotated_Color: - Tile tile = Tile_read(read_tile_alloc(element_ref_ix), TileRef(sh_tile_base[element_ref_ix] + Tile tile = Tile_read(read_tile_alloc(element_ref_ix, mem_ok), TileRef(sh_tile_base[element_ref_ix] + (sh_tile_stride[element_ref_ix] * tile_y + tile_x) * Tile_size)); AnnoColor fill = Annotated_Color_read(conf.anno_alloc, ref); if (!alloc_cmd(cmd_alloc, cmd_ref, cmd_limit)) { @@ -348,7 +345,7 @@ void main() { cmd_ref.offset += 4 + CmdColor_size; break; case Annotated_Image: - tile = Tile_read(read_tile_alloc(element_ref_ix), TileRef(sh_tile_base[element_ref_ix] + tile = Tile_read(read_tile_alloc(element_ref_ix, mem_ok), TileRef(sh_tile_base[element_ref_ix] + (sh_tile_stride[element_ref_ix] * tile_y + tile_x) * Tile_size)); AnnoImage fill_img = Annotated_Image_read(conf.anno_alloc, ref); if (!alloc_cmd(cmd_alloc, cmd_ref, cmd_limit)) { @@ -359,7 +356,7 @@ void main() { cmd_ref.offset += 4 + CmdImage_size; break; case Annotated_BeginClip: - tile = Tile_read(read_tile_alloc(element_ref_ix), TileRef(sh_tile_base[element_ref_ix] + tile = Tile_read(read_tile_alloc(element_ref_ix, mem_ok), TileRef(sh_tile_base[element_ref_ix] + (sh_tile_stride[element_ref_ix] * tile_y + tile_x) * Tile_size)); if (tile.tile.offset == 0 && tile.backdrop == 0) { clip_zero_depth = clip_depth + 1; diff --git a/piet-gpu/shader/coarse.spv b/piet-gpu/shader/coarse.spv index 7d0b629ab65764bf26e6147c0dd8e4de7547947f..5570675da63893e21c5db0bbe1ee5128bd9c62b0 100644 GIT binary patch literal 57588 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 delta 19365 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 diff --git a/piet-gpu/shader/kernel4.comp b/piet-gpu/shader/kernel4.comp index 1d706a6..ea05228 100644 --- a/piet-gpu/shader/kernel4.comp +++ b/piet-gpu/shader/kernel4.comp @@ -85,10 +85,6 @@ vec4[CHUNK] fillImage(uvec2 xy, CmdImage cmd_img) { } void main() { - if (mem_error != NO_ERROR) { - return; - } - uint tile_ix = gl_WorkGroupID.y * conf.width_in_tiles + gl_WorkGroupID.x; Alloc cmd_alloc = slice_mem(conf.ptcl_alloc, tile_ix * PTCL_INITIAL_ALLOC, PTCL_INITIAL_ALLOC); CmdRef cmd_ref = CmdRef(cmd_alloc.offset); @@ -118,7 +114,8 @@ void main() { float area[CHUNK]; uint clip_depth = 0; - while (true) { + bool mem_ok = mem_error == NO_ERROR; + while (mem_ok) { uint tag = Cmd_tag(cmd_alloc, cmd_ref).tag; if (tag == Cmd_End) { break; @@ -131,7 +128,7 @@ void main() { for (uint k = 0; k < CHUNK; k++) df[k] = 1e9; TileSegRef tile_seg_ref = TileSegRef(stroke.tile_ref); do { - TileSeg seg = TileSeg_read(new_alloc(tile_seg_ref.offset, TileSeg_size), tile_seg_ref); + TileSeg seg = TileSeg_read(new_alloc(tile_seg_ref.offset, TileSeg_size, mem_ok), tile_seg_ref); vec2 line_vec = seg.vector; for (uint k = 0; k < CHUNK; k++) { vec2 dpos = xy + vec2(0.5, 0.5) - seg.origin; @@ -152,7 +149,7 @@ void main() { tile_seg_ref = TileSegRef(fill.tile_ref); // Calculate coverage based on backdrop + coverage of each line segment do { - TileSeg seg = TileSeg_read(new_alloc(tile_seg_ref.offset, TileSeg_size), tile_seg_ref); + TileSeg seg = TileSeg_read(new_alloc(tile_seg_ref.offset, TileSeg_size, mem_ok), tile_seg_ref); for (uint k = 0; k < CHUNK; k++) { vec2 my_xy = xy + vec2(chunk_offset(k)); vec2 start = seg.origin - my_xy; diff --git a/piet-gpu/shader/kernel4.spv b/piet-gpu/shader/kernel4.spv index bd14134b21b0bb358a17105629fa1d408172943f..077640e7152e374d479a96b8a0dfdd281f26c3b5 100644 GIT binary patch literal 36080 zcmb822Y{YMxwhZ1n-D?`9i)URz4w~XLhndZHk)LVEF{^u*@Pkjp@%BHD~4VLMVeGW zVgXcC>;*+^D2hlg=eoY{y*IPpf6mW2?{UuD_x(Kc%*-?M)_e(V^Q|_2RSl|!RYR*M z23L(^cr_nNRV`QzY1E_lK4|X^ruU8CV6)9P(qWORt>LH7qSgGB&DtqbI=iQ8xM{ws zdV#VS?bU}J`7rtzHFPX)NidB8*j`1#%{bVw)SeF0lw|k!tm+cCome@wvz|u+%=`6=NS30YAJYM&x~=C zI#Ab|-q$;0T;KYQ0jxh`<3{9WyCv{z^jF7Ol6u~l7OXx2Keo5Kuj_w|!yxOn%TkxI zmKzYOty&&FvvYD|d?UcUU7h3q$FSI)*Gkl7%$4Eg_|}9^pWHp}(JpS|N8_EX78-6AH|sKP|q9NkZOJS&Qr!8)Ysc{OxJ;36QGT? zSNE9bJGgQ)_xpl}@PCaB4({t_6ZWQkQ+Mx9>YO~G<9`@;y%YMo zVpxq0K~rM1Rhv*Z=hIeg3bxz9{NEN}8tv9Sd2(YW?qM~LdGlzmwuaY!jXB6YTIZnd z9L9EzJ7#=u&oq4obCzyTUAO<(8PtOrFn;%9#=jjn>&>8KF7WUD4wEv4c&|^=QrY&a}^1cQJmQ>(R})draw^*w{9X zRn4Ou>z;7>Z}@4`PtBuy>iDkXsG|)6&uhC_wJ$tvKX&XHNip`lX`iw01J2m@Z^j)p zdD^7T0iHwkKDuSbTigs)lu-;=VOOhcQ|0rewy|f<7dFlxb4-L zX59Yq$vw*PjfK%8UHdir9#UNo@AsNHVY56_eF@$B4i)j{uWq6qH)+PyV>+5y_A#+(YpZSqcuo!G zY4L9A37nISeYDoh8Jlc7@5F9sWMTc8-J96jx!sBXaco4#b{BXY=U?}fi4EI5@a8z% ztB1kUI(s{(Q0x0h3x68EPuG;5USfIglzTLuP3vdf=!0s#tGCx>$9r(Y-*v~o5yP=P z1NX4MXQ|8npC7>6su$riYu}ft%V)hB|@HeT; ze&254@51rln5yCbVT;`jKCeA*9q{J$xUE_QoPHMvm;Ej^pj~^lObcJG>EGY)3N7}P z2Jp6O6?pnx7o2`K1eg78GN4_1wb=mPR&5DSobADhGYVYB*=0bx_G-5lzI)TZfBbv3 z*!LO0+p7KG>30k`{f-Bh{Z1UvuD$9Wz}u?H@Wh!8PMl-GWt&<7xyAn1 z7XE6}f7AH?v&H^;3xA{O@2gbfJbtUi{!R;juj#*e{6A{358`4rFSl(~JG{AHc((MRZVw9dXs)4Om-oxh>mr12Wv(LJ@pfi>DRZ9Z>I>gt|2sc)V! z@!GL9=272dq7OzNOQ_s?q7Olz);Df)4C#M<_2#Hz>L0V;sye4m?TI0=7C`Uo?VLKj zHu#QyM}IDMn!%PLMpFZ_52h-iv{iT2IkL@tVDI%AtLyg=TDeaiZ{bh0@Nd>Jn$J!{ zs%PNS$Mtsh@%5>UJGZ6XcUt%l;l~}{F{68GA0r#u_-@C(*t=(3=j1)6&ZO$=?wRWD zXwKuMhJO>k3~uh-_Ucvey!|$~`Zs*sFCZ=f}vNgChF+NuxXzB4)h zkHF>p2eAoCz7(9NDL(2n_vz9t_GJg~w(1jb-;>P!8sPDb^LOHA53WYS8{ac|*iIgIMr)3*z1j;rep-*0s7C(>!RPhg zRvixa;oG^)EZUs}?&MQh+Fbp7T<#&J_Ref?{+TM$0B#*2W*)p$5~e2td`n^^nV9h^KJ z)sNe&9)0@1o3vNc;AOsh2k^FPM$z_caCx7YJ;0ael>xl1x&S_b3#jwCu*G%>Jo&w* z;nyL>cX0JJx!(zVv1n-R)qMlnw^#QM;H($C`5wZ%#{e7e9s_t=^*B6z&joXjs{3xQ zUV@M9oL=8^+NysQzVCp`d&;};GIt-q=e^UlS3|hKm-eCXGWW~2*q3kNpJ?IhwD9#> z`1%8QTeTNF^E?P#j{V>PzU|ea@N(>9TkPXo_yl-4m(RA?rw`!lBly^QFU)MQ9S_ew zxpaW7y}En=Z>z3{=lXrC*yo9QkK8f9muo=5N3#c?!fyzLWvX^(pFK_Ov0Ah0*S!C$ zm40068=Cjo(VSnlZEN86#(U?gU=RCwhI*9-YjU4^O1oTpvwd6RxoFwCtH-J}dSekj2n@8tu-u?4CbN7jwyFW^Q zx&F8{V#}ASeIEzgR=xxt`m93F_AOqD_|AO<#bX5Ad0W(%#LGFWJ5P1_N<1QbwKm)CL@l@NNQ(B+)M>jr*tTlR(DxqH_G>;J%bwKwsvB=F zYBl58)_D6IZg4Sb=r1< zZL8+E$5Lyv*nS+fn(g&fn?#+wM)SK|)-GBvTE-oX$Cm!QMmrHLxrsIlE#p>m+-Fi} z+-HFux0?Aso7#Le^FO5VZC5S2evbVd>e&?MV+`9~NNrosP0yV#P#ar)75GIpR@eVZ zYW=;&X}^kE%{I2buEuKGzew%4)onkg=8jeS4b*CBe@l(kjCX6z&C$AWW8Fp>N?8GZ zJGFhOImbJw)r@0X+iXRBFU4bRW@_69C@X@WqBiDAwDmqDwy4|xx2PSfwry+vOsysM z+?wnE-5MJsIq0Kz_Cp*M%eYjdm{5C?ndvxda@!J@#mJ+{h z(O$WGjefuF;A$!H+ZFBVtCky?c)P*XQkLVcIU8opT`ixgX8#xf(gt z-Rp9nuROG$Ut`Oib8{qEytksQh`&T!f{H9v7{mnJDjn}x_;7zhqh2d&>3l8O||!uDd_Bpf6;+ zn}^}wMzNVOoP*yOt>xZh{LWQ!zj1|I`;DvQPZYcpyWhBCH=f_PO76F|B{1&+1 zwqhR!eyQNA z->|~1{e~6pKJhzN_*vNfmKE-G)o)ng)_%t-x!XvZtZullKUMjTz|iXh5Ib%x3F;g^E+6${rMd% z-0Okg!NPCB?zgaTcd>Bu;dilcYrlX@~-PgdjRo{Whk`iZ^Y+n?Bby?t&?28ZGMBzR3~+v=xXKc6AAnFHfL z1y(bD=JYgNeSgL|2K`%LHQW0PA=lS_z74j$HlH8liTz!${$=d%!PWKm`9i)mc{0|s z;B~2uqfH;5QPdOjIdE&t=h4)&X5R;^`Mi~OKY*v5apn4Hcdz}3;xlQv7k*sp@p%#6 zx?g^Zrk?fx8Q5o8^^E7|U}I@ZtY3ibuiV?egsaErS77@qeSQsBPk+Aw+n;*+`z_d5 z+V*FDbI8N*z>Y(k^Y>X!&2^lE{r6zCX>i{i{{U9g*XKOB*k?R*^iDNj^+&MJtk!SR z?oZTzrg&)oOKrE#-uf%p822zP-$VZfR&%Z1C5HSJim{9>PTRkOZEJqK{`?c{Gp4#@ zlfOo>Z^vPK>$LwD*!IcO>tHp%4`gm?<=h;HHlJOcw|#rv`49XVYTG9Mn`r8{*K>Od ztY$l7ya84-{@c`!&)VF*OZ^_jL;L%+-P-u(>I1Mb%#-*XF~vAy{XCE8s{fq)2wkpi z3~)ZM=Yiw#d0OuIH&!?B1Zvx8%XO(8tj)uAA7WR_ya$8TGVdX9HRt^n{zJhYj$7OO z6g9^!cD|X1dg2ZP8`l_1f<4~jYpuE*Q?(#9OHeID&Ht)}`G4)yi%@ersTQU7`o9>p z*Sq1==5ldrpHY{fb{xh@{+0pXM{wurJB2*?TMnH3`FPTMuXwsrsdY_k^F z_aAk~Cigwrz8#0{tfUG0#AgGr zn&a_ZOm4glsU45Cx!Ra|6N-oSjcU7f`r86*jIzHi;p)csT~03cJl?f6RehfCEt}| zEMtpp>zMWidw-b4xaIr7)%K-iF8hO>OV&ca1K{eX)$I-h+g9B-{|K--4nGoX`%CH5?@gZu>!Ti@ z&w$G|N7X!SI^g=KpIyfp12&enh1h+@9t-xG=ChFYe~{l!YR7pvwRZdTx;74MUc$%M z+}wMfcfmc+)%7v{1h9I>JrO*zuulTp&jrMAt-8VbsHe@*VDpjnI|i(u`a+D%ekOyR z$4(UO3vne-pHk~+{Q ze!0%)qp2t61z@#vDQR~hIPDy#TtE9+lG<@DMC~|zcDn?eXOD})a&2RT>Wg)V9%PUl&oUi?5*0-ntTOzt--ptEsP{csQs*y6PP64uv*qzo0{#D567N$yBX{l%k{nmuAb+WTfu6M$7_Jxc(+kI9&7V^2lbs4 z5AC#fy8=XvEpu+J;D(WcK`)av4gsI#{o20M3a=l%%wqZAM4{#b3d&RRVV zHb(Z=6JWLME%`Sn#xl0pw%(h*3HJFTv7Uw-%W*wLEzfhpx4=FpsOLH18L;{+_NMXX zf{m$ej3=qpTqmE)z5{md*%!9?E?hlh`X1PJxi>xw)<@l#-=&N{p)=E6l^>7Xg>pc zJ+?&qIa+63yoNjGU%+z>H;(P}bG$E5YtLAI3089-nHR_VE4X@meqH;N@2Tv=82Ti}8{pQl{0B`vK5v3s$MP1MdVJmnJC-t6@4(eF zmUqD!i+vbFpXBmAu;bOwyuC`TmOefJtCjQp5Uw7dk7}QC9BiXXJ$pXW!OdD`LH{c~f-_dYhY^gRUJI==bQ)Z;U>_9@4=0GfKnFbwSY)}q*6yZ!lR zTiSB2Ed*9eyM@7-mo~?4JO2z!TiPuOR!h6Z!0At$*9hDBXJy*bZgH@4PP--GX{Rmi z{4+IeX}1*E{=%0A>l40A&ClTc@fxx$Tp#uLEC+Tx;mg-NZ9W0lM?LGc0@zsE;!7J;KI?*Qr=Hxb2evo zGNui{>dD`RU^UyP-A3TFbDnbje4fa)+&c5#7@PCX^>-8aU2yNG<@vrTy0*NpZU%M_ znmcXje{=AYv@dh81)6$%wglV9T-s)CTcN2ZPg{d+r=Iz416KF^%C&7r6`rjUGj+}e?-$6`CUps=;Y@c=`!D(l1<@%Z1M~UZs(mJ^vh0WaNxq2tK zTAr)5soDPFy8R>6_UHTd&e+UT`M$jin!5e3i%o9(JL~q=w)cH|S8V#^`OCH14NX1o z+oQp1uC@1l`E9hhqmE~7U%S^n_O%Dtxmx?&x)=4{6c6qD)OPFSVqdT^?qO^`d+Y~R z%X6!IPl~aOEl%70!L|)QpypYZ1L3ZVx;|dZ4g#xZza9*BpHMYyxt1PM>)w;}aqlGV zr{Ko5e{&$$-#I#8$7!8$9SU}wS?|NZYFTe>YGn?cZ`SK@aNd6t^9VHc#5@wLc5XdR z*ZI@%v~!$t{p@E+{2b@P)Y^_hcdfN`fVEk>j-AwFDIVI#)pqNQXFS*#S;sE0TGmlM zhGHyZi_>-j*tW^Wp}ZM5mrL#-~JL7lam2{u30uHA9e$5T8U*9o=VI&=LT*ce&66Txa(JNdB`V;NhV zwx0*vHfwhh*s;yHIRTs=Og$jOUs9lu;3$LCn>!#aJ;0^3K{;#9C&)>oUF?K6MJ znsqu2oOMdf)6vuu^9-<>b56T6;c4eM<@%NDyJ)e#=U~hF&IZfvZwxWd1805D1NWc!xVruqQpOk1=lqt7jZHfsO0$ z#xsta;p%x7xdrTXNj+n`6>KbRiG3T`ShMQ!-wxJKJ!859?3f(8bCT=l8n_Uw z6YLzbfA0dT<($x_X8WwM>tTQ18}0^YZztwg(9{$29lA6RaGV;I8&;G7fpgXNwRdt!SKd@{9dwAt6!sMT#h2irHm{@y~{!(h2K+dm4{ zU)v+pa%10)?J@A()V9&4&qLJe;>W3Temns-_tu^t-=uzu;^Ca1uI<*zkb1`U zBG_2k68ooMW6i41p`U^EQ_q-w4t7kA-8sqibDdl>b8VeD{Q~S9v)_LSR?9i0P0jXC zP}|-$vp>(FUx9NjB<8Qt)D!bJV72nO?6>f=bDVPh%5!KqIY~di$L4Ri%4`20(A2-l zSiBd!3|5;9&RG5k_cu5Bozp9DwVxE)pWy0h_IES&pW&^)TwVJ+)M{z_ zA=tL&(0kKIVE3@PKAu;Y8oIwF@?0JSSM!KAU#*d{eyy$62-mN**BaZ4?|jX_7cv;l zn8vV;K91Gj@@jJ~?y>p7*Hf!&|9~;7WiAVVGZ)YQVQ{ZQ>iRhL1;Ofh|5^y_mO=X*V2AJwA)qKKVxBoR>gT z&%Rs|tmYn0e@nrQr7eC-gWbQ{;j zCuzSaHm}!dzZqOD?X{_8O*RMTK9U$)ps6RumSDB=y>%;i+Bq+|e&zjVan9Ss+yC?MuBM#ltn(zqVUvO%4DXBloKV!D_i*$@ifc%h=+yJp^o9$8<2Y zJol?lfp4N;b?paHtEKH>;PQHMI9#o~)*b=3U3slN60V*-^6A>Ayq!+UFod-5|j?3}N_4E4SwZvyU?f0g({l3)p z=ey5^;M_wJ^9yL|iFpxNt-SYK3{N}9Dc7&O_bgH0dpu_^!%S9lCHQn|+i1)0@UH@E^YAxFW2mo&s~g97^33xZaK@W?UW=w4pXyVU4E}cCw%5}x_k}Nm^|kiCa0B&?6c5|pRNJjHwwuAm$bI1! zuv+d5@;MY^8Cz`I+4O%K_|}@wp^w|aeqTxKJK@H5oOe*mbKkfNd=qWdU4Pr(4K{{0 z&$B(yz5-TH%zMDb%s&1q*nO<7kNf>=VD@_kqq&cp8(X=}*eZLOA zgjzj)-Vbi}+5BzE191CPFVEKp;o94IHOCO`8@1+`@{aWgn(g)1ZtQW) z&zzeR?XIco>$+HHypMt%Z_ca7z-l>HwW--Yd&c$sfXr+~@$bodE-gy&Sdg+MYv_6G z-@gxDxW)@mFG6t~{(A!XyYu&eZIf|*6>R&Q2VVp0lk-5XkN)<5A4U6z#1&_3{<+^$ z6pzIzj%PUa5;eBZB`J<)X=>a1Z>6NYdG?v!V;M@?FI!{VFIV8@!NyvFI&*s%tY7}! zfJbVcv3~<@Jomo7^5o%Bu<^CoPVRNcc|AsPZnn{OE4fgAoTBY5+B`|^;h(drKS5D* zjAGYOtd>5%4Ytql?|_|G{!Zujz|T z#<+Hk9pgF_$F&}H*8XL%w(vg{T>URK&lvv*H%{LDUIDAkrRd`r|4gx8b8I}h*jW1K zne?yV5fpv2C0Bm~J1%o&JGs7z|0-C!IS?lY8-X{Ycx+5b4mPRr2GpBU%)#c=xjwuG zcCO+7F8FZpn+4bJ?H2xS!S(;J;QDjQ_s5?P?7tJQp85V0?6{n7^87Ebdh+}_SZyxF zoH%B+_`d;G%ij49Sj}@Kd3y_NE^P0dgn%2aM|AnaJBbq zANRpWl=Np#Q?Z zH@;_rZJ+z@Ft9$hcONZS+udX0?6Iw}ZBOyohLSzDZH>32-j3oP+krZJY7t_%=HdP~ z0m6r)``-izw_c`&``-kJU4Q?Z0O8jDHvz&&fLEz`^0g@3ahb2=XfZVP?6KiswYm71 zQ^%|p|0Td`*<(wB)yh4#G~8U+-Z{y|&PV^O`Lf^<`01lfA9JFf{+0)q{e1$iR_?JC z;pxwu$c<$_^iO{)gY8crZTgr~_4KzY*fAt$tAWj9_Ly9s_^%E&hI?!)Vy^*Kv;CUX zpQPA6drYp6?cGOf)pqxoID2dqwp}S6J5jR7cCPVA>Rl-AvE8V%r`9D#_JFnj{fBV( z%q9g__rL!TyZ>IwmNn1(*Mr+nxo6f#Q_r5+0IW6_KXd9B)RLo(z-rku8-vx#J+mp? zx!K+^%EgXP|E%HW;1T%gqfH;@sGk0|0;^>XTZ5ff)=;jG{-cPs4OqKtAkG@>iEUqs z$6l1I!QM6Aoq8XNYp@@6)?j;LB&XJ+3ho;0QgH3NweZ~wuK!*I*WdqkM&jQJ->>GG z?+$RsRj%2NXzE$BkzlpC_?bh;td<<^B&KA|b_T1JYql%gT-e?@$;Hk`|E$?)@Cf|$ z(WZ|%QBQw+h$-oBPq12fp6?A$f96DPEc2m%`r8+5fBIKXw!5dr+0zF)E{exNlXw%0zs;9pxV6{9?Oa-esrv<2cD9$r`NUo3V&HJ?4 z?wW|RCP!d9isEr3C2R8O8Xr#m8H#JtL7g?3PK&%vFWId+V4vE$P}Yw~&U2>kTXrjK(} zPk*O?)iQ@!VCR)Jkn5wrc|Ntay9VN{!B}h)C?4Y|S%dL4?xgObxCRrcvj%4nBWqyJ zXBS-k+?r>6XTptB=J+f$_2l?$u$nn`+&)L219vRuz&_++dA>lX_?9RBlyYyV{n|8>Fj z|6RfL|9uO8x#0T$x#0T$wS~W0aQ**TaQ$Cz;cpaN|F;UR|2r-Gy@KoiQNi^eG~c}Z zw1L}eo_+8m{LSmV6xY=I>5tLWbMO2KSZyvg*Vde?#s8;Zwd|Xpfz`@qreDBaOWV69 zavt&cW+TvPS*_Zx88-*4e+<-68P@bu@J%8liE>Yx7p0JcAUwCUrX zP)~n<1eg8&39j}^?K6z_e*vdI_k`S7?g#zT-`~LYr;j#$+*9i5@9*HUzt`Yu|EPWJ z?_c2b=bn-q>vd}V)8D_r_NR|FecY4k>F+<_vcEUsYM%G{*x%dW^yi+G8_WHufBJhD zY=8P_)5krnp8nnkm;HSRSNov$u|H1p{{Gz4a$~ul^-q8E!AD@$N1HyL6YA-2FxWkm z_nskewbk#{*aJBTg7}z%I>2o;PK8MiGKIQr)=Hg&;otR6&)oi~2`jTMV=RB6{llDu4&7IGj zXELv4;A*x%3%)Ga_DfOhU#^esy?!qT*6y`koNN1q*e;=XTtxBO{srobDPGSnrS^Kh zB5hWpc-@lgvsw#ZtLFA;+?C+Ruc z+fkgG@zmnKBUpd`Zo6Y230E`U`rDsc{C5KDKdbiN8LnpT5@Q#zx_Qo;j0R^-wC_eS zzT?-H_`9nYd=Icb+RgQz6z7m!?^SF1+16aECD&In)@vvpS5e&8=JRTbxxSX#Twh1M zFYU@)A6Rqy_P)0t+;;vB-MIV1ozqB)w*B~*E!7VIYqPY$sTzJ%jXB$oKE~DmAh23~ zt8y?{&EjDnLi6RAwCA@fhk)Hn>bZt|3T(XGi#Ei5C|o_iH#rP!TaRdm*P8uBJEGQf z&F@ldCwLx}M_kMT&Vh$6unD_b*fD`f(KP%zN_D0oO127z0W{k0q0wX#obnb#z6 zb6(AT(hXO$wC)r4m^nNeoBjKpLVxqDmORfvzlq{;110t-^89Y@RIqEV?(_T{@M&OUX!F@(546+4>YfMY>I|?s_1VOJ^f?nv-8k~I zz_wGjZ}Y2WjPt24pqxj^yU1+tg|(iTUx3?gEN#5LT~zz18`CvW(_i}~V6~j@mx9$S z9t@XkHQQbc(4O=CGO*V_^~Adz+>F;e&#usiqHjCCgDLKR&$*08AKR;64L0|QcMaHh z=Dh($ literal 36004 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 diff --git a/piet-gpu/shader/kernel4_idx.spv b/piet-gpu/shader/kernel4_idx.spv index 044367882eb8de8ba9f3a26973cf1a9891acd28a..e2aa98470ca022c5342c835515296d578fddd675 100644 GIT binary patch literal 36184 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

  • etd?^}z7oY)#ulgTnqb?ye|@%D8|?d! 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 memory.length() * 4) { - r.failed = true; + r.failed = offset + size > memory.length() * 4; + r.alloc = new_alloc(offset, size, !r.failed); + if (r.failed) { atomicMax(mem_error, ERR_MALLOC_FAILED); return r; } @@ -119,8 +122,10 @@ Alloc slice_mem(Alloc a, uint offset, uint size) { // but never written. return Alloc(0, 0); } + return Alloc(a.offset + offset, size); +#else + return Alloc(a.offset + offset); #endif - return new_alloc(a.offset + offset, size); } // alloc_write writes alloc to memory at offset bytes. diff --git a/piet-gpu/shader/path_coarse.comp b/piet-gpu/shader/path_coarse.comp index 51264bf..147c8a5 100644 --- a/piet-gpu/shader/path_coarse.comp +++ b/piet-gpu/shader/path_coarse.comp @@ -87,10 +87,6 @@ SubdivResult estimate_subdiv(vec2 p0, vec2 p1, vec2 p2, float sqrt_tol) { } void main() { - if (mem_error != NO_ERROR) { - return; - } - uint element_ix = gl_GlobalInvocationID.x; PathSegRef ref = PathSegRef(conf.pathseg_alloc.offset + element_ix * PathSeg_size); @@ -98,6 +94,7 @@ void main() { if (element_ix < conf.n_pathseg) { tag = PathSeg_tag(conf.pathseg_alloc, ref); } + bool mem_ok = mem_error == NO_ERROR; switch (tag.tag) { case PathSeg_Cubic: PathCubic cubic = PathSeg_Cubic_read(conf.pathseg_alloc, ref); @@ -135,7 +132,7 @@ void main() { 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); + Alloc path_alloc = new_alloc(path.tiles.offset, (path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y) * Tile_size, mem_ok); ivec4 bbox = ivec4(path.bbox); vec2 p0 = cubic.p0; qp0 = cubic.p0; @@ -195,7 +192,7 @@ void main() { uint n_tile_alloc = uint((x1 - x0) * (y1 - y0)); // Consider using subgroups to aggregate atomic add. MallocResult tile_alloc = malloc(n_tile_alloc * TileSeg_size); - if (tile_alloc.failed) { + if (tile_alloc.failed || !mem_ok) { return; } uint tile_offset = tile_alloc.alloc.offset; diff --git a/piet-gpu/shader/path_coarse.spv b/piet-gpu/shader/path_coarse.spv index b4cd985aaeeea5b51864b9168b1465fec8216d4d..08d61a4c18edb959915940955b08ce509c202f96 100644 GIT binary patch literal 43040 zcmai-2Y_8w*|jgsBvk3WhTeOZPJmEC?+6T&WD)|COh_gnbV3QBg7n^{iHI~2kq!n# z1e9K-NEJkS6ZoI!-m{XO^YeY*)y-aOz3+bayUW?<+%uD;ZQ3QKYc!^5%-EQ|@kZZ9 z^D}#6T9ig(rbgdpJz(H216Ll?J7ncG*IHGFSsHCkKYeD!rw?^IWkl!jks4;iJR7>& z?38{KeJySLZ(8d6A?@@!U|`399d;NnaEp$?qegX%={>Z&tD}4P$gYkd!$)@w?j1g^ zOTXz0zu_YXcaI%XI`qM#>|Z`3eQes@-7}cl4CQ`$h7KLm)!RUsj@%oKkzI#$bn3V4 z*wxnO|ASUrA6t84=Ba$!8$W`N8Gabq*tVTHV7y%;I(iP0_ic`IyJn!ByT**|riWI) zj^9tyL~Sl=&c)Eq;oV(BY~QCb7ktFzL|T2!i8iIr85;}0dwa$XKA?l1mmSkPdhFod zl{Pi`mBy~t%)ZrbKK#<3xy}!tGVYlg{osd;9^TvaKgMAq@UiW})Mczi;8S9?H5P@B z>+HsN#>P_M(OsQG{>QM`jkyGM8FNYal$bL#mV*x+-re0XqK9=JI=W{>$I$N1VPjk( zOwAa}>Z91?eH$xK@7URUK>x9Wh7aDkYbdli*Xn+z#P8Es1wPpq>`qnlGm0G^?i!6+ zZ3=haj#_;R_bM2*hP)NiJvfRSI);x&>)VX!wb47ebL1FBKJoQZV+DH-Vn?|n2s0(8 z4rlTIU*KxRC#TLZn+tE;K3rF%+UTq>X|fhW(fc&k0^4Ypu3^oYF$Xn2<-Du|ul#oH z9M&4Anx9?-+sT`Ick(Mqj{}|lLdG^L8Ma<@!{@-&_ zh9=Xt#zsZ#jVH%$Z)^tMl}pdba7=PPQ|4l(#sIiJ9m7Ws=^CFQRjsC6Zq0tSz_*om zdt*y*vkA3(eQRpxCVk2MOzEq=F%Yhgy7|cc3>wrkdC#ah@4e*I+VitCc7)sR|DGCp zuXc*_vOVoG=R1H~x%X-840eR&K2h^i=DRDr@@wWR_tP_a_%QDPjzP_Q$8m`FjGm%- z4ISFiHDnn3K7L+DBfG};Qqgju#@^Ib{Ep^1mFb^y)>W6nlx&;Bn_69I+|bpVW$0=v zO>L>B!_&n1*n|EuAA5pZ^U>DW3!L+1A9M0L9@;Z{L^VO?ukL5c{Pb;fz)N54o+;{n zMs)VVTYk+oHEwrjFH=IqIU3%x%J%>J`j(zkud`#yxCVh+w-4esL5?l^cX#|*Qy ze#+45+;3~R89fV~pW$K-7x95&4i_=EzJ`nD*>By9IoJbus-OmM2DVL)?W?$>#8upb z#Z_FkOY>aS-}z4;UJRY1Mvd+n-!ZClbmyR+?oKYx-mYPzJG+-{rQXcz5d8G*!xPNm zKiFp654JmOa=X5bBf-0j9W-S4xblA9-qbNQ?|H7Ney(9BV+wbVcQ(f|W8*k**O=bn zta(?*m}bDKCdafL=h66OUXBr0^D;r)jMb-cEO^YpqkB7gdtAb1yA!BeYuw&A1w3UR zwl{tO->z#!&*($Vt#6YfwVqq5=b-40!RMK-(WAXw@$S>~cP!}580L98+>iKtYJEND zuBCQSMpXQ|8o$2A@2c^8YW$HJe{?F|)_4*=j$$6KPGxClwl}8XP%Y=O4UYfhHSJro zPhaCRw)`ir>5ppmS!;aumjC24Xs()lo*JL8Enmja $`4S;|=hTPGj_GyaR6D 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 literal 42804 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 diff --git a/piet-gpu/shader/tile_alloc.comp b/piet-gpu/shader/tile_alloc.comp index 3a6e4ee..973ec14 100644 --- a/piet-gpu/shader/tile_alloc.comp +++ b/piet-gpu/shader/tile_alloc.comp @@ -28,10 +28,6 @@ shared uint sh_tile_count[TILE_ALLOC_WG]; shared MallocResult sh_tile_alloc; void main() { - if (mem_error != NO_ERROR) { - return; - } - uint th_ix = gl_LocalInvocationID.x; uint element_ix = gl_GlobalInvocationID.x; PathRef path_ref = PathRef(conf.tile_alloc.offset + element_ix * Path_size); @@ -86,7 +82,7 @@ void main() { } barrier(); MallocResult alloc_start = sh_tile_alloc; - if (alloc_start.failed) { + if (alloc_start.failed || mem_error != NO_ERROR) { return; } diff --git a/piet-gpu/shader/tile_alloc.spv b/piet-gpu/shader/tile_alloc.spv index 6d375bdedf491f0d7a1768645f350d5623638233..4a39f9681edd50628c16a2a020454641fdf51f1f 100644 GIT binary patch literal 14764 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 LSAXi`JHh_}jAI{$