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