Skip to content

Commit b5192e8

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

File tree

1 file changed

+25
-20
lines changed

1 file changed

+25
-20
lines changed

wgpu/src/lib.rs

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,24 @@ 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+
/// # Safety
541+
///
542+
/// - `window` must outlive the resulting surface target
543+
/// (and subsequently the surface created for this target).
544+
pub unsafe fn from_window<T>(window: &T) -> Result<Self, raw_window_handle::HandleError>
545+
where
546+
T: HasDisplayHandle + HasWindowHandle,
547+
{
548+
Ok(Self::RawHandle {
549+
raw_display_handle: window.display_handle()?.as_raw(),
550+
raw_window_handle: window.window_handle()?.as_raw(),
551+
})
552+
}
553+
}
554+
537555
/// Handle to a binding group layout.
538556
///
539557
/// A `BindGroupLayout` is a handle to the GPU-side layout of a binding group. It can be used to
@@ -1881,29 +1899,16 @@ impl Instance {
18811899

18821900
let target = target.into();
18831901
let mut surface = match target {
1884-
SurfaceTarget::Window(window) => {
1885-
let raw_display_handle = window
1886-
.display_handle()
1887-
.map_err(|e| CreateSurfaceError {
1888-
inner: CreateSurfaceErrorKind::RawHandle(e),
1889-
})?
1890-
.as_raw();
1891-
let raw_window_handle = window
1892-
.window_handle()
1893-
.map_err(|e| CreateSurfaceError {
1902+
SurfaceTarget::Window(window) => unsafe {
1903+
let surface = self.create_surface_unsafe(
1904+
SurfaceTargetUnsafe::from_window(&window).map_err(|e| CreateSurfaceError {
18941905
inner: CreateSurfaceErrorKind::RawHandle(e),
1895-
})?
1896-
.as_raw();
1897-
1906+
})?,
1907+
);
18981908
handle_origin = Some(window);
18991909

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

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

0 commit comments

Comments
 (0)