Skip to content

Commit 48cabb2

Browse files
committed
add SurfaceTargetUnsafe::from_window utility
1 parent 656c79a commit 48cabb2

File tree

1 file changed

+23
-20
lines changed

1 file changed

+23
-20
lines changed

wgpu/src/lib.rs

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,22 @@ pub enum SurfaceTargetUnsafe {
534534
SwapChainPanel(*mut std::ffi::c_void),
535535
}
536536

537+
impl SurfaceTargetUnsafe {
538+
/// Creates a [`SurfaceTargetUnsafe::RawHandle`] from a window.
539+
///
540+
/// This is unsafe since it assumes that the window outlives the resulting surface target
541+
/// (and subsequently the surface created for this target).
542+
pub unsafe fn from_window<T>(window: &T) -> Result<Self, raw_window_handle::HandleError>
543+
where
544+
T: HasDisplayHandle + HasWindowHandle,
545+
{
546+
Ok(Self::RawHandle {
547+
raw_display_handle: window.display_handle()?.as_raw(),
548+
raw_window_handle: window.window_handle()?.as_raw(),
549+
})
550+
}
551+
}
552+
537553
/// Handle to a binding group layout.
538554
///
539555
/// A `BindGroupLayout` is a handle to the GPU-side layout of a binding group. It can be used to
@@ -1881,29 +1897,16 @@ impl Instance {
18811897

18821898
let target = target.into();
18831899
let mut surface = match target {
1884-
SurfaceTarget::Window(window) => {
1885-
let raw_display_handle = window
1886-
.display_handle()
1887-
.map_err(|e| CreateSurfaceError {
1900+
SurfaceTarget::Window(window) => unsafe {
1901+
let surface = self.create_surface_unsafe(
1902+
SurfaceTargetUnsafe::from_window(&window).map_err(|e| CreateSurfaceError {
18881903
inner: CreateSurfaceErrorKind::RawHandle(e),
1889-
})?
1890-
.as_raw();
1891-
let raw_window_handle = window
1892-
.window_handle()
1893-
.map_err(|e| CreateSurfaceError {
1894-
inner: CreateSurfaceErrorKind::RawHandle(e),
1895-
})?
1896-
.as_raw();
1897-
1904+
})?,
1905+
);
18981906
handle_origin = Some(window);
18991907

1900-
unsafe {
1901-
self.create_surface_unsafe(SurfaceTargetUnsafe::RawHandle {
1902-
raw_display_handle,
1903-
raw_window_handle,
1904-
})
1905-
}?
1906-
}
1908+
surface
1909+
}?,
19071910

19081911
#[cfg(any(webgpu, webgl))]
19091912
SurfaceTarget::Canvas(canvas) => {

0 commit comments

Comments
 (0)