Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ members = [
"render",
"render/canvas",
"render/naga-agal",
"render/pixel_bender",
"render/wgpu",
"render/webgl",

Expand Down
5 changes: 3 additions & 2 deletions core/src/avm2/globals/flash/display/shader_job.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ use crate::avm2_stub_method;
use ruffle_render::backend::{PixelBenderOutput, PixelBenderTarget};
use ruffle_render::bitmap::PixelRegion;
use ruffle_render::pixel_bender::{
ImageInputTexture, PixelBenderParam, PixelBenderParamQualifier, PixelBenderShaderArgument,
PixelBenderShaderHandle, PixelBenderType, OUT_COORD_NAME,
PixelBenderParam, PixelBenderParamQualifier, PixelBenderShaderHandle, PixelBenderType,
OUT_COORD_NAME,
};
use ruffle_render::pixel_bender_support::{ImageInputTexture, PixelBenderShaderArgument};

pub fn get_shader_args<'gc>(
shader_obj: Object<'gc>,
Expand Down
1 change: 1 addition & 0 deletions render/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ workspace = true
[dependencies]
ruffle_wstr = { path = "../wstr" }
swf = { path = "../swf"}
pixel_bender = { path = "pixel_bender"}
tracing = { workspace = true }
gif = "0.13.3"
png = "0.17.16"
Expand Down
2 changes: 1 addition & 1 deletion render/canvas/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,7 @@ impl RenderBackend for WebCanvasRenderBackend {
fn run_pixelbender_shader(
&mut self,
_handle: ruffle_render::pixel_bender::PixelBenderShaderHandle,
_arguments: &[ruffle_render::pixel_bender::PixelBenderShaderArgument],
_arguments: &[ruffle_render::pixel_bender_support::PixelBenderShaderArgument],
_target: &PixelBenderTarget,
) -> Result<PixelBenderOutput, Error> {
Err(Error::Unimplemented("run_pixelbender_shader".into()))
Expand Down
1 change: 0 additions & 1 deletion render/naga-pixelbender/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,3 @@ workspace = true
ruffle_render = { path = "../" }
naga = { workspace = true }
anyhow = { workspace = true }

17 changes: 17 additions & 0 deletions render/pixel_bender/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[package]
name = "pixel_bender"
authors.workspace = true
edition.workspace = true
homepage.workspace = true
license.workspace = true
repository.workspace = true
version.workspace = true

[lints]
workspace = true

[dependencies]
thiserror = { workspace = true }
num-traits = { workspace = true }
num-derive = { workspace = true }
byteorder = { workspace = true }
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::fmt::{Display, Formatter};

use crate::pixel_bender::{
use crate::parser::{
Opcode, Operation, PixelBenderMetadata, PixelBenderParam, PixelBenderParamQualifier,
PixelBenderReg, PixelBenderRegChannel, PixelBenderRegKind, PixelBenderShader, PixelBenderType,
PixelBenderTypeOpcode,
Expand Down
7 changes: 7 additions & 0 deletions render/pixel_bender/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#[cfg(test)]
mod tests;

pub mod disassembly;
mod parser;

pub use parser::*;
62 changes: 0 additions & 62 deletions render/src/pixel_bender.rs → render/pixel_bender/src/parser.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
//! Pixel bender bytecode parsing code.
//! This is heavily based on https://github.com/jamesward/pbjas and https://github.com/HaxeFoundation/format/tree/master/format/pbj

#[cfg(test)]
mod tests;

pub mod disassembly;

use byteorder::{BigEndian, LittleEndian, ReadBytesExt};
use num_traits::FromPrimitive;
use std::{
Expand All @@ -16,8 +11,6 @@ use std::{
};
use thiserror::Error;

use crate::{backend::RawTexture, bitmap::BitmapHandle};

/// The name of a special parameter, which gets automatically filled in with the coordinates
/// of the pixel being processed.
pub const OUT_COORD_NAME: &str = "_OutCoord";
Expand Down Expand Up @@ -307,61 +300,6 @@ pub enum Operation {
},
}

#[derive(Debug, Clone, PartialEq)]
pub enum PixelBenderShaderArgument<'a> {
ImageInput {
index: u8,
channels: u8,
name: String,
texture: Option<ImageInputTexture<'a>>,
},
ValueInput {
index: u8,
value: PixelBenderType,
},
}

/// An image input.
///
/// This accepts both an owned BitmapHandle, and a borrowed texture
/// (used when applying a filter to a texture that we don't have
/// ownership of, and therefore cannot construct a BitmapHandle for).
#[derive(Debug, Clone)]
pub enum ImageInputTexture<'a> {
Bitmap(BitmapHandle),
TextureRef(&'a dyn RawTexture),
Bytes {
width: u32,
height: u32,
channels: u32,
bytes: Vec<u8>,
},
}

impl PartialEq for ImageInputTexture<'_> {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Self::Bitmap(self_bitmap), Self::Bitmap(other_bitmap)) => self_bitmap == other_bitmap,
(Self::TextureRef(self_texture), Self::TextureRef(other_texture)) => {
self_texture.equals(*other_texture)
}
_ => false,
}
}
}

impl From<BitmapHandle> for ImageInputTexture<'_> {
fn from(b: BitmapHandle) -> Self {
ImageInputTexture::Bitmap(b)
}
}

impl<'a> From<&'a dyn RawTexture> for ImageInputTexture<'a> {
fn from(t: &'a dyn RawTexture) -> Self {
ImageInputTexture::TextureRef(t)
}
}

#[derive(Debug, PartialEq, Clone)]
pub struct PixelBenderShader {
pub name: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
use crate::pixel_bender::{
use crate::parser::{
Opcode, Operation, PixelBenderMetadata, PixelBenderParam, PixelBenderParamQualifier,
PixelBenderReg, PixelBenderRegChannel, PixelBenderRegKind, PixelBenderShader, PixelBenderType,
PixelBenderTypeOpcode,
};

use super::parse_shader;
use super::parser::parse_shader;

#[test]
fn simple_shader() {
Expand Down
3 changes: 2 additions & 1 deletion render/src/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ use crate::bitmap::{Bitmap, BitmapHandle, BitmapSource, PixelRegion, RgbaBufRead
use crate::commands::CommandList;
use crate::error::Error;
use crate::filters::Filter;
use crate::pixel_bender::{PixelBenderShader, PixelBenderShaderArgument, PixelBenderShaderHandle};
use crate::pixel_bender::{PixelBenderShader, PixelBenderShaderHandle};
use crate::pixel_bender_support::PixelBenderShaderArgument;
use crate::quality::StageQuality;
use crate::shape_utils::DistilledShape;
use ruffle_wstr::WStr;
Expand Down
3 changes: 2 additions & 1 deletion render/src/backend/null.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ use crate::bitmap::{
};
use crate::commands::CommandList;
use crate::error::Error;
use crate::pixel_bender::{PixelBenderShader, PixelBenderShaderArgument, PixelBenderShaderHandle};
use crate::pixel_bender::{PixelBenderShader, PixelBenderShaderHandle};
use crate::pixel_bender_support::PixelBenderShaderArgument;
use crate::quality::StageQuality;
use crate::shape_utils::DistilledShape;
use swf::Color;
Expand Down
7 changes: 3 additions & 4 deletions render/src/filters.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use crate::{
bitmap::BitmapHandle,
pixel_bender::{PixelBenderShaderArgument, PixelBenderShaderHandle},
};
use crate::bitmap::BitmapHandle;
use crate::pixel_bender::PixelBenderShaderHandle;
use crate::pixel_bender_support::PixelBenderShaderArgument;
use std::{any::Any, fmt::Debug};
use swf::{Color, Rectangle, Twips};

Expand Down
4 changes: 3 additions & 1 deletion render/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ pub mod lines;
pub mod matrix;
pub mod matrix3d;
pub mod perspective_projection;
pub mod pixel_bender;
pub mod pixel_bender_support;
// The `renderdoc` crate doesn't compile on apple platforms
#[cfg(all(feature = "renderdoc", not(target_vendor = "apple")))]
pub mod renderdoc;
Expand All @@ -23,3 +23,5 @@ pub mod commands;
pub mod quality;
#[cfg(feature = "tessellator")]
pub mod tessellator;

pub use pixel_bender;
58 changes: 58 additions & 0 deletions render/src/pixel_bender_support.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
use crate::backend::RawTexture;
use crate::bitmap::BitmapHandle;
use crate::pixel_bender::PixelBenderType;

#[derive(Debug, Clone, PartialEq)]
pub enum PixelBenderShaderArgument<'a> {
ImageInput {
index: u8,
channels: u8,
name: String,
texture: Option<ImageInputTexture<'a>>,
},
ValueInput {
index: u8,
value: PixelBenderType,
},
}

/// An image input.
///
/// This accepts both an owned BitmapHandle, and a borrowed texture
/// (used when applying a filter to a texture that we don't have
/// ownership of, and therefore cannot construct a BitmapHandle for).
#[derive(Debug, Clone)]
pub enum ImageInputTexture<'a> {
Bitmap(BitmapHandle),
TextureRef(&'a dyn RawTexture),
Bytes {
width: u32,
height: u32,
channels: u32,
bytes: Vec<u8>,
},
}

impl PartialEq for ImageInputTexture<'_> {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Self::Bitmap(self_bitmap), Self::Bitmap(other_bitmap)) => self_bitmap == other_bitmap,
(Self::TextureRef(self_texture), Self::TextureRef(other_texture)) => {
self_texture.equals(*other_texture)
}
_ => false,
}
}
}

impl From<BitmapHandle> for ImageInputTexture<'_> {
fn from(b: BitmapHandle) -> Self {
ImageInputTexture::Bitmap(b)
}
}

impl<'a> From<&'a dyn RawTexture> for ImageInputTexture<'a> {
fn from(t: &'a dyn RawTexture) -> Self {
ImageInputTexture::TextureRef(t)
}
}
2 changes: 1 addition & 1 deletion render/webgl/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1217,7 +1217,7 @@ impl RenderBackend for WebGlRenderBackend {
fn run_pixelbender_shader(
&mut self,
_handle: ruffle_render::pixel_bender::PixelBenderShaderHandle,
_arguments: &[ruffle_render::pixel_bender::PixelBenderShaderArgument],
_arguments: &[ruffle_render::pixel_bender_support::PixelBenderShaderArgument],
_target: &PixelBenderTarget,
) -> Result<PixelBenderOutput, BitmapError> {
Err(BitmapError::Unimplemented("run_pixelbender_shader".into()))
Expand Down
5 changes: 2 additions & 3 deletions render/wgpu/src/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,8 @@ use ruffle_render::bitmap::{
use ruffle_render::commands::CommandList;
use ruffle_render::error::Error as BitmapError;
use ruffle_render::filters::Filter;
use ruffle_render::pixel_bender::{
PixelBenderShader, PixelBenderShaderArgument, PixelBenderShaderHandle,
};
use ruffle_render::pixel_bender::{PixelBenderShader, PixelBenderShaderHandle};
use ruffle_render::pixel_bender_support::PixelBenderShaderArgument;
use ruffle_render::quality::StageQuality;
use ruffle_render::shape_utils::DistilledShape;
use ruffle_render::tessellator::ShapeTessellator;
Expand Down
2 changes: 1 addition & 1 deletion render/wgpu/src/filters/shader.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use ruffle_render::{
filters::ShaderFilter as ShaderFilterArgs,
pixel_bender::{ImageInputTexture, PixelBenderShaderArgument},
pixel_bender_support::{ImageInputTexture, PixelBenderShaderArgument},
};

use crate::{
Expand Down
10 changes: 4 additions & 6 deletions render/wgpu/src/pixel_bender.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,13 @@ use std::num::NonZeroU64;
use std::{borrow::Cow, cell::Cell, sync::Arc};

use indexmap::IndexMap;
use ruffle_render::bitmap::BitmapHandle;
use ruffle_render::error::Error as BitmapError;
use ruffle_render::pixel_bender::{
ImageInputTexture, PixelBenderShaderHandle, PixelBenderShaderImpl, PixelBenderType,
OUT_COORD_NAME,
};
use ruffle_render::{
bitmap::BitmapHandle,
pixel_bender::{PixelBenderParam, PixelBenderShader, PixelBenderShaderArgument},
PixelBenderParam, PixelBenderShader, PixelBenderShaderHandle, PixelBenderShaderImpl,
PixelBenderType, OUT_COORD_NAME,
};
use ruffle_render::pixel_bender_support::{ImageInputTexture, PixelBenderShaderArgument};
use smallvec::{smallvec_inline, SmallVec};
use wgpu::util::{DeviceExt, StagingBelt};
use wgpu::{
Expand Down
2 changes: 1 addition & 1 deletion render/wgpu/src/surface.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use crate::surface::commands::{chunk_blends, Chunk, CommandRenderer};
use crate::utils::{remove_srgb, supported_sample_count};
use crate::{Descriptors, MaskState, Pipelines};
use ruffle_render::commands::CommandList;
use ruffle_render::pixel_bender::{ImageInputTexture, PixelBenderShaderArgument};
use ruffle_render::pixel_bender_support::{ImageInputTexture, PixelBenderShaderArgument};
use ruffle_render::quality::StageQuality;
use std::sync::Arc;
use target::CommandTarget;
Expand Down
Loading