From ccf42c3614424ca66070722f848409df015aabdb Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Sun, 27 Aug 2023 14:03:21 -0400 Subject: [PATCH] naga-pixelbender: Stub out Opcode::Loop Some experimentation with Pixel Bender Studio shows that Opcode::Loop has a 23-byte payload. I haven't tried to figure out how to interpet the payload yet, but we can now skip over the opcode instead of bailing out entirely. --- Cargo.lock | 1 + render/naga-pixelbender/Cargo.toml | 1 + render/naga-pixelbender/src/lib.rs | 5 ++++- render/src/pixel_bender.rs | 10 ++++++++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index dfdebc287..24805bf18 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2901,6 +2901,7 @@ dependencies = [ "naga", "naga_oil", "ruffle_render", + "tracing", ] [[package]] diff --git a/render/naga-pixelbender/Cargo.toml b/render/naga-pixelbender/Cargo.toml index 3a736cb97..72adfd5eb 100644 --- a/render/naga-pixelbender/Cargo.toml +++ b/render/naga-pixelbender/Cargo.toml @@ -11,6 +11,7 @@ version.workspace = true ruffle_render = { path = "../" } naga = { workspace = true } naga_oil = { workspace = true } +tracing = { workspace = true } anyhow = "1.0.75" bitflags = "2.4.0" diff --git a/render/naga-pixelbender/src/lib.rs b/render/naga-pixelbender/src/lib.rs index 3174b271d..ea92e09c2 100644 --- a/render/naga-pixelbender/src/lib.rs +++ b/render/naga-pixelbender/src/lib.rs @@ -1484,7 +1484,10 @@ impl<'a> ShaderBuilder<'a> { } } } - _ => unimplemented!("Operation {op:?} not yet implemented"), + Operation::Loop { unknown } => { + tracing::warn!("Unimplemented Loop opcode with data: {unknown:?}") + } + Operation::Nop => {} } } Ok(()) diff --git a/render/src/pixel_bender.rs b/render/src/pixel_bender.rs index a4d67b430..e578648d6 100644 --- a/render/src/pixel_bender.rs +++ b/render/src/pixel_bender.rs @@ -244,6 +244,9 @@ pub enum Operation { }, Else, EndIf, + Loop { + unknown: Box<[u8]>, + }, } #[derive(Debug, Clone)] @@ -564,6 +567,13 @@ fn read_op( _ => unreachable!(), } } + Opcode::Loop => { + let mut unknown = vec![0u8; 23]; + data.read_exact(&mut unknown)?; + shader.operations.push(Operation::Loop { + unknown: unknown.into(), + }); + } _ => { let dst = data.read_u16::()?; let mut mask = data.read_u8()?;