From 326f7f0d03bd389fd4c4111945e9799310ad1d3d Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 13 Sep 2020 12:55:07 +0200 Subject: [PATCH 1/2] shader: delete more unused code and variables Signed-off-by: Elias Naur --- piet-gpu/shader/binning.comp | 4 ---- piet-gpu/shader/binning.spv | Bin 10296 -> 10136 bytes piet-gpu/shader/coarse.spv | Bin 31188 -> 30904 bytes piet-gpu/shader/kernel4.spv | Bin 20924 -> 20760 bytes piet-gpu/shader/path_coarse.comp | 18 ------------------ piet-gpu/shader/setup.h | 7 ------- piet-gpu/shader/tile_alloc.spv | Bin 8860 -> 8800 bytes piet-gpu/src/lib.rs | 6 +++--- 8 files changed, 3 insertions(+), 32 deletions(-) diff --git a/piet-gpu/shader/binning.comp b/piet-gpu/shader/binning.comp index 3ed507b..046c4fb 100644 --- a/piet-gpu/shader/binning.comp +++ b/piet-gpu/shader/binning.comp @@ -17,8 +17,6 @@ layout(set = 0, binding = 0) buffer AnnotatedBuf { layout(set = 0, binding = 1) buffer AllocBuf { uint n_elements; // paths - // Will be incremented atomically to claim tiles - uint tile_ix; uint alloc; }; @@ -42,8 +40,6 @@ shared uint bitmaps[N_SLICE][N_TILE]; shared uint count[N_SLICE][N_TILE]; shared uint sh_chunk_start[N_TILE]; -shared float sh_right_edge[N_TILE]; - void main() { uint my_n_elements = n_elements; uint my_partition = gl_WorkGroupID.x; diff --git a/piet-gpu/shader/binning.spv b/piet-gpu/shader/binning.spv index 1b31cd17a5bdb50ed09482b91dd94393ae59e5c3..98f1d4e364798db1fd712e07334f1d70f099dca0 100644 GIT binary patch literal 10136 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 literal 10296 zcmZXZ2bfjW5yvmEZ$U+D*adbiSW&SnHV|D=6vSR%9=i)XS$1*vt$-zKqUpVvd|ymrswozXn&0ofJMQ7-@{RMK|IC@0bM86kK5*F3?S^OBkZc5h z9vqV8&qmo$m@Hc_YtD7s^b@D=-dF3`eV={zG+&P<3(I}AC0(86u4;E@xue?K*4B(B=s-qqic29$_MdnnNr6U!!dclR7s?dqD76^fQf}|*>gkoQ$2y1EvwIfnFJ&WHkHPWf-p)$LPJOlB{`T60r1*sXi4!N~ z@x!w9(Y^FjBIAa|*jlC5*~mx`8rzh4Y`IpMo7Ra0MWGUFyb1C3I-{~J z)*9=I{9mUH8Jyd&Z1WFtG-q3Zr&PPAb@$aO-R+%uxArRUGuUe>+Xg#{WlqgGXIy7j z=Yr1eTDi&!2Jf2oR_D&El{-7;^1e&Vwsq|sKT4&5TNlqjAtcz7oJkS&7GKP zH8Jdi>-Jt@PpR8`hkbP2-luL4%Vq%TJvL=s;Dwdm$^x`?7NVo)elU~nvpwI3w$E%h zwegDtJodF5-9E3sdw#hayE$8dyec{I=en{)N+~*2mrqU(Lrh zWh>FMtF;A{g?;22k>59rncmZ0>6+GkKFW-abZjYm6rJundwBvb_QTU)P85+%*_XlT zT0eumm>uDm0q~Lnuaf8O%CDBsadY-8n0ck!InVn7{2WdmDz{%mr*+=I_EIt5Tj(V@ zE@f-bCIwsSJ-W8bfH3o3o{iEqwYSp1k@dryBiS6iN^6+YH%FYutRlpUmMe>2jA98GS|sLytFm9?>ca(<FXvbB>-wG1SMRMU z8w1ua-^#lfi*~M#)7Qcn*V`D!xduDre0^PaE$s1dK4I?+HqRLPiT!79?lW!k?q0;m zO)6~np5x48J+6rSG2V+`pM3Za01rv*L&52IFErm@#2*9p9hmQUwDWT9qVHK?^XWee zt>1U#JYwHF5BImWap$A0Dd#-2-Q#llm!i$%nvX5^yK@LJ<_c`%FGtLw?f#W>|6GeU z-nkfm9eM~NZ@jkqTTcHC1$Io#{VuTkYcyH!PWXGl4%~)u_W>Ovr+q(K&aviw0PXt8 zTUUD}A{Tu;1dcu)E_`VpkHC!}Ao_X=JNCraz^;{hOuuXP9Fk?rmWKUu-JYav+^dLZ zBl5iqZb|H+)Eb8!{d%v*9yp@F&QZU%ce?)FSP9qHd%^W^uPOPuz}cI83(*f0W9~=i zb$=C`^}E= zuK6*wN2w&8*IPT zso(E$YF8R;zsITHZ*gk-Jr3Ku(Qk3sW3c@eYahzn^<8>zP38@IXI+JOmd7K9@V-3@ zS0nPq`>wT(_uSryc$Uo(@i!H`@$Lm}vHQTdx7km(pxsyMH>h(P`gX)e{~c)k>d1R1 z*c?w#+dJVNM9%ZRh8)_rBIa_eIL1B*c5L+h5wK@J?fawH@{^hM!|0D8D-p-)a}IJb z2m7^-I_i8JY@KEF=-Pb(k(-6Y8px$|DkzImOX-we2;-$!{tT3$H8)*<(SJS z!HskI6r6nY@oBJQM2}1j|L8&w%BgLT1vNch+YSdB=NZwZ)#-bR9p3ZLY}u zd9eE?-rEl_P_%ES-e24nJh{(CNV)I!4D~NTi>7Af`V6iS=1&>DLqbE7nIdZA> zd4G&A@IZoBCD=P7V!SV≪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 RF@|%i=AUn8-mJ4f{s)Lt5A*;4 diff --git a/piet-gpu/shader/kernel4.spv b/piet-gpu/shader/kernel4.spv index 52ba57283c7b3865c37a2d68a59025d7b77a9d0e..6f50746197f173e9b71a494ce9a57b417b8b1eb6 100644 GIT binary patch literal 20760 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 MtljsI*!R!>0GFYBG5`Po literal 20924 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 delta 2445 zcmZ{lU2oJ?5XR58yIT}1LRGZTf|Rys@dYa&AlNEYRK#l0ii+z}jW(&&uuGze$=?`1 zfqP{l7v8ENlKlq84?^OdH{L0&ufN}VCjNWjHYf8u&&-)KXXfno#>uZv4fgkq4Wv{_ zoA`U@`rvZya5ddbDP3x`msj3xrCO?|KjE$SdqQJr^~$9-yq5Y?UnQmG9 z%roEFS|6$`bjRz{mC920{6MF_SZ6=Qr=8^d9av|n?S}t>t+LdQW$sPX^t(^&o+*&_ z7PL(zzFE!+{~qw)_|3=uLumpb5}pLp%QTV`Ok&UE4f{#ofiJ<=yI*hKQYq}R;pQ60 z+RZYzmt}4r%luG@?_j?@4gW5Ptds^b#()>mtEp!hIw(7+ivA?iRFkx$yAJ6^y z3;aci+Y4i7nUDRfuZ5-|(O!7U4 zT_f^Vu$n_#CyBhuGMUN6H_&H@bvew)bsM;RkwLh*e@sO!O%i-N z0e65+r2ZQ>+=lgIG5WT$)GS6EhYx|vhu;bR_i)ZGNN^W|hwF&L?*^-X#^FBI?O+qB zNBi#q+kSm<*u7x&;KN`?_G!+u1FmMAV=8niI;W^!`+u$6iLZQ{5qSAcjKVF-I1i8; zV}56DceJ^{BJG0Mj;L@qSj~>aLsBb0BxfEsybo+a-{dik!PWM#9Md?~k7Lrem!)PQ zdn@$cb{-^P67gH?6f2VNL-Tf@=l0zXSMw46%=gRDJOFm@QLr!G7z>}k>a*}TP`jbC z1wtIQAM7SK`*R=<--F;UNgl;M1h?3ItcZCSO+CIbkAU5$ZYLha`mq!G4zLPETOo-= zkAZFJce$kp;cDK_M3000m`LAY)^V13dKlf#96>WrJmRBpH9M6bagmN8_+WHK0Z)L{ z?Swyka@**^9^zr)iyxWrX(P`Gu=|bm2UQ-vC&5$BKZF?sgJRaRVCSqJkMk+88}-d| z%Ml8H8m#V({HJh=^%HtLV7W1#GmQQW_$t<-=A6HR&QZi?!EV-h8Z19TGyBk<1CL?n zu=?ysj8B_enqC0g(KFb%+*z=CT<%4%S}{YQhxz|PF*dve_7VP&U;fMBo|fb1;c5|o z4(zPWwE&h|;44^1ruDaf5&Ig;5B{_1d=Ah?ve&^T3H}Dy0^?=B2{uOEM<{=lwb;2n zJXBl&SzhdZ3v9L+Vgqc9`YgTm%l|g`W31mN{a!;YUY8|%4Q=FYg3Ea?!qG-4>AyZG Nmiw^ST^oLH;2&zg=d%C+ diff --git a/piet-gpu/src/lib.rs b/piet-gpu/src/lib.rs index 324df71..6177b3e 100644 --- a/piet-gpu/src/lib.rs +++ b/piet-gpu/src/lib.rs @@ -227,14 +227,14 @@ impl Renderer { &[], )?; - let bin_alloc_buf_host = device.create_buffer(12, host)?; - let bin_alloc_buf_dev = device.create_buffer(12, dev)?; + let bin_alloc_buf_host = device.create_buffer(8, host)?; + let bin_alloc_buf_dev = device.create_buffer(8, dev)?; // TODO: constants let bin_alloc_start = ((n_paths + 255) & !255) * 8; device.write_buffer( &bin_alloc_buf_host, - &[n_paths as u32, 0, bin_alloc_start as u32], + &[n_paths as u32, bin_alloc_start as u32], )?; let bin_code = include_bytes!("../shader/binning.spv"); let bin_pipeline = device.create_simple_compute_pipeline(bin_code, 3, 0)?; From ac3ac3ddff777ad4fd0ebcf9243137891fe29c0f Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 13 Sep 2020 12:58:47 +0200 Subject: [PATCH 2/2] shader: introduce a crude setting for adjusting the maximum workgroup size Both the Vulkan and OpenGL ES spec allow implementations to limit workgroups to 128 threads. Add a LG_WG_FACTOR setting for easy switching between 128 and 256 threads, with 256 being kept as the default setting. Manually tested that LG_WG_FACTOR = 0 (128 threads) works as expected. Signed-off-by: Elias Naur --- piet-gpu/shader/backdrop.comp | 2 +- piet-gpu/shader/coarse.comp | 2 +- piet-gpu/shader/elements.spv | Bin 52964 -> 52988 bytes piet-gpu/shader/setup.h | 9 +++++++-- piet-gpu/shader/tile_alloc.comp | 2 +- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/piet-gpu/shader/backdrop.comp b/piet-gpu/shader/backdrop.comp index afe4d62..beba683 100644 --- a/piet-gpu/shader/backdrop.comp +++ b/piet-gpu/shader/backdrop.comp @@ -15,7 +15,7 @@ #include "setup.h" -#define LG_BACKDROP_WG 8 +#define LG_BACKDROP_WG (7 + LG_WG_FACTOR) #define BACKDROP_WG (1 << LG_BACKDROP_WG) layout(local_size_x = BACKDROP_WG, local_size_y = 1) in; diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index 56b3c07..57cbc8b 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -41,7 +41,7 @@ layout(set = 0, binding = 4) buffer PtclBuf { #include "tile.h" #include "ptcl.h" -#define LG_N_PART_READ 8 +#define LG_N_PART_READ (7 + LG_WG_FACTOR) #define N_PART_READ (1 << LG_N_PART_READ) shared uint sh_elements[N_TILE]; diff --git a/piet-gpu/shader/elements.spv b/piet-gpu/shader/elements.spv index 5bd0650bf9e65af7056d2d68ac333bd7d2dc744a..54c5cc0f645353bfc360465a3037aa6a2ef29745 100644 GIT binary patch delta 982 zcmZ9K%}Z2K7{=f0ovTK=7}||SkOXN$;6_9gLTK$jAToj0z@#EYM8ZfoD@BCCh3TYy zX_7XL*UWDrZPBt_+n`;m_6Gf)%RT7GaJbLMd*1V$_ss92e_HhG{i>!KGtX-IeJj`h zX~?~-H5-2XsDE@|&;m=?JNQU?H2u&l;wu;U2l!wno5ha&wF*D55NVX`?4qKKrnPFhXzRYb@0a7A={(lb*; z$APAZj*r0=(Q)-tJjdlLp7>cu-#vjNu2s75`+RU`kGXLl`xv=Bg3RFf{g zn`qMGBKr(hlfQ8jan-m(wxUUYLD^!tNpFLtouBj$T>AM*@4}@ko~A19CcO`Klhz+f zT;4O19Dn+a delta 1011 zcmZ9KTT4`76o%J0j!lHYTvrH5P$2}}h=f7)2l@vxfyRJoND)ym70#6rfppPfI%jq? z+a0E|Agzo3LAOD7U3C)$1wGGZzET-B`#r30?e|-2em9F>o5k*8NAH@5LX`P^nD73! zq24S?@Wa)K>Y<37&#dD2;Ul%tQS97*u);6JV|aCJY<#F)WY5exlAv%HO%cmr<4#HR`o zMob(SMoj!9+=z+W&v=RJ8&AH63*IY5wr@wXzutpz5u<@v0bd56Sw5tUk9sw22ZxNo8_qIh6CEq!70pJV2u1j zE>Uh%y*pqvLpUwD-Xz{#up#xFoP2;!lPPAw=XrZZ?-%M`0{@KZ9|zahA0q99deouH z2gtaUBagrbc&qEX1hsVcIk4ISHR%iq{32(q@3I4_8 zdM60>7Hmk*`FE42CA^ScI#k>*_6LA8Y-?e*rnX Bmze+n diff --git a/piet-gpu/shader/setup.h b/piet-gpu/shader/setup.h index 6c778ca..6bdde03 100644 --- a/piet-gpu/shader/setup.h +++ b/piet-gpu/shader/setup.h @@ -3,6 +3,11 @@ // Much of this will be made dynamic in various ways, but for now it's easiest // to hardcode and keep all in one place. +// A LG_WG_FACTOR of n scales workgroup sizes by 2^n. Use 0 for a +// maximum workgroup size of 128, or 1 for a maximum size of 256. +#define LG_WG_FACTOR 1 +#define WG_FACTOR (1<