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 0af6496e8..59109b2b6 100644 Binary files a/tests/tests/swfs/avm2/pixelbender_shaderdata/shader.pbj and b/tests/tests/swfs/avm2/pixelbender_shaderdata/shader.pbj differ 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 389856bd1..7d385a9cd 100755 Binary files a/tests/tests/swfs/avm2/pixelbender_shaderdata/test.swf and b/tests/tests/swfs/avm2/pixelbender_shaderdata/test.swf differ