aleatico 0.1.0

stub package for fennel engine graphics
Documentation
use crate::errors::AleaticoResult;
use std::sync::Arc;
use wgpu::PresentMode;
use winit::window::Window;

/// Structure representing a surface
pub struct Surface {
    /// [`wgpu`] internal surface
    pub inner: wgpu::Surface<'static>,
    /// [`wgpu`] device
    pub device: wgpu::Device,
    /// [`wgpu`] queue
    pub queue: wgpu::Queue,
    /// [`wgpu`] surface config
    pub config: wgpu::SurfaceConfiguration,
    /// Is this surface configured?
    pub is_configured: bool,
}

impl Surface {
    /// Create a new instance of [`Surface]
    pub async fn new(window: Arc<Window>) -> AleaticoResult<Surface> {
        let size = window.inner_size();

        let instance = wgpu::Instance::new(wgpu::InstanceDescriptor {
            #[cfg(not(target_arch = "wasm32"))]
            backends: wgpu::Backends::PRIMARY,
            #[cfg(target_arch = "wasm32")]
            backends: wgpu::Backends::GL,
            flags: Default::default(),
            memory_budget_thresholds: Default::default(),
            backend_options: Default::default(),
            display: None,
        });

        let surface = instance.create_surface(window.clone()).unwrap();

        let adapter = instance
            .request_adapter(&wgpu::RequestAdapterOptions {
                power_preference: wgpu::PowerPreference::default(),
                compatible_surface: Some(&surface),
                force_fallback_adapter: false,
            })
            .await?;

        let (device, queue) = adapter
            .request_device(&wgpu::DeviceDescriptor {
                label: None,
                required_features: wgpu::Features::empty(),
                experimental_features: wgpu::ExperimentalFeatures::disabled(),
                required_limits: if cfg!(target_arch = "wasm32") {
                    wgpu::Limits::downlevel_webgl2_defaults()
                } else {
                    wgpu::Limits::default()
                },
                memory_hints: Default::default(),
                trace: wgpu::Trace::Off,
            })
            .await?;

        let surface_caps = surface.get_capabilities(&adapter);

        let surface_format = surface_caps
            .formats
            .iter()
            .find(|f| f.is_srgb())
            .copied()
            .unwrap_or(surface_caps.formats[0]);
        let config = wgpu::SurfaceConfiguration {
            usage: wgpu::TextureUsages::RENDER_ATTACHMENT,
            format: surface_format,
            width: size.width,
            height: size.height,
            present_mode: PresentMode::AutoVsync,
            alpha_mode: surface_caps.alpha_modes[0],
            view_formats: vec![],
            desired_maximum_frame_latency: 2,
        };

        Ok(Self {
            inner: surface,
            device,
            queue,
            config,
            is_configured: false,
        })
    }
}