wgpu_hal/dynamic/
surface.rs1use crate::{
2 DynDevice, DynFence, DynResource, DynSurfaceTexture, Surface, SurfaceConfiguration,
3 SurfaceError,
4};
5
6use super::DynResourceExt as _;
7
8#[derive(Debug)]
9pub struct DynAcquiredSurfaceTexture {
10 pub texture: Box<dyn DynSurfaceTexture>,
11 pub suboptimal: bool,
15}
16
17pub trait DynSurface: DynResource {
18 unsafe fn configure(
19 &self,
20 device: &dyn DynDevice,
21 config: &SurfaceConfiguration,
22 ) -> Result<(), SurfaceError>;
23
24 unsafe fn unconfigure(&self, device: &dyn DynDevice);
25
26 unsafe fn acquire_texture(
27 &self,
28 timeout: Option<std::time::Duration>,
29 fence: &dyn DynFence,
30 ) -> Result<Option<DynAcquiredSurfaceTexture>, SurfaceError>;
31
32 unsafe fn discard_texture(&self, texture: Box<dyn DynSurfaceTexture>);
33}
34
35impl<S: Surface + DynResource> DynSurface for S {
36 unsafe fn configure(
37 &self,
38 device: &dyn DynDevice,
39 config: &SurfaceConfiguration,
40 ) -> Result<(), SurfaceError> {
41 let device = device.expect_downcast_ref();
42 unsafe { S::configure(self, device, config) }
43 }
44
45 unsafe fn unconfigure(&self, device: &dyn DynDevice) {
46 let device = device.expect_downcast_ref();
47 unsafe { S::unconfigure(self, device) }
48 }
49
50 unsafe fn acquire_texture(
51 &self,
52 timeout: Option<std::time::Duration>,
53 fence: &dyn DynFence,
54 ) -> Result<Option<DynAcquiredSurfaceTexture>, SurfaceError> {
55 let fence = fence.expect_downcast_ref();
56 unsafe { S::acquire_texture(self, timeout, fence) }.map(|acquired| {
57 acquired.map(|ast| {
58 let texture = Box::new(ast.texture);
59 let suboptimal = ast.suboptimal;
60 DynAcquiredSurfaceTexture {
61 texture,
62 suboptimal,
63 }
64 })
65 })
66 }
67
68 unsafe fn discard_texture(&self, texture: Box<dyn DynSurfaceTexture>) {
69 unsafe { S::discard_texture(self, texture.unbox()) }
70 }
71}