wgpu/tests/in/access.wgsl

118 lines
2.7 KiB
WebGPU Shading Language
Raw Normal View History

// This snapshot tests accessing various containers, dereferencing pointers.
2022-01-21 15:28:50 +00:00
struct AlignedWrapper {
@align(8) value: i32
}
2022-01-21 15:28:50 +00:00
struct Bar {
matrix: mat4x3<f32>,
matrix_array: array<mat2x2<f32>, 2>,
atom: atomic<i32>,
arr: array<vec2<u32>, 2>,
data: array<AlignedWrapper>,
}
2022-01-19 15:33:06 +00:00
@group(0) @binding(0)
var<storage,read_write> bar: Bar;
struct Baz {
m: mat3x2<f32>,
}
@group(0) @binding(1)
var<uniform> baz: Baz;
fn test_matrix_within_struct_accesses() {
var idx = 9;
idx--;
// loads
var _ = baz.m;
var _ = baz.m[0];
var _ = baz.m[idx];
var _ = baz.m[0][1];
var _ = baz.m[0][idx];
var _ = baz.m[idx][1];
var _ = baz.m[idx][idx];
var t = Baz(mat3x2<f32>(vec2<f32>(1.0), vec2<f32>(2.0), vec2<f32>(3.0)));
idx++;
// stores
t.m = mat3x2<f32>(vec2<f32>(6.0), vec2<f32>(5.0), vec2<f32>(4.0));
t.m[0] = vec2<f32>(9.0);
t.m[idx] = vec2<f32>(90.0);
t.m[0][1] = 10.0;
t.m[0][idx] = 20.0;
t.m[idx][1] = 30.0;
t.m[idx][idx] = 40.0;
}
fn read_from_private(foo: ptr<function, f32>) -> f32 {
return *foo;
}
fn test_arr_as_arg(a: array<array<f32, 10>, 5>) -> f32 {
return a[4][9];
}
@vertex
fn foo_vert(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4<f32> {
var foo: f32 = 0.0;
// We should check that backed doesn't skip this expression
let baz: f32 = foo;
foo = 1.0;
test_matrix_within_struct_accesses();
2021-07-25 05:36:38 +00:00
// test storage loads
let matrix = bar.matrix;
let arr = bar.arr;
2021-05-04 02:47:33 +00:00
let index = 3u;
let b = bar.matrix[index].x;
2022-01-21 15:28:50 +00:00
let a = bar.data[arrayLength(&bar.data) - 2u].value;
// test pointer types
2022-01-21 15:28:50 +00:00
let data_pointer: ptr<storage, i32, read_write> = &bar.data[0].value;
let foo_value = read_from_private(&foo);
2021-07-25 05:36:38 +00:00
// test array indexing
2021-07-06 05:16:15 +00:00
var c = array<i32, 5>(a, i32(b), 3, 4, 5);
c[vi + 1u] = 42;
let value = c[vi];
2021-05-04 02:47:33 +00:00
var _ = test_arr_as_arg(array<array<f32, 10>, 5>());
return vec4<f32>(matrix * vec4<f32>(vec4<i32>(value)), 2.0);
}
@fragment
fn foo_frag() -> @location(0) vec4<f32> {
// test storage stores
bar.matrix[1].z = 1.0;
bar.matrix = mat4x3<f32>(vec3<f32>(0.0), vec3<f32>(1.0), vec3<f32>(2.0), vec3<f32>(3.0));
bar.arr = array<vec2<u32>, 2>(vec2<u32>(0u), vec2<u32>(1u));
bar.data[1].value = 1;
return vec4<f32>(0.0);
}
@compute @workgroup_size(1)
fn atomics() {
var tmp: i32;
let value = atomicLoad(&bar.atom);
2021-08-05 19:13:25 +00:00
tmp = atomicAdd(&bar.atom, 5);
2021-08-24 21:45:29 +00:00
tmp = atomicSub(&bar.atom, 5);
2021-08-05 19:13:25 +00:00
tmp = atomicAnd(&bar.atom, 5);
tmp = atomicOr(&bar.atom, 5);
tmp = atomicXor(&bar.atom, 5);
tmp = atomicMin(&bar.atom, 5);
tmp = atomicMax(&bar.atom, 5);
tmp = atomicExchange(&bar.atom, 5);
// https://github.com/gpuweb/gpuweb/issues/2021
// tmp = atomicCompareExchangeWeak(&bar.atom, 5, 5);
atomicStore(&bar.atom, value);
}