engineComputeShaders top-level constant

Map<String, WebGpuComputeStage> const engineComputeShaders

The engine's compute stages, in WGSL, with their bindings.

Implementation

const Map<String, WebGpuComputeStage> engineComputeShaders =
    <String, WebGpuComputeStage>{
      'PrefixSum': WebGpuComputeStage(
        wgsl: r'''
struct Values {
    values: array<u32>,
}

var<private> gl_LocalInvocationID_1: vec3<u32>;
@group(0) @binding(0)
var<storage, read_write> values_buffer: Values;
var<workgroup> partial: array<u32, 256>;

fn main_1() {
    var i: u32;
    var base: u32;
    var s0_: u32;
    var s1_: u32;
    var s2_: u32;
    var s3_: u32;
    var offset: u32;
    var add: u32;
    var local: u32;
    var before: u32;
    var local_1: u32;

    let _e24 = gl_LocalInvocationID_1[0u];
    i = _e24;
    let _e25 = i;
    base = (_e25 * 4u);
    let _e27 = base;
    let _e30 = values_buffer.values[_e27];
    s0_ = _e30;
    let _e31 = s0_;
    let _e32 = base;
    let _e36 = values_buffer.values[(_e32 + 1u)];
    s1_ = (_e31 + _e36);
    let _e38 = s1_;
    let _e39 = base;
    let _e43 = values_buffer.values[(_e39 + 2u)];
    s2_ = (_e38 + _e43);
    let _e45 = s2_;
    let _e46 = base;
    let _e50 = values_buffer.values[(_e46 + 3u)];
    s3_ = (_e45 + _e50);
    let _e52 = i;
    let _e53 = s3_;
    partial[_e52] = _e53;
    workgroupBarrier();
    offset = 1u;
    loop {
        let _e55 = offset;
        if (_e55 < 256u) {
            let _e57 = i;
            let _e58 = offset;
            if (_e57 >= _e58) {
                let _e60 = i;
                let _e61 = offset;
                let _e64 = partial[(_e60 - _e61)];
                local = _e64;
            } else {
                local = 0u;
            }
            let _e65 = local;
            add = _e65;
            workgroupBarrier();
            let _e66 = i;
            let _e67 = add;
            let _e69 = partial[_e66];
            partial[_e66] = (_e69 + _e67);
            workgroupBarrier();
            continue;
        } else {
            break;
        }
        continuing {
            let _e72 = offset;
            offset = (_e72 << bitcast<u32>(1u));
        }
    }
    let _e75 = i;
    if (_e75 == 0u) {
        local_1 = 0u;
    } else {
        let _e77 = i;
        let _e80 = partial[(_e77 - 1u)];
        local_1 = _e80;
    }
    let _e81 = local_1;
    before = _e81;
    let _e82 = base;
    let _e83 = before;
    let _e84 = s0_;
    values_buffer.values[_e82] = (_e83 + _e84);
    let _e88 = base;
    let _e90 = before;
    let _e91 = s1_;
    values_buffer.values[(_e88 + 1u)] = (_e90 + _e91);
    let _e95 = base;
    let _e97 = before;
    let _e98 = s2_;
    values_buffer.values[(_e95 + 2u)] = (_e97 + _e98);
    let _e102 = base;
    let _e104 = before;
    let _e105 = s3_;
    values_buffer.values[(_e102 + 3u)] = (_e104 + _e105);
    return;
}

@compute @workgroup_size(256, 1, 1)
fn main(@builtin(local_invocation_id) gl_LocalInvocationID: vec3<u32>) {
    gl_LocalInvocationID_1 = gl_LocalInvocationID;
    main_1();
}
''',
        workgroupSize: (256, 1, 1),
        storage: <WebGpuStorageBinding>[
          WebGpuStorageBinding(
            name: 'Values',
            group: 0,
            binding: 0,
            readOnly: false,
          ),
        ],
        blocks: <WebGpuBlock>[],
      ),
    };