wgpu_hal/dynamic/
instance.rs1use 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 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}