molgfx-render 0.3.4

The render graph, passes and the engine that drives a frame.
Documentation
use super::*;
use crate::engine::tests::{camera, engine};
use molgfx_core::Scene;

fn config() -> SequenceConfig {
    SequenceConfig::at_fps(
        ImageConfig {
            width: 32,
            height: 24,
        },
        30,
        2,
    )
    .unwrap_or_else(|error| panic!("sequence config is valid: {error}"))
}

#[test]
fn submission_is_bounded_and_preserves_ticket_order() {
    let mut engine = engine();
    let scene = Scene::new();
    let mut sequence = engine
        .sequence(config())
        .unwrap_or_else(|error| panic!("sequence opens: {error}"));
    let first = sequence
        .submit(&mut engine, &scene, &camera(), 0)
        .unwrap_or_else(|error| panic!("first frame submits: {error}"));
    let second = sequence
        .submit(&mut engine, &scene, &camera(), 1)
        .unwrap_or_else(|error| panic!("second frame submits: {error}"));
    assert!(matches!(
        sequence.submit(&mut engine, &scene, &camera(), 2),
        Err(RenderError::SequenceBackpressure { max_in_flight: 2 })
    ));
    let frames = sequence
        .finish(&mut engine)
        .unwrap_or_else(|error| panic!("sequence drains: {error}"));
    assert_eq!(frames[0].ticket, first);
    assert_eq!(frames[1].ticket, second);
}

#[test]
fn timestamps_are_strictly_increasing() {
    let mut engine = engine();
    let scene = Scene::new();
    let mut sequence = engine
        .sequence(config())
        .unwrap_or_else(|error| panic!("sequence opens: {error}"));
    assert!(sequence.submit(&mut engine, &scene, &camera(), 9).is_ok());
    assert!(matches!(
        sequence.submit(&mut engine, &scene, &camera(), 9),
        Err(RenderError::InvalidSequence { .. })
    ));
}

#[test]
fn invalid_pipeline_depth_is_rejected() {
    let engine = engine();
    let invalid = SequenceConfig {
        max_in_flight: 1,
        ..config()
    };
    assert!(matches!(
        engine.sequence(invalid),
        Err(RenderError::InvalidSequence { .. })
    ));
}