From d2999a2572696030a8d857beabc5a29347e9e4b3 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Sun, 4 Jun 2023 02:18:53 -0500 Subject: [PATCH] core: Fix parsing of PixelBender sampleNearest and sampleLinear This fixes a panic on startup for Sniper Team --- core/src/pixel_bender.rs | 33 +++++++++++++++++- core/src/pixel_bender/tests.rs | 5 ++- .../avm2/pixelbender_shaderdata/output.txt | 2 ++ .../avm2/pixelbender_shaderdata/shader.pbj | Bin 533 -> 577 bytes .../avm2/pixelbender_shaderdata/shader.pbk | 3 ++ .../swfs/avm2/pixelbender_shaderdata/test.swf | Bin 1689 -> 1710 bytes 6 files changed, 39 insertions(+), 4 deletions(-) diff --git a/core/src/pixel_bender.rs b/core/src/pixel_bender.rs index 58c0ce312..682a2d41c 100644 --- a/core/src/pixel_bender.rs +++ b/core/src/pixel_bender.rs @@ -212,6 +212,18 @@ pub enum Operation { If { src: u32, }, + SampleNearest { + dst: u16, + src: u32, + mask: u8, + tf: u8, + }, + SampleLinear { + dst: u16, + src: u32, + mask: u8, + tf: u8, + }, Else, EndIf, } @@ -367,11 +379,30 @@ fn read_op( .push(Operation::LoadFloat { dst, mask, val }) } } + Opcode::SampleNearest | Opcode::SampleLinear => { + let dst = data.read_u16::()?; + let mask = data.read_u8()?; + let src = read_uint24(data)?; + let tf = data.read_u8()?; + match opcode { + Opcode::SampleNearest => { + shader + .operations + .push(Operation::SampleNearest { dst, mask, src, tf }) + } + Opcode::SampleLinear => { + shader + .operations + .push(Operation::SampleLinear { dst, mask, src, tf }) + } + _ => unreachable!(), + } + } _ => { let dst = data.read_u16::()?; let mask = data.read_u8()?; let src = read_uint24(data)?; - assert_eq!(data.read_u8()?, 0); + assert_eq!(data.read_u8()?, 0, "Unexpected u8 for opcode {opcode:?}"); shader.operations.push(Operation::Normal { opcode, dst, diff --git a/core/src/pixel_bender/tests.rs b/core/src/pixel_bender/tests.rs index cb2c767c1..efaa33139 100644 --- a/core/src/pixel_bender/tests.rs +++ b/core/src/pixel_bender/tests.rs @@ -183,12 +183,11 @@ fn simple_shader() { src: 19, other: 0, }, - Operation::Normal { - opcode: Opcode::SampleNearest, + Operation::SampleNearest { dst: 3, mask: 241, src: 16, - other: 0, + tf: 0, }, Operation::LoadFloat { dst: 4, diff --git a/tests/tests/swfs/avm2/pixelbender_shaderdata/output.txt b/tests/tests/swfs/avm2/pixelbender_shaderdata/output.txt index aaac2c70b..46a22efd0 100644 --- a/tests/tests/swfs/avm2/pixelbender_shaderdata/output.txt +++ b/tests/tests/swfs/avm2/pixelbender_shaderdata/output.txt @@ -2,6 +2,8 @@ description: A shader that does nothing, but does it well. (String) name: DoNothing (String) namespace: Adobe::Example (String) +otherSrc: [object ShaderInput] (flash.display::ShaderInput) + name: otherSrc (String) radius: [object ShaderParameter] (flash.display::ShaderParameter) defaultValue: 25 (Array) 0: 25 (int) diff --git a/tests/tests/swfs/avm2/pixelbender_shaderdata/shader.pbj b/tests/tests/swfs/avm2/pixelbender_shaderdata/shader.pbj index 0af6496e8f6e9cdd9c52f7e0e7f9aebb3b30cab3..59109b2b6cd663ddf5f95ca38d88f169fbe5d935 100644 GIT binary patch delta 120 zcmbQra*$=iTt@E2j4b&j8L36VMah%rFj^)UF*7vSH!v^&X$J=e1_nbGhL6k)0*tcE z44+vTq!|o=dJ6Gyp*x B7F_@U delta 76 zcmX@eGL>b+T*k>O87&+Pm>E7YFbFUhu`o0^onQdb4h%p5q!pli0s96923b~y&&&+c R42(dU1xU*>GJIwQ(g1Ez4XpqG diff --git a/tests/tests/swfs/avm2/pixelbender_shaderdata/shader.pbk b/tests/tests/swfs/avm2/pixelbender_shaderdata/shader.pbk index 85c90f13d..463ec0941 100644 --- a/tests/tests/swfs/avm2/pixelbender_shaderdata/shader.pbk +++ b/tests/tests/swfs/avm2/pixelbender_shaderdata/shader.pbk @@ -29,10 +29,13 @@ maxValue: 50.0; defaultValue: 25.0; >; + + input image4 otherSrc; void evaluatePixel() { float2 one = (radius / radius) * (size / size); + float4 two = sampleLinear(otherSrc, float2(1.0, 2.0)); dst = sampleNearest(src, outCoord()) + float4(100.0, 0.0, 100.0, 1.0); } } diff --git a/tests/tests/swfs/avm2/pixelbender_shaderdata/test.swf b/tests/tests/swfs/avm2/pixelbender_shaderdata/test.swf index 389856bd1b1576406d1dbb2ab7df2d6c1611707d..7d385a9cd7ade2d252eeae0a40a993a201df6f1b 100755 GIT binary patch literal 1710 zcmV;f22uG#S5qrl3jhFkoTXMap)zqdX`If{? zLyt#k$w(l%G-2~L04UL!K6w1ppFunAd!O@?>0A3o+tc zU=^M38f#hdV=9cgKuR^%Vfrc|N2%Ka2l(}8F8-vE&F=lK+q625hLMihW=_wnF;b{^ zt1O@28kp@~i;-buk9F!@JHT}ozz!Lzd(3vMZU;Gskvel~w$*d_yr4Txv(9YYZJMrL z?=na41a4OJYJZGauD;J&tt@!~7*=Gb*mpO&UAs=cCz4~=$O}ON60bXMpddQdcZ|F| z<>x_@=^WO(4RpnHt8G4Fy4%(Fn^vvqLr<99VJ+QqbhFoMS*%W83T>I&Hp}0=)nbE!<1jaO zGCY60dh@Bv3bt)N4Kz+qmpJ!M=}uvD>+7AH-#pkV<=#QgyBuk>%>0+8)p=mGSg<@8$SQ|-&{p2ap=RxkD5pp_uc$Rw}4feg+kP1o(^bGiNf{jAA1IR@3vtr^DE zTm$pTwFfz?%sIizxY^g+gEFtf`UF$fbgus{U$*-VjG@dka>h?*zu}b4z4ltU zXAM}Zil-B^cY-6QZo20BIdtR8;?1$TYaqbY}T*_(i8U7fhQsg zsn>U!p|Sn)rEBNLr8y}}p>!!IO|@^eT&p8FUE3A%x}blYdc@q{_RW^nz=OuG?0rlU zE`a{|&nwGGTVYhipT~8&)sS!Ioo+)gbKFAN$rj3w_e#vH*KhGr$v^&<{)_VDEE4o8 z!*7Y}#J9NE#J)A%8s-t*3|ctYP072w1cm*XI~0s%5j121{ECV)kqjA1414{xPmxUx3n z(JqdBVNnvidCvaBm_2iwf4u?3SuE8#k5*=P!Ptdul4*)KmvLDpAc}wkih4o< z^)7o$6;KUh%#`i!0vmvASLv@er~|i#~R{ zGRM79{A~-FOjALO6Nb5|I5Kb;0Z?e{@T&iYVw{6>N0CE5iyT+IP-TA1q2O;@%pi}3 zxQc2q04)^oU^9inakTiN(ybbl9M=ANm#zbrJCBZBwKc3 zGc`3HB_$()+e{tPm8|LPt z2fgaSO{ep4LnA+=!nhVlsm3}?y+X)wYL4>&@A|7J{-TgI^O5N^jn30Sq@%Z)-PLQ1 ztklgaD-_oIdb`_VWDwb7ow{iSxXJ?9CIfkoS+-$zkaG~JGrMLPUB?@*sCHAYGfQ=v zx}(-jW~-gR&7xZEjS$08_gSlzBQF5Mifk8q&Z=ozb@Ck%Y^z3IZ~~Bc-FAWnylwoE zk(X!uY&Mzd!K&FnS4=h9`ctMlrn=uWYE2*7Wmbo^RKr&FZntHyI(f;pjm{Ij)nnx3 zLP+li(4Bt}a_65ORA&vn*K$Vi2J!C~fU(GyUN?I7dx8ljPQqc02CF&bC7f}H!?(^h zyx|!~E9hU~$ZgD+@FR(1e0_iO#=gw*sBO70c2Of)!_n^B(th zX=7z={qgpluQu09`FD_uj)yc_df}mNbT*APYZ)Due~UIOZ09SN|HrCvRPcO+PBWpS zSVO1b$IiwXMhd%`>p4ctR^Cpf-=AahofPDgFe2k&L<7>gVRu{lf%4GYGuUd&=%(Hq zv=rnS8Rr#Ok-`3?={Vg&KEJ=epVPgKi$S&XOPY2g-@ttG?S9_qIJi6X7Jah*xOBhx zD10qn@lld>!3*|c7D>s>CZjWAh*>}8eTDx|+Ynfib>{G0a8+f_h zFMD-Z9%IVs_N}iAWvkb~7|LEo_ULKvH|(;$*Ip`jjXrBt@x)=)c5sZ;bw^)b_UecB zQh*5_7%KVt8mgjW;nBsL)o-P)#TrIm*kuPc?D8mtZqIIpM)nI=Z(bOc=Cmv;rK>?{ zsy(CS7#+bjEr%1!Zzw2ow|45tvFN?=Vk)T%@ejgk=zV3-N>|5QbVII-7poN3o zl)Ue?fL?QqJr*G8GxMuv$3bRhNhM6*VW0kgZBm{{LnbVS)6sMyGm)80Po>kD%=DD} zfw(vg@~>yZ>4E?P4vhmETh3GphWKDz_$r)6}~;`~yz>Gk|}- zp1{(WPRDe4Ojqy@1-i(Cf=qy4MqVT$noCrXKvsw%DU?J=C@hCa0wVb31c(xd;UXF0 z5^(1rOk!vN3G^9}1>gmA38FwC1d>3wC@2EqlMurCBnigJ(V=#vx{-V6n#1L>p>_zf zB=k*mN718*avU#+%SRX7$WX)kJ~@P6k?0}JL(Gjv62GoHm8&*HO@ z#XS0PXEC6vI9SXNURA|LYOtscDrsN6n})&S(!h&$Zs;Sg7q1SA0_Vrv-iBO zGXOu0rMlqK%JdFsJFrEvO&-T0PKyM19#EmUj!WRWYwmnSR=1!j`n8qub&7s%vt;6% z_~N-{98m>8loChR-LKH%y88#Lu3JVtge=0GkKL!=5QW)KHB8 zNHlhI!+%3DkHh1RB8PY$Ic~V2%FKvE!rvC3MIHrl8JEQXlu*Ef%@hj9(c)7VD*OYU zTyi;t6FkD{p@zhj*`wdMut0{5NO6|)XOrkgxjfVu@m$PlJ0EB}S#9T>wsT(F3FB`| j$Ocz4badOzpvkStoWECqymNjb{@xSG{}<;!(K8*V%