Skip to content

Commit ef92742

Browse files
committed
pixelbender: Implement boolean parameters
Implementation is based mostly on tests and assumes that boolean parameters behave similarly to int parameters.
1 parent 234ebf9 commit ef92742

File tree

4 files changed

+60
-1
lines changed

4 files changed

+60
-1
lines changed

core/src/pixel_bender.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,21 @@ impl PixelBenderTypeExt for PixelBenderType {
180180
PixelBenderType::TInt4(i1, i2, i3, i4) => {
181181
vec![(*i1).into(), (*i2).into(), (*i3).into(), (*i4).into()]
182182
}
183+
PixelBenderType::TBool(b) => vec![(*b as i16).into()],
184+
PixelBenderType::TBool2(b1, b2) => vec![(*b1 as i16).into(), (*b2 as i16).into()],
185+
PixelBenderType::TBool3(b1, b2, b3) => vec![
186+
(*b1 as i16).into(),
187+
(*b2 as i16).into(),
188+
(*b3 as i16).into(),
189+
],
190+
PixelBenderType::TBool4(b1, b2, b3, b4) => {
191+
vec![
192+
(*b1 as i16).into(),
193+
(*b2 as i16).into(),
194+
(*b3 as i16).into(),
195+
(*b4 as i16).into(),
196+
]
197+
}
183198
};
184199
let storage = ArrayStorage::from_args(&vals);
185200
Ok(ArrayObject::from_storage(activation, storage).into())

render/naga-pixelbender/src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,11 @@ impl ShaderBuilder<'_> {
487487
num_vec4fs += 1;
488488
(float_offset, ParamKind::Float)
489489
}
490-
PixelBenderTypeOpcode::TInt
490+
PixelBenderTypeOpcode::TBool
491+
| PixelBenderTypeOpcode::TBool2
492+
| PixelBenderTypeOpcode::TBool3
493+
| PixelBenderTypeOpcode::TBool4
494+
| PixelBenderTypeOpcode::TInt
491495
| PixelBenderTypeOpcode::TInt2
492496
| PixelBenderTypeOpcode::TInt3
493497
| PixelBenderTypeOpcode::TInt4 => {

render/src/pixel_bender.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ pub enum PixelBenderType {
4747
TInt3(i16, i16, i16) = 0xA,
4848
TInt4(i16, i16, i16, i16) = 0xB,
4949
TString(String) = 0xC,
50+
TBool(bool) = 0xD,
51+
TBool2(bool, bool) = 0xE,
52+
TBool3(bool, bool, bool) = 0xF,
53+
TBool4(bool, bool, bool, bool) = 0x10,
5054
}
5155

5256
// FIXME - come up with a way to reduce duplication here
@@ -64,6 +68,10 @@ pub enum PixelBenderTypeOpcode {
6468
TInt3 = 0xA,
6569
TInt4 = 0xB,
6670
TString = 0xC,
71+
TBool = 0xD,
72+
TBool2 = 0xE,
73+
TBool3 = 0xF,
74+
TBool4 = 0x10,
6775
}
6876

6977
#[derive(Debug, PartialEq, Copy, Clone)]
@@ -140,6 +148,10 @@ impl Display for PixelBenderTypeOpcode {
140148
PixelBenderTypeOpcode::TInt3 => "int3",
141149
PixelBenderTypeOpcode::TInt4 => "int4",
142150
PixelBenderTypeOpcode::TString => "string",
151+
PixelBenderTypeOpcode::TBool => "bool",
152+
PixelBenderTypeOpcode::TBool2 => "bool2",
153+
PixelBenderTypeOpcode::TBool3 => "bool3",
154+
PixelBenderTypeOpcode::TBool4 => "bool4",
143155
}
144156
)
145157
}
@@ -726,6 +738,24 @@ fn read_value<R: Read>(
726738
data.read_i16::<LittleEndian>()?,
727739
)),
728740
PixelBenderTypeOpcode::TString => Ok(PixelBenderType::TString(read_string(data)?)),
741+
PixelBenderTypeOpcode::TBool => Ok(PixelBenderType::TBool(
742+
data.read_i16::<LittleEndian>()? != 0,
743+
)),
744+
PixelBenderTypeOpcode::TBool2 => Ok(PixelBenderType::TBool2(
745+
data.read_i16::<LittleEndian>()? != 0,
746+
data.read_i16::<LittleEndian>()? != 0,
747+
)),
748+
PixelBenderTypeOpcode::TBool3 => Ok(PixelBenderType::TBool3(
749+
data.read_i16::<LittleEndian>()? != 0,
750+
data.read_i16::<LittleEndian>()? != 0,
751+
data.read_i16::<LittleEndian>()? != 0,
752+
)),
753+
PixelBenderTypeOpcode::TBool4 => Ok(PixelBenderType::TBool4(
754+
data.read_i16::<LittleEndian>()? != 0,
755+
data.read_i16::<LittleEndian>()? != 0,
756+
data.read_i16::<LittleEndian>()? != 0,
757+
data.read_i16::<LittleEndian>()? != 0,
758+
)),
729759
}
730760
}
731761

render/wgpu/src/pixel_bender.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,16 @@ pub(super) fn run_pixelbender_shader_impl(
588588
FloatOrInt::Float(vec4_arr)
589589
}
590590
PixelBenderType::TFloat4x4(arr) => FloatOrInt::Float(arr.to_vec()),
591+
PixelBenderType::TBool(b1) => FloatOrInt::Int(vec![*b1 as i32, 0, 0, 0]),
592+
PixelBenderType::TBool2(b1, b2) => {
593+
FloatOrInt::Int(vec![*b1 as i32, *b2 as i32, 0, 0])
594+
}
595+
PixelBenderType::TBool3(b1, b2, b3) => {
596+
FloatOrInt::Int(vec![*b1 as i32, *b2 as i32, *b3 as i32, 0])
597+
}
598+
PixelBenderType::TBool4(b1, b2, b3, b4) => {
599+
FloatOrInt::Int(vec![*b1 as i32, *b2 as i32, *b3 as i32, *b4 as i32])
600+
}
591601
_ => unreachable!("Unimplemented value {value:?}"),
592602
};
593603

0 commit comments

Comments
 (0)