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}