wgpu_quick_start/
sync_nowindow.rs

1//! A module to create `wgpu::Device` not necessarily from a window
2//!
3//!
4
5/// This synchronous function helps create a new device without any window
6///
7/// Available with `enable-sync` feature. (Hence, not available by default).
8///
9/// Can be enabled as below in the crate when being used.
10///
11/// ```toml
12/// wgpu_quick_start = { version="0.28.3", features = ["enable-sync"] }
13/// ```
14///
15/// ## Usage
16///
17/// Following is an example of using `create_new_windowless_device`.
18///
19///
20/// ```rust
21/// use wgpu_quick_start::{MyDevice, create_new_windowless_device};
22///
23///
24/// fn launch() -> Result<(), Box<dyn std::error::Error>> {
25///    let mut opt_device: Option<Box<dyn MyDevice>> = None;
26///    match create_new_windowless_device() {
27///        Ok(value) => {
28///            opt_device = Some(value);
29///        }
30///        Err(err) => {
31///            // warning - Error creating new device
32///        }
33///    }
34///    Ok(())
35/// }
36/// ```
37#[cfg(feature = "enable-sync")]
38pub fn create_new_windowless_device() -> super::GPUStarterResult<Box<dyn super::MyDevice>> {
39    use crate::my_device::MyDeviceImpl;
40
41    let device = pollster::block_on(MyDeviceImpl::new_without_window())?;
42    Ok(Box::new(device))
43}
44
45#[cfg(test)]
46mod tests {
47    // Note this useful idiom: importing names from outer (for mod tests) scope.
48    use super::*;
49
50    #[test]
51    #[ignore = "bug with adapter Vulkan/GL support etc"]
52    #[cfg(feature = "enable-sync")]
53    fn test_create_new_windowless_device() -> super::super::GPUStarterResult<()> {
54        let my_device = create_new_windowless_device()?;
55        assert!(my_device.get_texture_format().is_ok());
56        Ok(())
57    }
58}