molgfx-gpu 0.4.1

The backend-agnostic GPU hardware abstraction: device, queue, encoder and surface traits.
Documentation
use super::*;

fn capture(max_passes: u32) -> PassTimestampCapture<()> {
    PassTimestampCapture {
        queries: Some(()),
        records: Vec::with_capacity(max_passes as usize),
        max_passes,
        next_query: 0,
        passes_seen: 0,
        sample: None,
    }
}

#[test]
fn repeated_pass_labels_and_samples_receive_distinct_query_pairs() {
    let mut capture = capture(3);
    capture.set_sample(Some(4));
    assert_eq!(
        capture.record_pass("repeat", TimestampPassKind::Render, false),
        Some(TimestampQueryPair {
            beginning: 0,
            end: 1
        })
    );
    assert_eq!(
        capture.record_pass("repeat", TimestampPassKind::Compute, false),
        Some(TimestampQueryPair {
            beginning: 2,
            end: 3
        })
    );
    capture.set_sample(Some(5));
    assert_eq!(
        capture.record_pass("repeat", TimestampPassKind::Render, false),
        Some(TimestampQueryPair {
            beginning: 4,
            end: 5
        })
    );
    assert_eq!(capture.query_range(), 0..6);
    assert_eq!(
        capture
            .records()
            .iter()
            .map(|r| (r.occurrence, r.sample, r.kind))
            .collect::<Vec<_>>(),
        vec![
            (0, Some(4), TimestampPassKind::Render),
            (1, Some(4), TimestampPassKind::Compute),
            (2, Some(5), TimestampPassKind::Render),
        ]
    );
    assert_eq!(capture.incomplete(), None);
}

#[test]
fn overflow_never_reuses_queries_and_reports_every_omitted_occurrence() {
    let mut capture = capture(1);
    capture.record_pass("first", TimestampPassKind::Compute, false);
    for _ in 0..3 {
        assert_eq!(
            capture.record_pass("overflow", TimestampPassKind::Render, false),
            None
        );
    }
    assert_eq!(capture.query_range(), 0..2);
    assert_eq!(capture.records()[0].label, "first");
    assert_eq!(capture.passes_seen(), 4);
    assert_eq!(
        capture.incomplete(),
        Some(TimestampCaptureIncomplete::CapacityExceeded {
            capacity: 1,
            omitted_passes: 3
        })
    );
    capture.reset();
    assert_eq!(
        capture.record_pass("next submission", TimestampPassKind::Compute, false),
        Some(TimestampQueryPair {
            beginning: 0,
            end: 1
        })
    );
    assert_eq!(capture.incomplete(), None);
    assert_eq!(capture.records()[0].occurrence, 0);
    assert_eq!(capture.records()[0].sample, None);
}

#[test]
fn descriptor_owned_writes_are_absent_from_the_capture_resolve_range() {
    let mut capture = capture(3);
    assert_eq!(
        capture.record_pass("caller timed", TimestampPassKind::Render, true),
        None
    );
    assert_eq!(
        capture.records()[0].queries,
        Err(PassTimestampAbsence::DescriptorTimestampWrites)
    );
    assert_eq!(capture.query_range(), 0..0);
    assert_eq!(
        capture.record_pass("captured", TimestampPassKind::Compute, false),
        Some(TimestampQueryPair {
            beginning: 0,
            end: 1
        })
    );
    assert_eq!(capture.query_range(), 0..2);
    assert_eq!(capture.records()[1].occurrence, 1);
}

#[test]
fn metadata_only_capture_counts_passes_without_query_slots_or_fake_timings() {
    let mut capture = PassTimestampCapture::<()>::metadata_only(2).expect("metadata allocates");
    capture.set_sample(Some(3));
    assert_eq!(
        capture.record_pass("render", TimestampPassKind::Render, false),
        None
    );
    assert_eq!(
        capture.record_pass("compute", TimestampPassKind::Compute, false),
        None
    );
    assert_eq!(
        capture.records()[0].queries,
        Err(PassTimestampAbsence::Unsupported)
    );
    assert_eq!(capture.records()[1].sample, Some(3));
    assert_eq!(capture.records()[1].kind, TimestampPassKind::Compute);
    assert_eq!(capture.query_range(), 0..0);
    assert_eq!(capture.query_capacity(), 0);
    assert!(capture.queries().is_none());
    capture.record_pass("overflow", TimestampPassKind::Render, false);
    assert_eq!(
        capture.incomplete(),
        Some(TimestampCaptureIncomplete::CapacityExceeded {
            capacity: 2,
            omitted_passes: 1
        })
    );
}