From db59b5d5708918c250a7de0536ea3fce034eab47 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Thu, 18 Mar 2021 12:47:14 +0100 Subject: [PATCH] coarse,kernel4: make stroke, (non-zero) fill, solid separate commands Before this change, every command (FillColor, FillImage, BeginClip) had (or would need) stroke, (non-zero) fill and solid variants. This change adds a command for each fill mode and their parameters, reducing code duplication and adds support for stroked FillImage and BeginClip as a side-effect. The rest of the pipeline doesn't yet support Stroked FillImage and BeginClip. That's a follow-up change. Since each command includes a tag, this change adds an extra word for each fill and stroke. That waste is also addressed in a follow-up. Updates #70 Signed-off-by: Elias Naur --- piet-gpu-types/src/ptcl.rs | 39 ++--- piet-gpu/shader/coarse.comp | 48 +++--- piet-gpu/shader/coarse.spv | Bin 58832 -> 54164 bytes piet-gpu/shader/kernel4.comp | 126 +++++++--------- piet-gpu/shader/kernel4.spv | Bin 46560 -> 37712 bytes piet-gpu/shader/ptcl.h | 280 ++++++++++------------------------- 6 files changed, 169 insertions(+), 324 deletions(-) diff --git a/piet-gpu-types/src/ptcl.rs b/piet-gpu-types/src/ptcl.rs index b35b9bf..41cebc7 100644 --- a/piet-gpu-types/src/ptcl.rs +++ b/piet-gpu-types/src/ptcl.rs @@ -8,54 +8,35 @@ piet_gpu! { // references. tile_ref: u32, half_width: f32, - rgba_color: u32, } struct CmdFill { // As above, really Ref tile_ref: u32, backdrop: i32, + } + struct CmdColor { rgba_color: u32, } - struct CmdFillImage { - // As above, really Ref - tile_ref: u32, - backdrop: i32, + struct CmdImage { index: u32, offset: [i16; 2], } - struct CmdBeginClip { - tile_ref: u32, - backdrop: i32, - } - // This is mostly here for expedience and can always be optimized - // out for pure clips, but will be useful for blend groups. - struct CmdBeginSolidClip { + struct CmdAlpha { alpha: f32, } - struct CmdEndClip { - // This will be 1.0 for clips, but we can imagine blend groups. - alpha: f32, - } - struct CmdSolid { - rgba_color: u32, - } - struct CmdSolidImage { - index: u32, - offset: [i16; 2], - } struct CmdJump { new_ref: u32, } enum Cmd { End, Fill(CmdFill), - FillImage(CmdFillImage), - BeginClip(CmdBeginClip), - BeginSolidClip(CmdBeginSolidClip), - EndClip(CmdEndClip), Stroke(CmdStroke), - Solid(CmdSolid), - SolidImage(CmdSolidImage), + Solid, + Alpha(CmdAlpha), + Color(CmdColor), + Image(CmdImage), + BeginClip, + EndClip, Jump(CmdJump), } } diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index fb7f448..0e37985 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -70,6 +70,9 @@ Alloc read_tile_alloc(uint el_ix) { } #endif +// The maximum number of commands per annotated element. +#define ANNO_COMMANDS 2 + // Perhaps cmd_alloc should be a global? This is a style question. bool alloc_cmd(inout Alloc cmd_alloc, inout CmdRef cmd_ref, inout uint cmd_limit) { if (cmd_ref.offset < cmd_limit) { @@ -83,7 +86,8 @@ bool alloc_cmd(inout Alloc cmd_alloc, inout CmdRef cmd_ref, inout uint cmd_limit Cmd_Jump_write(cmd_alloc, cmd_ref, jump); cmd_alloc = new_cmd.alloc; cmd_ref = CmdRef(cmd_alloc.offset); - cmd_limit = cmd_alloc.offset + PTCL_INITIAL_ALLOC - 2 * Cmd_size; + // Reserve space for the maximum number of commands and a potential jump. + cmd_limit = cmd_alloc.offset + PTCL_INITIAL_ALLOC - (ANNO_COMMANDS + 1) * Cmd_size; return true; } @@ -110,7 +114,8 @@ void main() { uint this_tile_ix = (bin_tile_y + tile_y) * conf.width_in_tiles + bin_tile_x + tile_x; Alloc cmd_alloc = slice_mem(conf.ptcl_alloc, this_tile_ix * PTCL_INITIAL_ALLOC, PTCL_INITIAL_ALLOC); CmdRef cmd_ref = CmdRef(cmd_alloc.offset); - uint cmd_limit = cmd_ref.offset + PTCL_INITIAL_ALLOC - 2 * Cmd_size; + // Reserve space for the maximum number of commands and a potential jump. + uint cmd_limit = cmd_ref.offset + PTCL_INITIAL_ALLOC - (ANNO_COMMANDS + 1) * Cmd_size; // The nesting depth of the clip stack uint clip_depth = 0; // State for the "clip zero" optimization. If it's nonzero, then we are @@ -320,19 +325,19 @@ void main() { CmdFill cmd_fill; cmd_fill.tile_ref = tile.tile.offset; cmd_fill.backdrop = tile.backdrop; - cmd_fill.rgba_color = fill.rgba_color; Cmd_Fill_write(cmd_alloc, cmd_ref, cmd_fill); } else { - Cmd_Solid_write(cmd_alloc, cmd_ref, CmdSolid(fill.rgba_color)); + Cmd_Solid_write(cmd_alloc, cmd_ref); } } else { CmdStroke cmd_stroke; cmd_stroke.tile_ref = tile.tile.offset; cmd_stroke.half_width = 0.5 * fill.linewidth; - cmd_stroke.rgba_color = fill.rgba_color; Cmd_Stroke_write(cmd_alloc, cmd_ref, cmd_stroke); } cmd_ref.offset += Cmd_size; + Cmd_Color_write(cmd_alloc, cmd_ref, CmdColor(fill.rgba_color)); + cmd_ref.offset += Cmd_size; break; case Annotated_FillImage: tile = Tile_read(read_tile_alloc(element_ref_ix), TileRef(sh_tile_base[element_ref_ix] @@ -342,19 +347,16 @@ void main() { break; } if (tile.tile.offset != 0) { - CmdFillImage cmd_fill_img; - cmd_fill_img.tile_ref = tile.tile.offset; - cmd_fill_img.backdrop = tile.backdrop; - cmd_fill_img.index = fill_img.index; - cmd_fill_img.offset = fill_img.offset; - Cmd_FillImage_write(cmd_alloc, cmd_ref, cmd_fill_img); + CmdFill cmd_fill; + cmd_fill.tile_ref = tile.tile.offset; + cmd_fill.backdrop = tile.backdrop; + Cmd_Fill_write(cmd_alloc, cmd_ref, cmd_fill); } else { - CmdSolidImage cmd_solid_img; - cmd_solid_img.index = fill_img.index; - cmd_solid_img.offset = fill_img.offset; - Cmd_SolidImage_write(cmd_alloc, cmd_ref, cmd_solid_img); + Cmd_Solid_write(cmd_alloc, cmd_ref); } cmd_ref.offset += Cmd_size; + Cmd_Image_write(cmd_alloc, cmd_ref, CmdImage(fill_img.index, fill_img.offset)); + cmd_ref.offset += Cmd_size; break; case Annotated_BeginClip: tile = Tile_read(read_tile_alloc(element_ref_ix), TileRef(sh_tile_base[element_ref_ix] @@ -368,16 +370,18 @@ void main() { break; } if (tile.tile.offset != 0) { - CmdBeginClip cmd_begin_clip; - cmd_begin_clip.tile_ref = tile.tile.offset; - cmd_begin_clip.backdrop = tile.backdrop; - Cmd_BeginClip_write(cmd_alloc, cmd_ref, cmd_begin_clip); + CmdFill cmd_fill; + cmd_fill.tile_ref = tile.tile.offset; + cmd_fill.backdrop = tile.backdrop; + Cmd_Fill_write(cmd_alloc, cmd_ref, cmd_fill); } else { // TODO: here is where a bunch of optimization magic should happen float alpha = tile.backdrop == 0 ? 0.0 : 1.0; - Cmd_BeginSolidClip_write(cmd_alloc, cmd_ref, CmdBeginSolidClip(alpha)); + Cmd_Alpha_write(cmd_alloc, cmd_ref, CmdAlpha(alpha)); } cmd_ref.offset += Cmd_size; + Cmd_BeginClip_write(cmd_alloc, cmd_ref); + cmd_ref.offset += Cmd_size; if (clip_depth < 32) { clip_one_mask &= ~(1 << clip_depth); } @@ -390,7 +394,9 @@ void main() { if (!alloc_cmd(cmd_alloc, cmd_ref, cmd_limit)) { break; } - Cmd_EndClip_write(cmd_alloc, cmd_ref, CmdEndClip(1.0)); + Cmd_Solid_write(cmd_alloc, cmd_ref); + cmd_ref.offset += Cmd_size; + Cmd_EndClip_write(cmd_alloc, cmd_ref); cmd_ref.offset += Cmd_size; } break; diff --git a/piet-gpu/shader/coarse.spv b/piet-gpu/shader/coarse.spv index 09bad9657c6f46ed418dcae42c4c588bd7df160d..9cc6cc6d3f7ee26532b557fd6f74627b6a7ffd7d 100644 GIT binary patch literal 54164 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 2) + gl_LocalInvocationID.x + TILE_WIDTH_PX * gl_LocalInvocationID.y; @@ -251,21 +243,7 @@ void main() { blend_sp--; for (uint k = 0; k < CHUNK; k++) { vec4 rgba = unpacksRGB(blend_stack[blend_slot][k]); - rgb[k] = mix(rgba.rgb, rgb[k], end_clip.alpha * rgba.a); - } - break; - case Cmd_Solid: - CmdSolid solid = Cmd_Solid_read(cmd_alloc, cmd_ref); - fg_rgba = unpacksRGB(solid.rgba_color); - for (uint k = 0; k < CHUNK; k++) { - rgb[k] = mix(rgb[k], fg_rgba.rgb, mask[k] * fg_rgba.a); - } - break; - case Cmd_SolidImage: - CmdSolidImage solid_img = Cmd_SolidImage_read(cmd_alloc, cmd_ref); - rgba = fillImage(xy_uint, solid_img); - for (uint k = 0; k < CHUNK; k++) { - rgb[k] = mix(rgb[k], rgba[k].rgb, mask[k] * rgba[k].a); + rgb[k] = mix(rgba.rgb, rgb[k], area[k] * rgba.a); } break; case Cmd_Jump: diff --git a/piet-gpu/shader/kernel4.spv b/piet-gpu/shader/kernel4.spv index ebd48114e7562f22ba646b181c3197ab873e6d6d..91e54ddfff9844a1350488c066010c6c7398e303 100644 GIT binary patch literal 37712 zcmb822Y_8wxwdzhN$8>XVgP9Zp?4{vg-$3^g<+CRl7Y!gm`p)+bL5!yL&ZkJXclyfif>{3ll@zB9w(G z$c>n7#1PLSNINmc?%o(iZ(r|>-tI|#{Zl)Rn$g+QJ*m5^ANzdT$L_V)*xh&Rm@sWx z$Mk_?d%8M$x_i4iCU*CCO&I8&*)=;(?bqEqp=ZX#(qTA}%5lo)VGLt>dio|%k6Pjfk^kNK*l;RAg$CQRv=+BJ2J z=>z>UCJd}I#=)*LWBq!xj&(`=(w}@O_?&spU#$o~y1#p%>%WcDoVab5Yl*e|kXUWi z3h~d%7ol{P^0c)r>_k?&?G0v{!2w zr&y!4;M-4~xbHxJ-;rJWbWMUb)YP*iuI`*K^t~TTpx0|sRu09K| zeLi-Gb%#Ut?7_6p7!LtAyG^l&-K*nilQB*JH^;b8)m_K(T>RL{&yMIg+A4-TJ0_Q~ z*)e9$&;fp@?}}9n-z{e+b!_`zb}tQ)kB+L$G@x0^p;e2=<|9_s^ zoWTw`_s*q#_Vsz-=Dwc0x=`ImosJ1T-P1b8&zR%`n)|lBx&Rx`h(}VvhgX+T5A;pn zXY6)s%$&60mMCr2rD)tQz$2E0x=tMWT|+&icN%xZhUe`5zF7M; z$2p?90Y2Mn=A?}n7VX=s>#4m*QNb6e?xLQ=dD+-YYs{Rn!IpFG{tb;xtTVHFgXX;2 zsypyM=GbPeJHZn;U%IDGCRSVZ6?pRWb+G4weSU+wT<=HWdvs0h>nD!)PPqq9kR9=h zKCITe`ukmWyoWdZU3dH&G3@(sxQG2cMLn&vzteMD{!9yhwT1t-g}>Fp-yXu-s(0X? zo5r4t0hWEW4dHFoJn(KV0{Sih?(aN$J(@Q7LPLDpt3_J)VoiS^u^RqMw%C^*!rQ9l z;LYoITeT`U{jLcv`(1lTyY^~y3tzA4KfB)zTkIPT;ceAs@btSKIQ{MfF8keONW1oG zw;{Z(+7q5Q`+*bZKyVr7kRk2bt3z9ON7H}y_{X={Cl29l)g*ZOJsO;Tj|Z3io;0Lg zdv(eX-d3FsPn`3>iE|;ijC1jjcJ0-rLwH+t1-u!D^Bv4RxTCXoV#l2OGw1P;Htp4o zE&RR~{%hns z`@$`J(Wd{#iN9oved!^b^B&&ZFY`3se@yP_*u8H;XU{IZGpPo;`+9fTp&6^K+791b z7k3yEr@b22!uM_A`wihEssrKEr!;SVe#HOz*-Sb?%04lg3AV zUZZt5utuAv&1a%1UEPzX49qbmUOTqNJnBV^J{)~Kp|ZBoN1#s|n9vhL`k!09IjWdu zk9i(!oxQz%F(lT!=mY(oz0+%h&q{C3&c${!d?DgJU(I6zIkI*w|59tV`4`w{k&M-x zzK>R}-!PI;^0``gJKPw}=R4ld!H+q%V@7xH06ompc&Etvj_v6i|6fin$Fq3D-?0s^ zmI9CO>EfzAeHxEf4Q=T{YtCVKwG3M0>5+%Srq*69i&lhs-xj{R3JxF2{073%{&|Up|BnudaeO-oNr;pqaC_>WgU2@w8VrfhSH& zKHIAM;C>iztj`vHFM>OH1=ftwUi}X4vvBxp@N%5558-Xq8}Q_SY0aMBFmTzfy@iix z;d2k+ZPk46%w42B{;jRVOtG+G%t0$&^p&m;PKlQd`x{^ z8z-LHd|&Q*9Ms^QepGF=>wu51@p$lr8h3#w)_4lo#M#d^;N;=%*|@!WM4#F3Y1*qt z;bmSPAHv(JCyTbvfy-Ggf3 zt=b8mSo>>hURMVA5J)W6uciGVE&Q`Xcw03Q-i+5?9XG_*UY!Ro`@X#Jy}8Br))szG z3%_p&Z>t`Hr{5>QWj+Uo__kLsxA0enaLzq=^BTzWpV<3$y_O#pzGKPHBk104#(jU~hNYQz zp99RJ^L8El*`K*{9CG(Z=`YuxW{ueLWoqAfnV44!HxoETPw$yUl>Zg52>a^Vn zY+JRZ=zA=+{hB++vNN^5>c-oJTFrR2HQt`oiMJQncxu|lQ712ZgXOl>Py7DVX?pWuqLu;W%U|7TH~uV(&7G~Vy3Mc2=pAIpaxt~B)jf|csj<5LS5xcXPSO4aYBk%~{@NO=X}^xzajV<@rkXoe{conW zt-Ab{nwyig;I_S$G7n{W_-)k2R&!3bQ>z)rwzhFE-c9i^=Ka+6;q@T)2f)K9pJL`C zsUM{1`w+FhYAayN{cc72@_yxbEb96{M(td*ZCUfjYfbw%Yiyg$XBODL!w1108QXJU z^Sfp}wigTA8{p(_S%NrL_nv)?s=4bU-?ZlLSNT>oH$U<{YQ7CTeIJ3gaBc6e?PF_x zTFuAR{PLQ+S2LGe&_4QT4!;}jTw?zK?)bxpL)?4ei^GS*9pAEG=XZ9^SE~70wZHRN zyKe8^+7N7>jc5Cf;B?o}T^qU25o+2usd2eB+oSmzBjec`Es-*mWIO8ibl`~BUk&h|SAu9gzN zv(dhA^)lNg-Z^l!lx4WfKMglGq;bfB+{m@(~r{dukR`OrPFB2RNZ?}^Kz{r^{N>$8<@?Ds8d{%dIVBlr1A&3w3j-+`3- z?_G^-DBJ(1_O-8!)8{eAX?xp^gnPbvZCn-X9=erc`_tAyEnM1PT3~>RQMW4_U@T@7s8juV{Ojvv#4)@mwg)l;YN%( zF%KXQk8OI^#*SfME(*@qG069Wt9gBKuAc!rCiV3B8rbJ?bLSrL+0?_m=e5G;Q}gFF zX%_k>j13v@=HYPujbbxn82@z~tmWQEeOFd;-;;$~4O71(elKbAQW9(ZbD-@6p1|zwgn)t$mLc?(>rG z(!y=;yR>lI`z|fqXI|f>gnH-3%>=s@6*DK@4K{ce17~bSZxse4$l~`fj!>C zU)%2}YTm2FA5_B{Sj~QX&iy0BXPjBIOFwVa`WSk3EN{boKDit0=ZyIM6;0b2#BzLp z1KU1FQK=!eN<}v(j_dor_-ly$P>^<5(H)o~%+}Q?SliGW`e%kf( z-mlFZ7=Jie&G?zq2sHI^jPo$`xxs3-Z`}LA$>Dt9c`1WM`}yJO@mT=uXP8-q&w^;` z@mUDmy4DM$sVBFKfJai)vp$Q0jiqfIbGnH>76Us5ZI0RJ6E){|6ZR#*YSZ9n!IuQ9 z>FcwLT$Si>JE=QP zxzEwhvr=f4ryew?TN_Te}-q4sbb`fN;5a~$H#XH#%;;x%V8c7NGs`AwU#p9XIQR?nQb2Dj#O8#MJ3Xya$AZNX}3GX~t6r|q;;GKcNK z&LQW?4q!hYsOLP{5o|kc>1!vjy64SU`W_3mfAwfPgP+4@IlK1T1x;UV{^Z$rTf2gt zueQB76Z}lK8(7`q!H~#)b8hax-O=5Du7UecZX4G+Yh|5zjss_{d=A?Oz86K^_VT?c zw)Z@8t*z63U$E_yll{PI-p6dOP0jW>H%Ha{Gt|bj_FO%H`ap_@{s+}|YxmrX==+29 zvz^#+c#Zfh*lVtR9s-tY^ICftxSgWyP-?l?mcy}ifG1MhMqBP1hl90w*v`*8YMFN@ zSnW>M%5!EsSZxsOxiS&#;kdO;pr|=+vGdD3)Dw3S*to`+M(y!FZ~E2cuJvSU*L?~# z|5e@mUpw^?)I3&HM^bxE^-z1wnM!Srda3={NguW2Fi!F}9i062gXPKJ3~=%{0G6A- z(Zrew?xnVkHgk0pwYvCd>Ot(z_ZYDKTD#uIQ6Eq7(0)Q~w@yAz1REpQuam%Pxi-s> zr5MZD;84eVT!YyEDAtDj!Cy8~=nb?0;wwOYn_C)hFO z9&;C1&HIecQN9cNGF;t$-NRo28)p_az6ry6>R>) zzXsO-vO4DdV13l%^L239=7E~0&4X}#)X%BoJOnnDwgtE?_NF+_ z`>3_s=LqbNfX!L>qczVwAA@_2tLtO@$HD3u_cy^AxArIC_H!X)bRC}r>!Y4Fv%uyf zYdZ+mPkjMKW}I($!D_iCX;UlD8~3>Vok{=S0lRP4=6p1!=k<5t>h|yXEw{bb8~eAmz4wyuf%VD0 zcTK(zSI_6vAAr>cv3dWKpG!HPVmxd6dX{<+AN%@YZL{_qf1dhB6c6n`uI<*z#ZSP- z$T|K3SnXEY*suIKim~ihoVG84ZJTxYDflQ#u1&7n%W(Bm>%IFku-clG#CZi=#`!ti z^;Fl#IKKd^yLaTj1RF~|=fJPPIR~`o9LV^7jrJnNahp52ZOn~%a(>ns*Q;R1m3{IX zuv+$sHnlSM=1D${+IUl_jpwt&@4o_zmho?DqR7u>D%Q2i~N9i{hdEFSXq|^L!g@jO>BGg4MDI=?`Q?>+q~d8T+Dtmb$;SLMe054Gd5HoqTIe?;-n{y}ZGPJeT? z|JU=q4NcwnzIT?3+o><4ZJsHH!+oaEN1HyrhgLTqXJDHL>=?EAPFkL4ih034Q#9UP zgY}_Vr7rfJ^(^%!N$nmSp=+>y(3?MVk~2ev+j$5 z7iT#3Z#?(L;%MseS)%qS@6}79sb>sJfgMAh0hR`N*FP&39T&cW5e#w>HT23$QpYl3Z8`g{tmo_wqYww-#kwZUFj zEz#CN+Z%52TI?7{qvcv`9NX#Vc>Ott_Kam+u-YK)vJcjStH)>k+NT`v259OJGVhVJ z-4JX$bwB%UOzq))Oxs2jHTR)7Yp^NU{?pfH;MV+Yj;5YDZvj@bWUaRZ8%vw-SY3-x zgR`FH*tbI0mUvr()hs^enZs?s#?)rs{CSXC#yJM;ILo|kr@ipm9_%`oK0CnG6K6-T zu}hzw;Oe=zjs?4(qbc@b41E$~XK?FSc0p5*&#vIsvFwJX9-rO8j-|}i9&q)HWlwO% zVjsrPC%N1U?0EGvZ`)F&9U3A1FS9WCV9wKH*2!{7lXt?JN3->La=)7o3{Hr+;R9hUc2Xl_T=^=G{>r6 z`o9=#j+}dPdkI)QeO(GxvwhlK22MM3E7#B5j-)oX*2(SVU~`-2?km7*dG6MxX8ZZ6 zZNDJ3{rS21O0anncDW&w)eUHYHa%C`OCHX0-Ab0H-8bVHi*sp zzT9VZpVN(JZC}^aKKAt`ur_O-d#|Iup5meXhT3kOT-*pY#=VTqXOEk}YPW*zSAH$U zSjHBo?ag4@hTl^2tjn!%*F{|)_r+~s_3YQ%!R`~PhAr39J8Io~l0NR8#Jv-4T>Cc% za{Zm7^L3oo8P{E4$C>s1GFUC^txc`Wq4SmJ^KW;Z@4L|l8I!hq!1iTrzVD;{D#b(l z*J`_U#&SQ{7|Hk7!D`93{9cN&j4e*v2f(&X9v%dn2X*rxH&6EMIBaj7_78z=pFBJa zR!bhVsg-kc9P;Gh2;v*h_W+M!%X@%F!E$ZB2lytq9bd=wI9TpyxpCN@0Q<|Bw$Y}~ zBh>2RC#eUq+wUx}^RPC@-=cns;-UTN+HReBJ_9yJa{O(uT5>EOq!`QC; zcfpP==c;@7dvNvmd>`yO*w*pO^>KWT)jq7##}B~vk#%?$td@1qrdH11vC6X!M;7bw zBWziR=fU!a6R}!RE!ceyZ@_91*)S$*HUdQI5q>n$M z+h_L48{oa@LtP*D(x1TUY4c}r+2&2SdrLiS-U6%VUiufXan#e-+hE7)cj?pauWf_iG&iU_P^%Os=sQ&}a`HiNS7w4{T^7l`$`7_V1wcIwYrR(Z?SZAL90z1!~ z1Mh&%yvwil8>sp=zJ@jWhuSM@;%Q^5KSgy@$(Ffq11OEZbJqLEi_9586_hcJw zj{RL~b=%*BZP@VUcLcPtT^d}Q?c3n`Yx8?`a%10ytsQ(9wQaQN^AW!4V!wAch}k)f z0GlIg&xd)a=cRaPpRcxC+qdW8{9t3`d{_Ximh(YAH^o@S7N_lkVB3a|ta;XRA-LDA@U_>*G1I7+5{$%;I1*i%07@vjlo#j>5Pk+;c|Vn4U9B zfz>mPrNL#JW#FDO>S?nqSUr1xIk0im6K8pFGfwlJ#|m)g)6k3aXhn2wiS-Gv@zir3 zjRLEuG#~mV?<<4NyX)f~k=w>S;C^r&tuy9Tz>fJ8*1$dSNw8YZBW-Hs z9&Y7UAy07RWqKy z)3p&;&0IPDk<=T*)g9NS)EWQ@@*m&BU$ClJ;;+?1+hkI%)*!);~9ovO^SBi)B-Du$uFUwl`ee_v)G7K5%1cORNLH?)UHm!N!)mt_Oo% zJ9BUlSS~(<+IW6;ci$cg-k)MTVYsWp2I&0qrc5K$J{bcGX6c5{W z*LLgleFWGTS^FcwYFT^vB#N<&El%4W@M;C03N}{ky)}35`;6BI_u8tikN31`VD+>) z3TzD9c>n1KdoNMf$NSH8uzEhj4uEmR+O*~U?u=UZ9f&>;6UWbIey_|pGtundBihlm zX1r*})SCNZ9Q(uj>al3H*I&DRxgN(+Yx5fDwc~j34bT(h)48SH%`?N5QLrG3K&w|(wQz4)j7X?6S4>Uo_G zSDVG$a<4iAu3p}&)Dq)NaCxsf3+~>|ed%ntKI&fo&!zV8`mgOAiki6*yGJ~~&j+_& z!#{_no@@98V72lZej&W|8vc1S_2lUyux-_I4Zj%NdJVq>O+DAROTk|A)D!D6u<^9H z=I2qXi7%%fWG?3a3b1pu_B_6d`f7@Y_Ak_S>*V%}U}NMwz6Pw8^H_c*#aPA`r|p-( z<#~K9+*q++2X?IC*Vp#U^#-_Fd5ymju3lc_Z-N_3o3Xrx-vZ7x{ARG+eB4T{zt8fX zN4J4jq1H!R&ZXPIo=eWbaobi+e{*HtoUe7pe+St4WnJzBtL0qKrdFPIOa z+8?X!*6HhUuracSzX?{$9+rQDVk~2e)AmVlxrb-Ljg@`!EwKAUKW%CE6j+<%AEcJ& zUCPs7-=(N)e}Y;qZJz<#hunL@x54`4v(|UOY8DUgDc(cU{=4YSF*fgy--CO9RM*G* zM8jQ z^%FGbGMeHX9izVX=Y9SKu=6lK=1p!J*WEqf+F55#FM^#@&XbqGYT0Aj)XIJ39+2l= z)klBE^P2KAYtK~C@*RNO6)Z_CTuw&H67;=4_(}A=#N6sz&zsJ@Z^K~@!}S>yXtvj1yU)TC7>Bub{Mubh z*VXl~&Rpik=3J7KdEja}N42Syd&PD2Gx}x}e~;gD)9;{p_`46AGH0LP<}2|0VEbN> zI=|2V6|jC8%ROM*WS#E?>yvXyu8;oqc^^glhr|_UJien?l;W{4CF5BH>=+iKb`1AZ zf1TnO@;3**(ZZi<;m_3EG5W6KVTv)5FS&o;M!Ub~`2^*0N_owA67E>upl4EBeT(u0 z#r^Dgpxu4rShOWSPlMI8IWBo@-v%2~n`4xF{WDMBp}0P_(dO8Er}ABjV^4nN`X=W0 z!1fpZeXxCGulxY4kNOV8bS}?QoUi*c=hP2t-E(mh@beV4=P3Hv?ne~$FXJMa}gTXFXm5m+K*av9`M&KczT6*Xu8J{$H;3yi6u6^h3w zN^-YSjm^o*6vy&O>g4M!aG9^STlhOQPyYS_H>TsTtvqA@E7(4?8AqP{{S9pXY@;pt z`#V^h`THlehxt?g2Sv>>i`_4SHCIo+{|4J{a`rAbInx%u_rTg5pYxK(_C8q6KE&CR z?wK_y9;;H4*VSrl?p81G8eqr!DeCOOxrPnRaa+wje{KIE#dvp9GM`^j}^ z7+fE9=VKpg@oxt^7H#$?&$V$lcmZs-(dL}hGUw6QHlTQ{OUazqtMS^@>r6&J^@y<{V3{{D7N?BVtcthws#+`T-)7a;_R_av2985*o=}rwt0;=rrv_$ z9{V(P_SCAx$R4m>v*7L-|GkXTKDveb?`6cU|Aqxu_utEi-M^=^Se+++(Yw zsb`O^0anW%bIfYV>8HSI*<)*g)yh4#4%}RrQ|BZXJ0JbC=Ier8bA7bwV@}l5-}>OP zzYXAOhZGmb$mIT{OA%bwX8tXA%s zUEyQs$2D<`a@P_B>u=6Ubh?iz@5p6`rp zcZ$a@l&rz7HQtGOH;QYp2X)q9KVp@cuvrjIs# z%!zvXI~-j0*9liE&+`fJ^k+`w#xfuJr@t<+{pq7kA9Jdn{w9MRLvl6+Y#y^m!rrOPk~E zr=Cu6yt%H(^|K%M?LcjJPm8ms$6?!#;;}a+dwQQ5??t^Y#XbEQ>g?&GiBaz9;|uN{ zJ*nXOol@}Az^B(d`9212Kjj`h7EL{S^f<6u_NZe}OD<0Ut7VU#2v#fi=*e*B<{og2 zauzN-yZTdJz_4IcJSS`;JXM)w7(lujab%w$r_BWaR>DTifhnCoi(_I7+C{zetp5!Z>)L7 z_a(S-${b&drk)&M2Uau3j@#$<8{m$`9N33kY<&Hbvzx%?OdoCfI7ap4>}IgqGwfTh zWw(OWZlT2IHn2V!)9qljT$c`~-5qe-YBQhmewO7c0m#^!Sh#e5z?Z9dK4 zeZ)vUeUAQG&6B?`!);gQ?<;8P*>m@R)$XSFbApZVzZa~Ye0~+|Sj>-o%Ek7lulaNi z_k(@b*GHT4RLeX^W9y}O97)MMdur@Fr&63}A9d#W2r)8GKa)OI^UU)>xb4b$K7^*8 zc|HtQ%RJY@{~K`i%=1yOV{vZwDHq$HzRuG*JP!7Avp(9Kr&{Le^=mrCV;Uv%JgUad zv!CKT2dFd8r-+exdT)8A=9%Y{aNCvhoQ0;Ic@BcrGS5Bn{}x<5^L!fYSe%=E%Ek7l zuk&;c-v;kTt&cY6sg`+egY6iK#|%p5IkU#j^Jt3mJeE51{2?(iPoK@7uX*PAJ-F@4 zd43;FJ@fnlSS|D13jb%}>Y3+rV8`Oz>{BkbKYg92bNCT>dun~OIZw6B(`SSeDIUjB zGSA~{>^x7PIM0))GtZZak$L+3`%29-&lljfE9dzlntJB>5?C$s+!6nu!qqd+pMf2V zbF)vm*#7i&p3dRtV4uFYe5!|%a9Bj}^ed8%ce zXJb2`;&Bco^E|i4XHuU>ah{)}cAn1fkHpA4t=}xT*Wb@I?!*|B?mQf9ZnzH-?w1dG^5@ zjNiPL``}M#>bZCR8QjqDb8XGJntQTH4+?^w$n9`x^mQ%l9tqZytE&=bn-q z%l)K(`kN1IfBI~9IU+Tyj3{VfGff9`3yvE0x4r@v*u_NR|FeLN@B)8F!7_fS6ftN>SweMPWq z9{VTYYJPq_i`b*Uwo&)IS&4dOiszE&jeW}XOUzZku4`g`60R2es$kb4_SL{@>2r0k zZPe4}8esd(XJ)y6iMb}&TqowIz-qQ1#aPw?+urAL$1K+;?biXDyZp_W(O@;(d;MJ( zY}n~zVA?Q zuW#cDuHU{be7~AI=1stxQd+;8xmm5}`=Xn})dq?84rALA?BUPCv~59AbFAXT{xrDt z`TA41;=tmYna-9}Q6g{$Z1f;)rN9K){E9*#kM7mAu=5a)YwyMc}C`C!SO z+8s?>?j?JG)!c)*U+e`}-;?4vUFW^QiDxXY3HzX_J1_TvTh|Tu4)9$)tPS(b8&mIJJ48}Q-TCQ)_!1~wtdLOVH3{Trbz_#&R5a(RDh`5(g zJT9SlE?i7~DaD*#PVL_Bpv~cwoD2GNweTZqZlA{Ogd68^a(EbcB1LTi#W@&HE&fx$ z`up8I+jqk!Q`GghKehNz1?%tccI!V4&a@lf7tq#6Nvxy5JrsRTuj3DZ)u&U8@A%ac ze+Jk-!)Jo^kvpHGDbC>zo)ql=m|D}%w&q%`%=MM{d6c=n0&cFaqE4=lr(K!rQ(E}x zHP6^ifEy>dJ{hid62-Y0Pc8nZg7x?BWjOZJ;A-YufBRF5{~2KYPp$pWgsYjm#5fDA zZl1Fy=Yq2)+RvdF-|=fp{PV!}8Gb%kAGx{y9K|^#*B8{9ezrB&YRUE0jP)9d#}_E> zYxDU3f5+6gHtv9 zs2X#&AAO9g|K(t{e6RKju$slgK7{7WF=@|t=&l62m(;yRjl%gVu|-75SA*5_ z{kboIZR-*3i?wEd(XOdAUGuvkUxL_Pf9=LL@9N3B`MQDPaUI3Ho8#*#=KV%$^X~QI zdfJ)yS>` zPBG6nQ{PeJTd41(nDZ}Fn{#u04>7XW`|04pg1b&n72Gv?zThu`e_C_rX{y&su0~^mAxQ|}}yI1wIy<8vnqWjYQ oWSw|F2OBSI{0p#}Yh`YX&Mnx`7v@*lC= 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 JPQ{+n{|Cy0R(=2g diff --git a/piet-gpu/shader/ptcl.h b/piet-gpu/shader/ptcl.h index 0480ad9..6267fc5 100644 --- a/piet-gpu/shader/ptcl.h +++ b/piet-gpu/shader/ptcl.h @@ -10,27 +10,15 @@ struct CmdFillRef { uint offset; }; -struct CmdFillImageRef { +struct CmdColorRef { uint offset; }; -struct CmdBeginClipRef { +struct CmdImageRef { uint offset; }; -struct CmdBeginSolidClipRef { - uint offset; -}; - -struct CmdEndClipRef { - uint offset; -}; - -struct CmdSolidRef { - uint offset; -}; - -struct CmdSolidImageRef { +struct CmdAlphaRef { uint offset; }; @@ -45,10 +33,9 @@ struct CmdRef { struct CmdStroke { uint tile_ref; float half_width; - uint rgba_color; }; -#define CmdStroke_size 12 +#define CmdStroke_size 8 CmdStrokeRef CmdStroke_index(CmdStrokeRef ref, uint index) { return CmdStrokeRef(ref.offset + index * CmdStroke_size); @@ -57,78 +44,43 @@ CmdStrokeRef CmdStroke_index(CmdStrokeRef ref, uint index) { struct CmdFill { uint tile_ref; int backdrop; - uint rgba_color; }; -#define CmdFill_size 12 +#define CmdFill_size 8 CmdFillRef CmdFill_index(CmdFillRef ref, uint index) { return CmdFillRef(ref.offset + index * CmdFill_size); } -struct CmdFillImage { - uint tile_ref; - int backdrop; - uint index; - ivec2 offset; -}; - -#define CmdFillImage_size 16 - -CmdFillImageRef CmdFillImage_index(CmdFillImageRef ref, uint index) { - return CmdFillImageRef(ref.offset + index * CmdFillImage_size); -} - -struct CmdBeginClip { - uint tile_ref; - int backdrop; -}; - -#define CmdBeginClip_size 8 - -CmdBeginClipRef CmdBeginClip_index(CmdBeginClipRef ref, uint index) { - return CmdBeginClipRef(ref.offset + index * CmdBeginClip_size); -} - -struct CmdBeginSolidClip { - float alpha; -}; - -#define CmdBeginSolidClip_size 4 - -CmdBeginSolidClipRef CmdBeginSolidClip_index(CmdBeginSolidClipRef ref, uint index) { - return CmdBeginSolidClipRef(ref.offset + index * CmdBeginSolidClip_size); -} - -struct CmdEndClip { - float alpha; -}; - -#define CmdEndClip_size 4 - -CmdEndClipRef CmdEndClip_index(CmdEndClipRef ref, uint index) { - return CmdEndClipRef(ref.offset + index * CmdEndClip_size); -} - -struct CmdSolid { +struct CmdColor { uint rgba_color; }; -#define CmdSolid_size 4 +#define CmdColor_size 4 -CmdSolidRef CmdSolid_index(CmdSolidRef ref, uint index) { - return CmdSolidRef(ref.offset + index * CmdSolid_size); +CmdColorRef CmdColor_index(CmdColorRef ref, uint index) { + return CmdColorRef(ref.offset + index * CmdColor_size); } -struct CmdSolidImage { +struct CmdImage { uint index; ivec2 offset; }; -#define CmdSolidImage_size 8 +#define CmdImage_size 8 -CmdSolidImageRef CmdSolidImage_index(CmdSolidImageRef ref, uint index) { - return CmdSolidImageRef(ref.offset + index * CmdSolidImage_size); +CmdImageRef CmdImage_index(CmdImageRef ref, uint index) { + return CmdImageRef(ref.offset + index * CmdImage_size); +} + +struct CmdAlpha { + float alpha; +}; + +#define CmdAlpha_size 4 + +CmdAlphaRef CmdAlpha_index(CmdAlphaRef ref, uint index) { + return CmdAlphaRef(ref.offset + index * CmdAlpha_size); } struct CmdJump { @@ -143,15 +95,15 @@ CmdJumpRef CmdJump_index(CmdJumpRef ref, uint index) { #define Cmd_End 0 #define Cmd_Fill 1 -#define Cmd_FillImage 2 -#define Cmd_BeginClip 3 -#define Cmd_BeginSolidClip 4 -#define Cmd_EndClip 5 -#define Cmd_Stroke 6 -#define Cmd_Solid 7 -#define Cmd_SolidImage 8 +#define Cmd_Stroke 2 +#define Cmd_Solid 3 +#define Cmd_Alpha 4 +#define Cmd_Color 5 +#define Cmd_Image 6 +#define Cmd_BeginClip 7 +#define Cmd_EndClip 8 #define Cmd_Jump 9 -#define Cmd_size 20 +#define Cmd_size 12 CmdRef Cmd_index(CmdRef ref, uint index) { return CmdRef(ref.offset + index * Cmd_size); @@ -166,11 +118,9 @@ CmdStroke CmdStroke_read(Alloc a, CmdStrokeRef 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); CmdStroke s; s.tile_ref = raw0; s.half_width = uintBitsToFloat(raw1); - s.rgba_color = raw2; return s; } @@ -178,18 +128,15 @@ void CmdStroke_write(Alloc a, CmdStrokeRef ref, CmdStroke s) { uint ix = ref.offset >> 2; write_mem(a, ix + 0, s.tile_ref); write_mem(a, ix + 1, floatBitsToUint(s.half_width)); - write_mem(a, ix + 2, s.rgba_color); } CmdFill CmdFill_read(Alloc a, CmdFillRef 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); CmdFill s; s.tile_ref = raw0; s.backdrop = int(raw1); - s.rgba_color = raw2; return s; } @@ -197,102 +144,50 @@ void CmdFill_write(Alloc a, CmdFillRef ref, CmdFill s) { uint ix = ref.offset >> 2; write_mem(a, ix + 0, s.tile_ref); write_mem(a, ix + 1, uint(s.backdrop)); - write_mem(a, ix + 2, s.rgba_color); } -CmdFillImage CmdFillImage_read(Alloc a, CmdFillImageRef ref) { +CmdColor CmdColor_read(Alloc a, CmdColorRef 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); - CmdFillImage s; - s.tile_ref = raw0; - s.backdrop = int(raw1); - s.index = raw2; - s.offset = ivec2(int(raw3 << 16) >> 16, int(raw3) >> 16); - return s; -} - -void CmdFillImage_write(Alloc a, CmdFillImageRef ref, CmdFillImage s) { - uint ix = ref.offset >> 2; - write_mem(a, ix + 0, s.tile_ref); - write_mem(a, ix + 1, uint(s.backdrop)); - write_mem(a, ix + 2, s.index); - write_mem(a, ix + 3, (uint(s.offset.x) & 0xffff) | (uint(s.offset.y) << 16)); -} - -CmdBeginClip CmdBeginClip_read(Alloc a, CmdBeginClipRef ref) { - uint ix = ref.offset >> 2; - uint raw0 = read_mem(a, ix + 0); - uint raw1 = read_mem(a, ix + 1); - CmdBeginClip s; - s.tile_ref = raw0; - s.backdrop = int(raw1); - return s; -} - -void CmdBeginClip_write(Alloc a, CmdBeginClipRef ref, CmdBeginClip s) { - uint ix = ref.offset >> 2; - write_mem(a, ix + 0, s.tile_ref); - write_mem(a, ix + 1, uint(s.backdrop)); -} - -CmdBeginSolidClip CmdBeginSolidClip_read(Alloc a, CmdBeginSolidClipRef ref) { - uint ix = ref.offset >> 2; - uint raw0 = read_mem(a, ix + 0); - CmdBeginSolidClip s; - s.alpha = uintBitsToFloat(raw0); - return s; -} - -void CmdBeginSolidClip_write(Alloc a, CmdBeginSolidClipRef ref, CmdBeginSolidClip s) { - uint ix = ref.offset >> 2; - write_mem(a, ix + 0, floatBitsToUint(s.alpha)); -} - -CmdEndClip CmdEndClip_read(Alloc a, CmdEndClipRef ref) { - uint ix = ref.offset >> 2; - uint raw0 = read_mem(a, ix + 0); - CmdEndClip s; - s.alpha = uintBitsToFloat(raw0); - return s; -} - -void CmdEndClip_write(Alloc a, CmdEndClipRef ref, CmdEndClip s) { - uint ix = ref.offset >> 2; - write_mem(a, ix + 0, floatBitsToUint(s.alpha)); -} - -CmdSolid CmdSolid_read(Alloc a, CmdSolidRef ref) { - uint ix = ref.offset >> 2; - uint raw0 = read_mem(a, ix + 0); - CmdSolid s; + CmdColor s; s.rgba_color = raw0; return s; } -void CmdSolid_write(Alloc a, CmdSolidRef ref, CmdSolid s) { +void CmdColor_write(Alloc a, CmdColorRef ref, CmdColor s) { uint ix = ref.offset >> 2; write_mem(a, ix + 0, s.rgba_color); } -CmdSolidImage CmdSolidImage_read(Alloc a, CmdSolidImageRef ref) { +CmdImage CmdImage_read(Alloc a, CmdImageRef ref) { uint ix = ref.offset >> 2; uint raw0 = read_mem(a, ix + 0); uint raw1 = read_mem(a, ix + 1); - CmdSolidImage s; + CmdImage s; s.index = raw0; s.offset = ivec2(int(raw1 << 16) >> 16, int(raw1) >> 16); return s; } -void CmdSolidImage_write(Alloc a, CmdSolidImageRef ref, CmdSolidImage s) { +void CmdImage_write(Alloc a, CmdImageRef ref, CmdImage s) { uint ix = ref.offset >> 2; write_mem(a, ix + 0, s.index); write_mem(a, ix + 1, (uint(s.offset.x) & 0xffff) | (uint(s.offset.y) << 16)); } +CmdAlpha CmdAlpha_read(Alloc a, CmdAlphaRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + CmdAlpha s; + s.alpha = uintBitsToFloat(raw0); + return s; +} + +void CmdAlpha_write(Alloc a, CmdAlphaRef ref, CmdAlpha s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, floatBitsToUint(s.alpha)); +} + CmdJump CmdJump_read(Alloc a, CmdJumpRef ref) { uint ix = ref.offset >> 2; uint raw0 = read_mem(a, ix + 0); @@ -315,32 +210,20 @@ CmdFill Cmd_Fill_read(Alloc a, CmdRef ref) { return CmdFill_read(a, CmdFillRef(ref.offset + 4)); } -CmdFillImage Cmd_FillImage_read(Alloc a, CmdRef ref) { - return CmdFillImage_read(a, CmdFillImageRef(ref.offset + 4)); -} - -CmdBeginClip Cmd_BeginClip_read(Alloc a, CmdRef ref) { - return CmdBeginClip_read(a, CmdBeginClipRef(ref.offset + 4)); -} - -CmdBeginSolidClip Cmd_BeginSolidClip_read(Alloc a, CmdRef ref) { - return CmdBeginSolidClip_read(a, CmdBeginSolidClipRef(ref.offset + 4)); -} - -CmdEndClip Cmd_EndClip_read(Alloc a, CmdRef ref) { - return CmdEndClip_read(a, CmdEndClipRef(ref.offset + 4)); -} - CmdStroke Cmd_Stroke_read(Alloc a, CmdRef ref) { return CmdStroke_read(a, CmdStrokeRef(ref.offset + 4)); } -CmdSolid Cmd_Solid_read(Alloc a, CmdRef ref) { - return CmdSolid_read(a, CmdSolidRef(ref.offset + 4)); +CmdAlpha Cmd_Alpha_read(Alloc a, CmdRef ref) { + return CmdAlpha_read(a, CmdAlphaRef(ref.offset + 4)); } -CmdSolidImage Cmd_SolidImage_read(Alloc a, CmdRef ref) { - return CmdSolidImage_read(a, CmdSolidImageRef(ref.offset + 4)); +CmdColor Cmd_Color_read(Alloc a, CmdRef ref) { + return CmdColor_read(a, CmdColorRef(ref.offset + 4)); +} + +CmdImage Cmd_Image_read(Alloc a, CmdRef ref) { + return CmdImage_read(a, CmdImageRef(ref.offset + 4)); } CmdJump Cmd_Jump_read(Alloc a, CmdRef ref) { @@ -356,39 +239,36 @@ void Cmd_Fill_write(Alloc a, CmdRef ref, CmdFill s) { CmdFill_write(a, CmdFillRef(ref.offset + 4), s); } -void Cmd_FillImage_write(Alloc a, CmdRef ref, CmdFillImage s) { - write_mem(a, ref.offset >> 2, Cmd_FillImage); - CmdFillImage_write(a, CmdFillImageRef(ref.offset + 4), s); -} - -void Cmd_BeginClip_write(Alloc a, CmdRef ref, CmdBeginClip s) { - write_mem(a, ref.offset >> 2, Cmd_BeginClip); - CmdBeginClip_write(a, CmdBeginClipRef(ref.offset + 4), s); -} - -void Cmd_BeginSolidClip_write(Alloc a, CmdRef ref, CmdBeginSolidClip s) { - write_mem(a, ref.offset >> 2, Cmd_BeginSolidClip); - CmdBeginSolidClip_write(a, CmdBeginSolidClipRef(ref.offset + 4), s); -} - -void Cmd_EndClip_write(Alloc a, CmdRef ref, CmdEndClip s) { - write_mem(a, ref.offset >> 2, Cmd_EndClip); - CmdEndClip_write(a, CmdEndClipRef(ref.offset + 4), s); -} - void Cmd_Stroke_write(Alloc a, CmdRef ref, CmdStroke s) { write_mem(a, ref.offset >> 2, Cmd_Stroke); CmdStroke_write(a, CmdStrokeRef(ref.offset + 4), s); } -void Cmd_Solid_write(Alloc a, CmdRef ref, CmdSolid s) { +void Cmd_Solid_write(Alloc a, CmdRef ref) { write_mem(a, ref.offset >> 2, Cmd_Solid); - CmdSolid_write(a, CmdSolidRef(ref.offset + 4), s); } -void Cmd_SolidImage_write(Alloc a, CmdRef ref, CmdSolidImage s) { - write_mem(a, ref.offset >> 2, Cmd_SolidImage); - CmdSolidImage_write(a, CmdSolidImageRef(ref.offset + 4), s); +void Cmd_Alpha_write(Alloc a, CmdRef ref, CmdAlpha s) { + write_mem(a, ref.offset >> 2, Cmd_Alpha); + CmdAlpha_write(a, CmdAlphaRef(ref.offset + 4), s); +} + +void Cmd_Color_write(Alloc a, CmdRef ref, CmdColor s) { + write_mem(a, ref.offset >> 2, Cmd_Color); + CmdColor_write(a, CmdColorRef(ref.offset + 4), s); +} + +void Cmd_Image_write(Alloc a, CmdRef ref, CmdImage s) { + write_mem(a, ref.offset >> 2, Cmd_Image); + CmdImage_write(a, CmdImageRef(ref.offset + 4), s); +} + +void Cmd_BeginClip_write(Alloc a, CmdRef ref) { + write_mem(a, ref.offset >> 2, Cmd_BeginClip); +} + +void Cmd_EndClip_write(Alloc a, CmdRef ref) { + write_mem(a, ref.offset >> 2, Cmd_EndClip); } void Cmd_Jump_write(Alloc a, CmdRef ref, CmdJump s) {