wgpu/tests/in/operators.wgsl

113 lines
2.5 KiB
WebGPU Shading Language
Raw Normal View History

2021-07-22 19:31:05 +00:00
//TODO: support splatting constructors for globals?
let v_f32_one = vec4<f32>(1.0, 1.0, 1.0, 1.0);
let v_f32_zero = vec4<f32>(0.0, 0.0, 0.0, 0.0);
let v_f32_half = vec4<f32>(0.5, 0.5, 0.5, 0.5);
let v_i32_one = vec4<i32>(1, 1, 1, 1);
2021-07-22 19:31:05 +00:00
fn builtins() -> vec4<f32> {
// select()
let condition = true;
let s1 = select(0, 1, condition);
let s2 = select(v_f32_zero, v_f32_one, condition);
2021-08-04 22:59:25 +00:00
let s3 = select(v_f32_one, v_f32_zero, vec4<bool>(false, false, false, false));
2021-07-22 19:31:05 +00:00
// mix()
let m1 = mix(v_f32_zero, v_f32_one, v_f32_half);
let m2 = mix(v_f32_zero, v_f32_one, 0.1);
// bitcast()
let b1 = bitcast<f32>(v_i32_one.x);
let b2 = bitcast<vec4<f32>>(v_i32_one);
2021-09-10 01:04:38 +00:00
// convert
let v_i32_zero = vec4<i32>(v_f32_zero);
2021-07-22 19:31:05 +00:00
// done
2021-09-10 01:04:38 +00:00
return vec4<f32>(vec4<i32>(s1) + v_i32_zero) + s2 + m1 + m2 + b1 + b2;
2021-07-22 19:31:05 +00:00
}
2021-04-27 05:10:02 +00:00
fn splat() -> vec4<f32> {
let a = (1.0 + vec2<f32>(2.0) - 3.0) / 4.0;
let b = vec4<i32>(5) % 2;
return a.xyxy + vec4<f32>(b);
}
2021-04-27 05:10:02 +00:00
fn unary() -> i32 {
let a = 1;
if !true { return a; } else { return ~a; };
2021-04-27 05:10:02 +00:00
}
2021-06-28 18:25:30 +00:00
fn bool_cast(x: vec3<f32>) -> vec3<f32> {
let y = vec3<bool>(x);
return vec3<f32>(y);
}
2021-09-03 16:19:00 +00:00
struct Foo {
a: vec4<f32>,
b: i32,
}
2021-09-03 16:19:00 +00:00
fn constructors() -> f32 {
var foo: Foo;
foo = Foo(vec4<f32>(1.0), 1);
let mat2comp = mat2x2<f32>(
1.0, 0.0,
0.0, 1.0,
);
let mat4comp = mat4x4<f32>(
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0,
);
2021-09-03 16:19:00 +00:00
return foo.a.x;
}
fn modulo() {
// Modulo operator on float scalar or vector must be converted to mod function for GLSL
let a = 1 % 1;
let b = 1.0 % 1.0;
let c = vec3<i32>(1) % vec3<i32>(1);
let d = vec3<f32>(1.0) % vec3<f32>(1.0);
}
fn scalar_times_matrix() {
let model = mat4x4<f32>(
vec4<f32>(1.0, 0.0, 0.0, 0.0),
vec4<f32>(0.0, 1.0, 0.0, 0.0),
vec4<f32>(0.0, 0.0, 1.0, 0.0),
vec4<f32>(0.0, 0.0, 0.0, 1.0),
);
let assertion: mat4x4<f32> = 2.0 * model;
}
2022-01-11 15:56:41 +00:00
fn logical() {
2021-12-15 22:30:33 +00:00
let a = true | false;
2021-12-15 22:38:32 +00:00
let b = true & false;
2021-12-15 22:30:33 +00:00
}
2022-01-11 15:56:41 +00:00
fn binary_assignment() {
var a = 1;
a += 1;
a -= 1;
a *= a;
a /= a;
a %= 1;
a ^= 0;
a &= 0;
a++;
a--;
2022-01-11 15:56:41 +00:00
}
2022-01-19 15:33:06 +00:00
@stage(compute) @workgroup_size(1)
2021-06-28 18:25:30 +00:00
fn main() {
2021-07-22 19:31:05 +00:00
let a = builtins();
let b = splat();
let c = unary();
let d = bool_cast(v_f32_one.xyz);
let e = constructors();
modulo();
scalar_times_matrix();
2022-01-11 15:56:41 +00:00
logical();
binary_assignment();
2021-06-28 18:25:30 +00:00
}