From b6aa839e0964fe2fc613245710fe576275702b2f Mon Sep 17 00:00:00 2001 From: Lam Wei Lun Date: Sun, 18 Oct 2026 03:30:21 +0800 Subject: [PATCH] Linux: use WebKit's shared-memory transport in hypervisor guests Web views in VirtualBox (and other virtual GPUs) fail on WebKitGTK >= 2.44 because the guest GL stack cannot back the hardware DMABUF renderer. Setting WEBKIT_DMABUF_RENDERER_FORCE_SHM=1 fixes it and keeps accelerated compositing, confirmed in VirtualBox on WebKitGTK 2.54. Detect a hypervisor guest from the cpuinfo hypervisor flag before GTK init and set the variable non-replacing, so a user-exported value still wins. Bare metal is unchanged. The skill references are updated to match. --- .../orca-wxwidgets/references/platforms.md | 3 ++- .../references/webview-gl-aui-media.md | 13 +++++++++---- src/OrcaSlicer.cpp | 16 ++++++++++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/.claude/skills/orca-wxwidgets/references/platforms.md b/.claude/skills/orca-wxwidgets/references/platforms.md index 0ec78aaa43..673f58357f 100644 --- a/.claude/skills/orca-wxwidgets/references/platforms.md +++ b/.claude/skills/orca-wxwidgets/references/platforms.md @@ -574,7 +574,8 @@ DMABUF workaround and then branches on `GDK_BACKEND` (an `x11` prefix means the paths, when `/proc/driver/nvidia/version` exists and the linked WebKitGTK honours the switch (>= 2.44, `WebView::SupportsForceSharedMemory()`), it sets `WEBKIT_DMABUF_RENDERER_FORCE_SHM=1` and `WEBKIT_FORCE_DMABUF_RENDERER=1` (non-replacing): the proprietary driver cannot back WebKit's hardware -DMABUF renderer. On the default path it forces `GDK_BACKEND=x11` when wx lacks EGL and `WAYLAND_DISPLAY` +DMABUF renderer. On a hypervisor guest (`/proc/cpuinfo` `hypervisor` flag) and WebKitGTK >= 2.44 it sets +`WEBKIT_DMABUF_RENDERER_FORCE_SHM=1` alone, since virtual GPUs cannot back the hardware path either. On the default path it forces `GDK_BACKEND=x11` when wx lacks EGL and `WAYLAND_DISPLAY` is set, and sets `WEBKIT_DISABLE_COMPOSITING_MODE=1` (non-replacing) inside that branch when the linked WebKitGTK is older than 2.42: a forced X11 backend in a Wayland session is the only default-path case that runs through XWayland, which `DISPLAY` and `WAYLAND_DISPLAY` alone do not tell you (a native diff --git a/.claude/skills/orca-wxwidgets/references/webview-gl-aui-media.md b/.claude/skills/orca-wxwidgets/references/webview-gl-aui-media.md index e7ff4fadde..e707c99ebd 100644 --- a/.claude/skills/orca-wxwidgets/references/webview-gl-aui-media.md +++ b/.claude/skills/orca-wxwidgets/references/webview-gl-aui-media.md @@ -568,13 +568,18 @@ vue-resize workaround script and sets a persistent SQLite cookie store on the vi ## WebKitGTK on Linux sessions **Mechanism.** `CLI::run` (`src/OrcaSlicer.cpp`, under `#ifdef __WXGTK__`, before GTK initialises) -sets the NVIDIA DMABUF workaround and then branches on `GDK_BACKEND`: +sets the DMABUF workarounds and then branches on `GDK_BACKEND`: - **Both paths**, before the split: when `/proc/driver/nvidia/version` exists and the linked WebKitGTK honours the switch (>= 2.44, `WebView::SupportsForceSharedMemory()`), it sets `WEBKIT_DMABUF_RENDERER_FORCE_SHM=1` and `WEBKIT_FORCE_DMABUF_RENDERER=1` non-replacing. The proprietary driver cannot back WebKit's hardware DMABUF renderer, so the shared-memory transport keeps accelerated compositing instead of dropping it; `WEBKIT_FORCE_DMABUF_RENDERER` clears the Debian/Ubuntu/openSUSE `isNVIDIA()` early return, which otherwise returns before the FORCE_SHM check. +- **Hypervisor guests**, same position: when `is_hypervisor_guest()` (the `hypervisor` flag in + `/proc/cpuinfo`) and WebKitGTK >= 2.44, it sets `WEBKIT_DMABUF_RENDERER_FORCE_SHM=1` non-replacing. + Virtual GPUs (VirtualBox VMSVGA, VMware, QEMU) cannot back the hardware DMABUF path either, and + FORCE_SHM alone was confirmed to fix web views in VirtualBox; the `WEBKIT_FORCE_DMABUF_RENDERER` pair + is not needed without the Debian `isNVIDIA()` patch. The flag is x86-only, so ARM guests are not covered. - **Default path** (`GDK_BACKEND` unset or not starting with `x11`): if wx lacks EGL (`!wxHAS_EGL`) and `WAYLAND_DISPLAY` is set, it forces `GDK_BACKEND=x11`, and in that same branch it sets `WEBKIT_DISABLE_COMPOSITING_MODE=1` non-replacing when the linked WebKitGTK predates 2.42 @@ -590,9 +595,9 @@ Runtime backend detection elsewhere uses Orca's `is_running_on_wayland()` / `is_ (see `references/platforms.md`), not these environment variables. **Pitfall.** -- **Rule:** On NVIDIA reach for `WEBKIT_DMABUF_RENDERER_FORCE_SHM` before - `WEBKIT_DISABLE_COMPOSITING_MODE`. **Why:** the proprietary driver cannot back WebKit's hardware - DMABUF renderer, leaving web views blank or slow; FORCE_SHM keeps accelerated compositing and only +- **Rule:** On NVIDIA and hypervisor guests reach for `WEBKIT_DMABUF_RENDERER_FORCE_SHM` before + `WEBKIT_DISABLE_COMPOSITING_MODE`. **Why:** the proprietary driver and virtual GPUs cannot back WebKit's + hardware DMABUF renderer, leaving web views blank or slow; FORCE_SHM keeps accelerated compositing and only skips the hardware path, while disabling compositing drops it. Threaded scrolling is a separate, release-dependent default (off in 2.44/2.45, on from 2.46). `WEBKIT_DISABLE_DMABUF_RENDERER` is not a substitute — it is read first, leaves the transport set empty (no compositing from 2.44 on, where the diff --git a/src/OrcaSlicer.cpp b/src/OrcaSlicer.cpp index 468cfb9a30..48ddd16a3b 100644 --- a/src/OrcaSlicer.cpp +++ b/src/OrcaSlicer.cpp @@ -1126,6 +1126,19 @@ static void load_downward_settings_list_from_config(std::string config_file, std } } +#ifdef __WXGTK__ +// Virtual GPUs (VirtualBox, VMware, QEMU) cannot back WebKit's hardware DMABUF renderer. +static bool is_hypervisor_guest() +{ + std::ifstream cpuinfo("/proc/cpuinfo"); + std::string line; + while (std::getline(cpuinfo, line)) + if (boost::starts_with(line, "flags")) + return line.find(" hypervisor") != std::string::npos; + return false; +} +#endif + int CLI::run(int argc, char **argv) { // Mark the main thread for the debugger and for runtime checks. @@ -1176,6 +1189,9 @@ int CLI::run(int argc, char **argv) ::setenv("WEBKIT_FORCE_DMABUF_RENDERER", "1", /* replace */ false); } + if (is_hypervisor_guest() && WebView::SupportsForceSharedMemory()) + ::setenv("WEBKIT_DMABUF_RENDERER_FORCE_SHM", "1", /* replace */ false); + if (x11_opt_in) { // ===== X11 / XWayland (opted in via GDK_BACKEND=x11) ===== BOOST_LOG_TRIVIAL(info) << "GDK_BACKEND=x11 detected; applying v2.3.2 X11/XWayland workarounds.";