From 394bf37f98a70084bba441b929fce43fb8c5ac11 Mon Sep 17 00:00:00 2001 From: teoxoy <28601907+teoxoy@users.noreply.github.com> Date: Tue, 15 Oct 2024 19:11:02 +0200 Subject: [PATCH] expect to timeout when targeting WebGL --- wgpu-core/src/device/queue.rs | 10 ++++++++++ wgpu-hal/src/gles/device.rs | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/wgpu-core/src/device/queue.rs b/wgpu-core/src/device/queue.rs index 8b1feefab..ba3974fa9 100644 --- a/wgpu-core/src/device/queue.rs +++ b/wgpu-core/src/device/queue.rs @@ -154,7 +154,10 @@ impl Drop for Queue { self.device.raw().wait( fence.as_ref(), last_successful_submission_index, + #[cfg(not(target_arch = "wasm32"))] crate::device::CLEANUP_WAIT_MS, + #[cfg(target_arch = "wasm32")] + 0, // WebKit and Chromium don't support a non-0 timeout ) }; drop(fence); @@ -163,6 +166,13 @@ impl Drop for Queue { Ok(true) => {} // Note: If we don't panic here we are in UB land (destroying resources while they are still in use by the GPU). Ok(false) => { + // It's fine that we timed out on WebGL; GL objects can be deleted early as they + // will be kept around by the driver if GPU work hasn't finished. + // Moreover, the way we emulate read mappings on WebGL allows us to execute map_buffer earlier than on other + // backends since getBufferSubData is synchronous with respect to the other previously enqueued GL commands. + // Relying on this behavior breaks the clean abstraction wgpu-hal tries to maintain and + // we should find ways to improve this. See https://github.com/gfx-rs/wgpu/issues/6538. + #[cfg(not(target_arch = "wasm32"))] panic!("We timed out while waiting on the last successful submission to complete!"); } Err(e) => { diff --git a/wgpu-hal/src/gles/device.rs b/wgpu-hal/src/gles/device.rs index 0421adc04..27aabc51e 100644 --- a/wgpu-hal/src/gles/device.rs +++ b/wgpu-hal/src/gles/device.rs @@ -1563,6 +1563,10 @@ impl crate::Device for super::Device { ) -> Result { if fence.last_completed.load(Ordering::Relaxed) < wait_value { let gl = &self.shared.context.lock(); + // MAX_CLIENT_WAIT_TIMEOUT_WEBGL is: + // - 1s in Gecko https://searchfox.org/mozilla-central/rev/754074e05178e017ef6c3d8e30428ffa8f1b794d/dom/canvas/WebGLTypes.h#1386 + // - 0 in WebKit https://github.com/WebKit/WebKit/blob/4ef90d4672ca50267c0971b85db403d9684508ea/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp#L110 + // - 0 in Chromium https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc;l=112;drc=a3cb0ac4c71ec04abfeaed199e5d63230eca2551 let timeout_ns = if cfg!(any(webgl, Emscripten)) { 0 } else {