From 691c5389a166ab2db0a7e284f93d93154e7a2d22 Mon Sep 17 00:00:00 2001 From: David Stern Date: Thu, 20 Feb 2025 12:08:28 -0500 Subject: [PATCH 1/3] Make Surface::present() errors non-fatal. --- wgpu/src/backend/wgpu_core.rs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/wgpu/src/backend/wgpu_core.rs b/wgpu/src/backend/wgpu_core.rs index d72865cce52..e0cea882184 100644 --- a/wgpu/src/backend/wgpu_core.rs +++ b/wgpu/src/backend/wgpu_core.rs @@ -13,7 +13,10 @@ use std::{ borrow::Cow::Borrowed, error::Error, fmt, future::ready, ops::Range, pin::Pin, ptr::NonNull, slice, sync::Arc, }; -use wgc::{command::bundle_ffi::*, error::ContextErrorSource, pipeline::CreateShaderModuleError}; +use wgc::{ + command::bundle_ffi::*, error::ContextErrorSource, pipeline::CreateShaderModuleError, + present::SurfaceError, +}; use wgt::WasmNotSendSync; #[derive(Clone)] @@ -589,6 +592,7 @@ pub struct CoreTlas { pub struct CoreSurfaceOutputDetail { context: ContextWgpuCore, surface_id: wgc::id::SurfaceId, + error_sink: ErrorSink, } type ErrorSink = Arc>; @@ -3443,9 +3447,16 @@ impl dispatch::SurfaceInterface for CoreSurface { crate::SurfaceStatus, dispatch::DispatchSurfaceOutputDetail, ) { + let error_sink = if let Some(error_sink) = self.error_sink.lock().as_ref() { + error_sink.clone() + } else { + Arc::new(Mutex::new(ErrorSinkRaw::new())) + }; + let output_detail = CoreSurfaceOutputDetail { context: self.context.clone(), surface_id: self.id, + error_sink: error_sink.clone(), } .into(); @@ -3455,7 +3466,7 @@ impl dispatch::SurfaceInterface for CoreSurface { .map(|id| CoreTexture { context: self.context.clone(), id, - error_sink: Arc::new(Mutex::new(ErrorSinkRaw::new())), + error_sink, }) .map(Into::into); @@ -3489,9 +3500,16 @@ impl Drop for CoreSurface { impl dispatch::SurfaceOutputDetailInterface for CoreSurfaceOutputDetail { fn present(&self) { + let error = SurfaceError::Device(wgc::device::DeviceError::Lost); + self.context + .handle_error_nolabel(&self.error_sink, error, "Surface::present"); + match self.context.0.surface_present(self.surface_id) { Ok(_status) => (), - Err(err) => self.context.handle_error_fatal(err, "Surface::present"), + Err(err) => { + self.context + .handle_error_nolabel(&self.error_sink, err, "Surface::present"); + } } } From a5ae43df29dd5aac1281e2318d081c501f589e37 Mon Sep 17 00:00:00 2001 From: David Stern Date: Thu, 20 Feb 2025 12:10:57 -0500 Subject: [PATCH 2/3] Remove code used for testing. --- wgpu/src/backend/wgpu_core.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/wgpu/src/backend/wgpu_core.rs b/wgpu/src/backend/wgpu_core.rs index e0cea882184..519f8f131a7 100644 --- a/wgpu/src/backend/wgpu_core.rs +++ b/wgpu/src/backend/wgpu_core.rs @@ -3500,10 +3500,6 @@ impl Drop for CoreSurface { impl dispatch::SurfaceOutputDetailInterface for CoreSurfaceOutputDetail { fn present(&self) { - let error = SurfaceError::Device(wgc::device::DeviceError::Lost); - self.context - .handle_error_nolabel(&self.error_sink, error, "Surface::present"); - match self.context.0.surface_present(self.surface_id) { Ok(_status) => (), Err(err) => { From 3762e602166551185e1c8fad9d4dc4ed67ff881d Mon Sep 17 00:00:00 2001 From: David Stern Date: Thu, 20 Feb 2025 12:19:54 -0500 Subject: [PATCH 3/3] clippy --- wgpu/src/backend/wgpu_core.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/wgpu/src/backend/wgpu_core.rs b/wgpu/src/backend/wgpu_core.rs index 519f8f131a7..f00c5b3c909 100644 --- a/wgpu/src/backend/wgpu_core.rs +++ b/wgpu/src/backend/wgpu_core.rs @@ -13,10 +13,7 @@ use std::{ borrow::Cow::Borrowed, error::Error, fmt, future::ready, ops::Range, pin::Pin, ptr::NonNull, slice, sync::Arc, }; -use wgc::{ - command::bundle_ffi::*, error::ContextErrorSource, pipeline::CreateShaderModuleError, - present::SurfaceError, -}; +use wgc::{command::bundle_ffi::*, error::ContextErrorSource, pipeline::CreateShaderModuleError}; use wgt::WasmNotSendSync; #[derive(Clone)]