wgpu_hal/dynamic/
instance.rs

1use crate::{Api, Capabilities, ExposedAdapter, Instance, InstanceError};
2
3use super::{DynAdapter, DynResource, DynResourceExt as _, DynSurface};
4
5pub struct DynExposedAdapter {
6    pub adapter: Box<dyn DynAdapter>,
7    pub info: wgt::AdapterInfo,
8    pub features: wgt::Features,
9    pub capabilities: Capabilities,
10}
11
12impl DynExposedAdapter {
13    /// Returns the backend this adapter is using.
14    pub fn backend(&self) -> wgt::Backend {
15        self.info.backend
16    }
17}
18
19impl<A: Api> From<ExposedAdapter<A>> for DynExposedAdapter {
20    fn from(exposed_adapter: ExposedAdapter<A>) -> Self {
21        Self {
22            adapter: Box::new(exposed_adapter.adapter),
23            info: exposed_adapter.info,
24            features: exposed_adapter.features,
25            capabilities: exposed_adapter.capabilities,
26        }
27    }
28}
29
30pub trait DynInstance: DynResource {
31    unsafe fn create_surface(
32        &self,
33        display_handle: raw_window_handle::RawDisplayHandle,
34        window_handle: raw_window_handle::RawWindowHandle,
35    ) -> Result<Box<dyn DynSurface>, InstanceError>;
36
37    unsafe fn enumerate_adapters(
38        &self,
39        surface_hint: Option<&dyn DynSurface>,
40    ) -> Vec<DynExposedAdapter>;
41}
42
43impl<I: Instance + DynResource> DynInstance for I {
44    unsafe fn create_surface(
45        &self,
46        display_handle: raw_window_handle::RawDisplayHandle,
47        window_handle: raw_window_handle::RawWindowHandle,
48    ) -> Result<Box<dyn DynSurface>, InstanceError> {
49        unsafe { I::create_surface(self, display_handle, window_handle) }
50            .map(|surface| -> Box<dyn DynSurface> { Box::new(surface) })
51    }
52
53    unsafe fn enumerate_adapters(
54        &self,
55        surface_hint: Option<&dyn DynSurface>,
56    ) -> Vec<DynExposedAdapter> {
57        let surface_hint = surface_hint.map(|s| s.expect_downcast_ref());
58        unsafe { I::enumerate_adapters(self, surface_hint) }
59            .into_iter()
60            .map(|exposed| DynExposedAdapter {
61                adapter: Box::new(exposed.adapter),
62                info: exposed.info,
63                features: exposed.features,
64                capabilities: exposed.capabilities,
65            })
66            .collect()
67    }
68}