Skip to main content

wgpu_hal/dynamic/
instance.rs

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