cranpose 0.1.162

Cranpose runtime and UI facade
Documentation
use cranpose_app_shell::FramePacingMode;
use wgpu::{PresentMode, SurfaceCapabilities, TextureFormat};

use super::{
    parse_present_mode, select_android_present_mode_for_request,
    select_present_mode_for_frame_pacing, select_present_mode_for_request,
};

#[test]
fn automatic_presentation_reports_the_backend_fallback() {
    for (requested, supported, resolved) in [
        (PresentMode::AutoNoVsync, vec![PresentMode::Fifo], PresentMode::Fifo),
        (PresentMode::AutoNoVsync, vec![PresentMode::Fifo, PresentMode::Mailbox], PresentMode::Mailbox),
        (PresentMode::AutoNoVsync, vec![PresentMode::Mailbox, PresentMode::Immediate], PresentMode::Immediate),
        (PresentMode::AutoVsync, vec![PresentMode::Fifo, PresentMode::FifoRelaxed], PresentMode::FifoRelaxed),
        (PresentMode::Immediate, vec![PresentMode::Fifo, PresentMode::Immediate], PresentMode::Immediate),
    ] {
        assert_eq!(super::resolved_present_mode(requested, &caps(&supported)), resolved);
    }
}

fn caps(present_modes: &[PresentMode]) -> SurfaceCapabilities {
    SurfaceCapabilities {
        formats: vec![TextureFormat::Bgra8UnormSrgb],
        present_modes: present_modes.to_vec(),
        ..Default::default()
    }
}

#[test]
fn default_prefers_no_vsync_even_when_fifo_is_available() {
    let caps = caps(&[PresentMode::Fifo]);

    assert_eq!(
        select_present_mode_for_request(&caps, None),
        PresentMode::AutoNoVsync
    );
}

#[test]
fn explicit_supported_present_mode_is_honored() {
    let caps = caps(&[PresentMode::Fifo, PresentMode::Immediate]);

    assert_eq!(
        select_present_mode_for_request(&caps, Some(PresentMode::Fifo)),
        PresentMode::Fifo
    );
    assert_eq!(
        select_present_mode_for_request(&caps, Some(PresentMode::Immediate)),
        PresentMode::Immediate
    );
}

#[test]
fn explicit_auto_modes_do_not_need_surface_capability_entries() {
    let caps = caps(&[PresentMode::Fifo]);

    assert_eq!(
        select_present_mode_for_request(&caps, Some(PresentMode::AutoNoVsync)),
        PresentMode::AutoNoVsync
    );
    assert_eq!(
        select_present_mode_for_request(&caps, Some(PresentMode::AutoVsync)),
        PresentMode::AutoVsync
    );
}

#[test]
fn unsupported_explicit_mode_falls_back_to_no_vsync() {
    let caps = caps(&[PresentMode::Fifo]);

    assert_eq!(
        select_present_mode_for_request(&caps, Some(PresentMode::Immediate)),
        PresentMode::AutoNoVsync
    );
}

#[test]
fn android_defaults_to_fifo_rather_than_the_free_running_auto_no_vsync() {
    let caps = caps(&[PresentMode::Mailbox, PresentMode::Fifo]);

    assert_eq!(
        select_android_present_mode_for_request(&caps, None),
        PresentMode::Fifo
    );
}

#[test]
fn android_falls_back_to_auto_vsync_when_fifo_is_unavailable() {
    let caps = caps(&[PresentMode::Mailbox]);

    assert_eq!(
        select_android_present_mode_for_request(&caps, None),
        PresentMode::AutoVsync
    );
}

#[test]
fn android_honors_an_explicit_present_mode_request() {
    let caps = caps(&[PresentMode::Mailbox, PresentMode::Fifo]);

    assert_eq!(
        select_android_present_mode_for_request(&caps, Some(PresentMode::Mailbox)),
        PresentMode::Mailbox
    );
    assert_eq!(
        select_android_present_mode_for_request(&caps, Some(PresentMode::AutoNoVsync)),
        PresentMode::AutoNoVsync
    );
}

#[test]
fn parses_present_mode_aliases() {
    assert_eq!(
        parse_present_mode("no_vsync"),
        Some(PresentMode::AutoNoVsync)
    );
    assert_eq!(
        parse_present_mode("auto_vsync"),
        Some(PresentMode::AutoVsync)
    );
    assert_eq!(parse_present_mode("vsync"), Some(PresentMode::Fifo));
    assert_eq!(parse_present_mode("mailbox"), Some(PresentMode::Mailbox));
    assert_eq!(
        parse_present_mode("immediate"),
        Some(PresentMode::Immediate)
    );
    assert_eq!(parse_present_mode("unknown"), None);
}

#[test]
fn frame_pacing_maps_vsync_and_no_vsync_to_surface_modes() {
    let caps = caps(&[PresentMode::Fifo, PresentMode::Immediate]);

    assert_eq!(
        select_present_mode_for_frame_pacing(&caps, FramePacingMode::Vsync),
        PresentMode::Fifo
    );
    assert_eq!(
        select_present_mode_for_frame_pacing(&caps, FramePacingMode::NoVsync),
        PresentMode::Immediate
    );
    assert_eq!(
        select_present_mode_for_frame_pacing(&caps, FramePacingMode::Hard60),
        PresentMode::Immediate
    );
    assert_eq!(
        select_present_mode_for_frame_pacing(&caps, FramePacingMode::Hard120),
        PresentMode::Immediate
    );
}

#[test]
fn frame_pacing_falls_back_to_auto_modes_when_explicit_modes_are_unavailable() {
    let caps = caps(&[]);

    assert_eq!(
        select_present_mode_for_frame_pacing(&caps, FramePacingMode::Vsync),
        PresentMode::AutoVsync
    );
    assert_eq!(
        select_present_mode_for_frame_pacing(&caps, FramePacingMode::NoVsync),
        PresentMode::AutoNoVsync
    );
}