diff --git a/player/src/bin/play.rs b/player/src/bin/play.rs index 3a05511b80..cc62010fbb 100644 --- a/player/src/bin/play.rs +++ b/player/src/bin/play.rs @@ -63,7 +63,8 @@ fn main() { window.window_handle().unwrap().into(), wgc::id::TypedId::zip(0, 1, wgt::Backend::Empty), ) - }; + } + .unwrap(); let device = match actions.pop() { Some(trace::Action::Init { desc, backend }) => { diff --git a/wgpu-core/src/instance.rs b/wgpu-core/src/instance.rs index 3def7b6164..2101fb8edc 100644 --- a/wgpu-core/src/instance.rs +++ b/wgpu-core/src/instance.rs @@ -479,68 +479,55 @@ impl Global { display_handle: raw_window_handle::RawDisplayHandle, window_handle: raw_window_handle::RawWindowHandle, id_in: Input, - ) -> SurfaceId { + ) -> Result { profiling::scope!("Instance::create_surface"); fn init( - any_surface: &mut Option, inst: &Option, display_handle: raw_window_handle::RawDisplayHandle, window_handle: raw_window_handle::RawWindowHandle, - ) { - if any_surface.is_none() { - if let Some(surface) = inst.as_ref().and_then(|inst| unsafe { - match inst.create_surface(display_handle, window_handle) { - Ok(raw) => Some(HalSurface:: { raw: Arc::new(raw) }), - Err(e) => { - log::warn!("Error: {:?}", e); - None - } - } - }) { - *any_surface = Some(AnySurface::new(surface)); + ) -> Option> { + inst.as_ref().map(|inst| unsafe { + match inst.create_surface(display_handle, window_handle) { + Ok(raw) => Ok(AnySurface::new(HalSurface:: { raw: Arc::new(raw) })), + Err(e) => Err(e), } - } + }) } - let mut hal_surface = None; + let mut hal_surface: Option> = None; + #[cfg(all(feature = "vulkan", not(target_arch = "wasm32")))] - init::( - &mut hal_surface, - &self.instance.vulkan, - display_handle, - window_handle, - ); + if hal_surface.is_none() { + hal_surface = + init::(&self.instance.vulkan, display_handle, window_handle); + } #[cfg(all(feature = "metal", any(target_os = "macos", target_os = "ios")))] - init::( - &mut hal_surface, - &self.instance.metal, - display_handle, - window_handle, - ); + if hal_surface.is_none() { + hal_surface = + init::(&self.instance.metal, display_handle, window_handle); + } #[cfg(all(feature = "dx12", windows))] - init::( - &mut hal_surface, - &self.instance.dx12, - display_handle, - window_handle, - ); + if hal_surface.is_none() { + hal_surface = + init::(&self.instance.dx12, display_handle, window_handle); + } #[cfg(feature = "gles")] - init::( - &mut hal_surface, - &self.instance.gl, - display_handle, - window_handle, - ); + if hal_surface.is_none() { + hal_surface = init::(&self.instance.gl, display_handle, window_handle); + } + + // This is only None if there's no instance at all. + let hal_surface = hal_surface.unwrap()?; let surface = Surface { presentation: Mutex::new(None), info: ResourceInfo::new(""), - raw: hal_surface.unwrap(), + raw: hal_surface, }; let (id, _) = self.surfaces.prepare::(id_in).assign(surface); - id + Ok(id) } /// # Safety diff --git a/wgpu/src/backend/direct.rs b/wgpu/src/backend/direct.rs index c9efec3f75..05a0db4263 100644 --- a/wgpu/src/backend/direct.rs +++ b/wgpu/src/backend/direct.rs @@ -528,7 +528,7 @@ impl crate::Context for Context { raw_window_handle, } => unsafe { self.0 - .instance_create_surface(raw_display_handle, raw_window_handle, ()) + .instance_create_surface(raw_display_handle, raw_window_handle, ())? }, #[cfg(metal)]