vyre 0.4.0

GPU compute intermediate representation with a standard operation library
Documentation
// Unit tests for the CPU reference of `workgroup.visitor`.

use crate::ops::workgroup::primitives::visitor::{VisitError, VisitStatus, WorkgroupVisitor};

#[test]
pub fn first_visit_emits_and_marks_visited() {
    let mut v = WorkgroupVisitor::new(8, 8);
    assert_eq!(v.visit(3), Ok(VisitStatus::FirstVisit));
    assert!(v.is_visited(3));
    assert_eq!(v.emitted(), &[3]);
}

#[test]
pub fn second_visit_is_already_visited_and_does_not_reemit() {
    let mut v = WorkgroupVisitor::new(8, 8);
    v.visit(3).unwrap();
    assert_eq!(v.visit(3), Ok(VisitStatus::AlreadyVisited));
    assert_eq!(v.emitted(), &[3], "repeated visit must not re-emit");
}

#[test]
pub fn visit_out_of_range_errors() {
    let mut v = WorkgroupVisitor::new(4, 8);
    assert_eq!(v.visit(4), Err(VisitError::OutOfRange));
    assert_eq!(v.emitted(), &[] as &[u32]);
}

#[test]
pub fn emission_preserves_first_visit_order() {
    let mut v = WorkgroupVisitor::new(8, 8);
    v.visit(2).unwrap();
    v.visit(5).unwrap();
    v.visit(2).unwrap(); // already visited; order invariant preserved.
    v.visit(1).unwrap();
    assert_eq!(v.emitted(), &[2, 5, 1]);
}

#[test]
pub fn emit_buffer_truncates_at_capacity() {
    let mut v = WorkgroupVisitor::new(16, 2);
    v.visit(1).unwrap();
    v.visit(2).unwrap();
    v.visit(3).unwrap(); // still marks visited, but cannot emit.
    assert!(v.is_visited(3));
    assert_eq!(v.emitted(), &[1, 2]);
}

#[test]
pub fn reset_clears_marks_and_emit_buffer() {
    let mut v = WorkgroupVisitor::new(8, 8);
    v.visit(1).unwrap();
    v.visit(2).unwrap();
    v.reset();
    assert!(!v.is_visited(1));
    assert!(v.emitted().is_empty());
    // Re-visiting after reset is a fresh first-visit.
    assert_eq!(v.visit(1), Ok(VisitStatus::FirstVisit));
}

#[test]
pub fn wgsl_kernel_source_exposes_the_expected_entry_point() {
    let wgsl = crate::ops::workgroup::primitives::visitor::lowering::WGSL;
    assert!(
        wgsl.contains("workgroup_visitor_visit"),
        "WGSL lowering must expose the registered entry point"
    );
    assert!(
        wgsl.contains("atomicOr"),
        "visitor lowering must use atomicOr on the visited bitmap"
    );
}