Skip to main content

pfx_live/
viewport.rs

1pub fn apply(pass: &mut wgpu::RenderPass<'_>, size: [u32; 2]) {
2    pass.set_viewport(0.0, 0.0, size[0] as f32, size[1] as f32, 0.0, 1.0);
3    pass.set_scissor_rect(0, 0, size[0], size[1]);
4}
5
6pub fn check(size: [u32; 2], capacity: [u32; 2]) -> Result<(), String> {
7    if size[0] == 0 || size[1] == 0 || size[0] > capacity[0] || size[1] > capacity[1] {
8        return Err(format!(
9            "the viewport {}x{} must be at least 1 by 1 and inside the targets' {}x{}",
10            size[0], size[1], capacity[0], capacity[1]
11        ));
12    }
13    Ok(())
14}
15
16pub fn mip(size: u32, level: u32) -> u32 {
17    (size >> level).max(1)
18}
19
20#[cfg(test)]
21mod tests {
22    use super::*;
23
24    #[test]
25    fn a_viewport_must_fit_its_targets() {
26        assert!(check([4, 3], [4, 3]).is_ok());
27        assert!(check([1, 1], [4, 3]).is_ok());
28        assert!(check([0, 3], [4, 3]).is_err());
29        assert!(check([5, 3], [4, 3]).is_err());
30        assert!(check([4, 4], [4, 3]).is_err());
31        assert_eq!(mip(960, 3), 120);
32        assert_eq!(mip(5, 3), 1);
33    }
34}