//! The adapter, the surface configuration and the target the GPU rigs share, //! so no two of them can probe for a device or make a target in different //! ways. use wgpu::*; /// An adapter on whatever this machine has, or `None` where there is none. /// /// Probed rather than assumed: there may be no Vulkan adapter, and GL is what /// is left when there is not. /// /// The instance is leaked deliberately. A Vulkan loader may unload the driver /// when the last one drops, which can fault as a thread that used it exits -- /// and every test runs on a spawned thread. pub fn adapter() -> Option { let all = Instance::new(InstanceDescriptor::new_without_display_handle()); let instance = match pollster::block_on(all.request_adapter(&RequestAdapterOptions::default())) { Ok(_) => all, Err(_) => Instance::new(InstanceDescriptor { backends: Backends::GL, ..InstanceDescriptor::new_without_display_handle() }), }; let instance: &'static Instance = Box::leak(Box::new(instance)); pollster::block_on(instance.request_adapter(&RequestAdapterOptions::default())).ok() } pub fn config(format: TextureFormat, size: u32) -> SurfaceConfiguration { SurfaceConfiguration { usage: TextureUsages::RENDER_ATTACHMENT, format, color_space: SurfaceColorSpace::Auto, width: size, height: size, present_mode: PresentMode::Fifo, desired_maximum_frame_latency: 2, alpha_mode: CompositeAlphaMode::Auto, view_formats: vec![], } } /// A square colour target to draw a pass into. `copy` adds the usage a rig /// that reads the pixels back needs; one that only times the pass does not. // This module is compiled into each rig target separately, so a helper the // ones that make no target of their own do not call is dead code there. #[allow(dead_code)] pub fn target(device: &Device, format: TextureFormat, size: u32, copy: bool) -> Texture { device.create_texture(&TextureDescriptor { label: Some("gpu rig target"), size: Extent3d { width: size, height: size, depth_or_array_layers: 1, }, mip_level_count: 1, sample_count: 1, dimension: TextureDimension::D2, format, usage: match copy { true => TextureUsages::RENDER_ATTACHMENT | TextureUsages::COPY_SRC, false => TextureUsages::RENDER_ATTACHMENT, }, view_formats: &[], }) }