From 4a2cf8292ad37767de22a26e7e35d0a8a06edad3 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Rasmusson Date: Mon, 9 Nov 2026 19:08:20 -0500 Subject: wiki: 2026-11-09 evening refresh 2 - forced GLX reaches glcore; windowed GL waits on kernel kick completion Refresh STATE-CURRENT, the Main Page and the status/frontier pages: with SDL_VIDEO_X11_FORCE_EGL=0 the windowed GL path selects libnvidia-glcore, but the minimal glxgears hangs in the glcore kick wait (poll on the per-slot /dev/nvidia-modeset fd) while the host completes the beef notifier memory. The X DDX get-word/notifier completion, the DDX 4 GB sysmem footprint and physical dispatch of the GL draws remain. Published to open-iov.org. --- wiki/Graphics-Execution.md | 46 ++++++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 18 deletions(-) (limited to 'wiki/Graphics-Execution.md') diff --git a/wiki/Graphics-Execution.md b/wiki/Graphics-Execution.md index cba9732..ffbcfaf 100644 --- a/wiki/Graphics-Execution.md +++ b/wiki/Graphics-Execution.md @@ -12,7 +12,7 @@ > [`../docs/04-implementation/04-real-render-walls.md`](../docs/04-implementation/04-real-render-walls.md) > (the measured walls); the docs tree wins on disagreement. -Status: 2026-11-09, tree `master @ e342bd0f`. Tags: `[live]` observed end to +Status: 2026-11-09, tree `master @ 21e0d611`. Tags: `[live]` observed end to end; `[wip]` partially built; `[wall]` current blocker; `[target]` defined success state; `[planned]` designed, not built. @@ -89,10 +89,10 @@ fidelity: kick channel (`0xbfef0002`) is decoded from its ring head with its class-2D notification authored. The X DDX waits are fixed (class-aware display arm, `0x8000 -> 0` notification completion, decoded GL release - applied), and GZDoom reached `MAP01` once the DDX push-buffer loop was - unblocked. What remains is the renderer backend path (NVIDIA Vulkan ICD or - forced GLX), the DDX get-word/notifier completion, and physical dispatch - of the client's draws (§6). + applied), and with GLX forced (`SDL_VIDEO_X11_FORCE_EGL=0`) the windowed + GL path selects `libnvidia-glcore`. What remains is the kernel-visible GL + present/kick completion, the DDX get-word/notifier recycle, and physical + dispatch of the client's draws (§6). ## 4. The channel and object picture @@ -139,7 +139,10 @@ until it posts, so the X server's mode set finishes. For the X DDX's own 2D push buffers, completion also requires the GPU-written engine get word to advance and the notifier to be recycled to `0xffff` after a kick; both are host-side levers now, and a diagnostic write of the get word released the -DDX's reserve loop. +DDX's reserve loop. For a windowed GL client the present is a kick whose +completion the guest kernel observes by polling its per-slot +`/dev/nvidia-modeset` fd; the host must complete the exact notifier page the +kernel watches and signal that event, not only write the notifier memory. During bring-up the module also carries a **diagnostics-only mirror** for apps that spin on a shared progress word; it exists so a run can proceed while the @@ -148,11 +151,14 @@ requires it switched off, along with any external poke. ## 6. Where the frontier is (ranked walls) -1. **The renderer backend path** `[wall]`. GZDoom's default Vulkan backend - fails at `vkCreateDevice` in the NVIDIA Vulkan ICD, and the default - OpenGL/EGL path falls back to Mesa (`llvmpipe`). The campaign is forcing - GLX (`SDL_VIDEO_X11_FORCE_EGL=0`) so the client uses the NVIDIA GL stack; - the first NVIDIA-path frame is gated here. +1. **Kernel-visible GL present completion** `[wall]`. With GLX forced the + windowed client uses `libnvidia-glcore`; the minimal `glxgears` then hangs + in the glcore kick wait: the client polls its per-slot + `/dev/nvidia-modeset` fd (`poll(POLLIN, 1 s)`). The host's sweep completes + the beef notifier memory, but the guest kernel never signals the event the + poll waits on. The exact notifier page the kernel watches must be + completed and the guest event signalled (the kick-notify executor), not + just the memory written. 2. **The X DDX push-buffer completion** `[wall]`. The DDX's 2D reserve loop exits only when the GPU-written engine get word advances (`get <= put`) and the kick requires the notifier to be recycled to `0xffff` after @@ -168,9 +174,9 @@ requires it switched off, along with any external poke. dispatch to the physical GR engine (`forwarded=0`); the draws are decoded and host-completed, not executed on hardware. 5. **Non-black frames and sustained rate** `[wall]`/`[target]`. Once the - NVIDIA renderer path and the DDX get-word/notifier completion land, the - capture must show motion, then 60 fps in one VM with no forcing, then two - VMs on two mediated devices with non-black frames in both. + kernel-visible present completion and the DDX get-word/notifier completion + land, the capture must show motion, then 60 fps in one VM with no forcing, + then two VMs on two mediated devices with non-black frames in both. ## 7. What is proven today @@ -182,6 +188,8 @@ requires it switched off, along with any external poke. | `glxinfo` reports the emulated GPU with the NVIDIA renderer (OpenGL 4.6.0, direct rendering) | `[live]` | | GZDoom obtains a real GL context; windowed reaches renderer startup | `[live]` (pixels frontier) | | GZDoom reaches `MAP01` on Mesa llvmpipe (not the emulated vGPU path) | `[wip]` | +| Forced GLX (`SDL_VIDEO_X11_FORCE_EGL=0`) selects `libnvidia-glcore` | `[live]` | +| Windowed GL present/kick completion (minimal `glxgears`) | `[wall]` | | X server survives the GZDoom run on a 12 GB guest (the DDX's 4 GB sysmem allocation forces the size) | `[live]` | | GL section capture: the X server's `0xC597` stream decoded | `[live]` | | Verbatim 3D method-stream replay retired by the engine (no MMU fault) | `[live]` | @@ -189,7 +197,8 @@ requires it switched off, along with any external poke. | 2D screen fills and copy-engine present ops execute | `[live]` | | Direct GL client: device-init gate handled, channels allocate, readback path returns clean | `[live]` | | Direct GL client channels submit and retire (GR `0xbeef0100`, CE `0xbeef0101`/`0xbeef0102`); DDX kick channel decoded | `[live]` | -| NVIDIA Vulkan ICD creates a device, or forced GLX reaches glcore | `[wall]` | +| Guest kernel observes the kick completion and signals the modeset event | `[wall]` | +| NVIDIA Vulkan ICD creates a device | `[wall]` | | DDX push-buffer get-word publish and notifier recycle | `[wall]` | | Physical dispatch of the direct-GL draws (`forwarded=0`) | `[wall]` | | Non-black pixels from the emulated vGPU's 3D pipeline | `[wall]` | @@ -200,9 +209,10 @@ requires it switched off, along with any external poke. * No non-black pixel has been produced by the emulated vGPU's 3D pipeline yet. * Display/KMS bring-up (NvKms, `/dev/dri`, X, a real GL context) is not a rendered-frame claim; GZDoom reaching `MAP01` on Mesa llvmpipe is not the - emulated-vGPU path either. The NVIDIA renderer path, the DDX - get-word/notifier completion and the physical dispatch of the GL draws are - the current walls. + emulated-vGPU path, and the later forced-GLX run selects `libnvidia-glcore` + but hangs in the present/kick wait. The kernel-visible present completion, + the DDX get-word/notifier completion and the physical dispatch of the GL + draws are the current walls. * No frame-rate or latency numbers: the scheduled measurement is defined (60 fps over 60 s, no forcing) but not yet met. * The `virgl`-based demo videos are a different, labelled path — not this one. -- cgit v1.2.3