@@ -534,6 +534,24 @@ pub enum SurfaceTargetUnsafe {
534
534
SwapChainPanel ( * mut std:: ffi:: c_void ) ,
535
535
}
536
536
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
+
537
555
/// Handle to a binding group layout.
538
556
///
539
557
/// 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 {
1881
1899
1882
1900
let target = target. into ( ) ;
1883
1901
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 {
1894
1905
inner : CreateSurfaceErrorKind :: RawHandle ( e) ,
1895
- } ) ?
1896
- . as_raw ( ) ;
1897
-
1906
+ } ) ?,
1907
+ ) ;
1898
1908
handle_origin = Some ( window) ;
1899
1909
1900
- unsafe {
1901
- self . create_surface_unsafe ( SurfaceTargetUnsafe :: RawHandle {
1902
- raw_display_handle,
1903
- raw_window_handle,
1904
- } )
1905
- } ?
1906
- }
1910
+ surface
1911
+ } ?,
1907
1912
1908
1913
#[ cfg( any( webgpu, webgl) ) ]
1909
1914
SurfaceTarget :: Canvas ( canvas) => {
0 commit comments