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
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 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}