dynamis-gpu 0.7.0

wgpu device, buffer, stream, pipeline, and readback runtime
Documentation
use dynamis_gpu::{BindingKind, parse_bindings};
use std::panic::catch_unwind;

#[test]
fn parses_every_binding_class() {
    let source = "
@group(0) @binding(0) var<uniform> params: StepParams;
@group(0) @binding(1) var<storage, read> bodies: array<BodyState>;
@group(0) @binding(2) var<storage, read_write> counts: array<atomic<u32>>;
@group(1) @binding(0) var<storage, read> shapes: array<ShapeSource>;
";
    let bindings = parse_bindings(source);
    assert_eq!(bindings.len(), 4);
    assert_eq!(bindings[0].name, "params");
    assert_eq!(bindings[0].kind, BindingKind::Uniform);
    assert_eq!(bindings[0].element, "StepParams");
    assert_eq!(bindings[1].name, "bodies");
    assert_eq!(bindings[1].kind, BindingKind::ReadOnlyStorage);
    assert_eq!(bindings[1].element, "BodyState");
    assert_eq!(bindings[2].name, "counts");
    assert_eq!(bindings[2].kind, BindingKind::ReadWriteStorage);
    assert_eq!(bindings[2].element, "u32");
    assert_eq!(bindings[3].group, 1);
    assert_eq!(bindings[3].binding, 0);
}

#[test]
fn parses_the_element_a_binding_exposes() {
    let source = "
@group(0) @binding(0) var<storage, read> sized: array<atomic<u32>, 2048>;
@group(0) @binding(1) var<storage, read_write> words: array<vec4f, 4>;
@group(0) @binding(2) var<storage, read> records: array<QueryResult>;
";
    let bindings = parse_bindings(source);
    assert_eq!(bindings[0].element, "u32");
    assert_eq!(bindings[1].element, "vec4f");
    assert_eq!(bindings[2].element, "QueryResult");
}

#[test]
fn rejects_a_repeated_binding() {
    let source = "
@group(0) @binding(0) var<storage, read> first: array<u32>;
@group(0) @binding(0) var<storage, read> second: array<u32>;
";
    assert!(catch_unwind(|| parse_bindings(source)).is_err());
}

#[test]
fn rejects_an_unknown_binding_class() {
    let source = "@group(0) @binding(0) var<storage, read_write, extra> data: array<u32>;";
    assert!(catch_unwind(|| parse_bindings(source)).is_err());
    let source = "@group(0) @binding(0) var<immediate> data: array<u32>;";
    assert!(catch_unwind(|| parse_bindings(source)).is_err());
}

#[test]
fn rejects_a_truncated_binding() {
    assert!(catch_unwind(|| parse_bindings("@group(0) @binding(0) var<storage, read>")).is_err());
    assert!(catch_unwind(|| parse_bindings("@group(0) @binding(")).is_err());
}

#[test]
fn rejects_a_nameless_binding() {
    let source = "@group(0) @binding(0) var<storage, read> : array<u32>;";
    assert!(catch_unwind(|| parse_bindings(source)).is_err());
}