summaryrefslogtreecommitdiffstats
path: root/STATE-CURRENT.md
diff options
context:
space:
mode:
Diffstat (limited to 'STATE-CURRENT.md')
-rw-r--r--STATE-CURRENT.md714
1 files changed, 699 insertions, 15 deletions
diff --git a/STATE-CURRENT.md b/STATE-CURRENT.md
index 27295df..5762b4f 100644
--- a/STATE-CURRENT.md
+++ b/STATE-CURRENT.md
@@ -1,12 +1,667 @@
# Open-IOV Current State
-> **Snapshot: 2026-10-20 ~20:00 (two more fixes landed: the SWAP_RX cursor
-> and the pin-wins ledger divergence that cured a guest-kernel-corruption
-> panic; guest CUDA kernels green on fresh boots - `victory_mail`,
-> `victory_matmul` (first-run flake), transformer, `vector_add` (1M,
-> `bad=0`), `vecadd_loop` (100 launches); two guests with two emulated VRAM
-> sizes (512M + 1GiB) coexist live; frontier = the multi-pass content class
-> and the streams2 launch-order wait).**
+> **Snapshot: 2026-11-11 ~10:45 (SESSION 156 continued; HEAD `4acac093` ==
+> `vgpu/master`; working tree carries in-flight kernel work; supersedes the
+> 2026-11-10 ~16:45 entry below).**
+> The **first non-black GPU-rendered GL output and the first captured video**
+> landed on the emulated vGPU. r1764 (`131d44e0`) proved the pbuffer path: the
+> probe returns `PROBE rc=0 err=0x0 pixel=ff0000ff` and the off-screen frame
+> producer published 40/40 animated 640x480 frames rendered on the physical
+> GPU (pbuffer -> sysmem -> kvmfr ivshmem -> host `frame_reader.py`). r1769
+> validated the V6 ring-ledger scrub release (`f6184ac3`): X green 4/4 cycles,
+> zero panics/wedges, `gl_frames 500/500` non-black, 454 PPMs, and a 640x480
+> h264 10 fps 45.4 s video
+> (`backups/evidence-20261002-victory/r1769/vgpu-gl-animation.mp4`). The
+> scrubber release value is the guest's `lastSubmittedWorkId`; the ring ledger
+> counts GPFIFO pushes and advances fin forward-only (never all-ones), so the
+> fin=12 underflow class is closed.
+>
+> Commit `4acac093` (V9/V10) resolves the **direct-GL GR ring `0xbeef0100`**
+> (beef-family always-probe, per-channel promote backoff, rank-collision
+> fallback, parked-candidate eviction). Receipts: `RING-VAS` mapped, RAM scan
+> `va=0x4020000 -> pa=0x1ee8000`, 132 `sema-push`, 101 `sema-sw` releases
+> advancing `0x1 -> 0x27` (39 frames); glxgears 504-516 FPS with no
+> regression; a ~120 s GZDoom run had zero DDX channel-idle timeouts. GZDoom
+> now **passes the VBO wall whenever the shared nvClip `modeNum` is even**:
+> on a fresh X it logs window -> `GL_VERSION 4.6.0` -> 640x480 -> `I_Init` ->
+> `V_Init: allocate screen` with 0 SIGSEGV, and its direct-GL channels
+> register with the GR lane live. The SIGSEGV at `0x20` was root-caused
+> (coredump + LD_PRELOAD shim + host gdb) to `FFlatVertexBuffer::Copy` ->
+> `memcpy(NULL, ..., 640)` because `glMapBufferRange`/`glBufferData` return
+> NULL + `0x505` when the client's `__glNVStateInit` fails the modeswitch
+> test with an odd `modeNum` (live read: wedged X = 3, fresh X = 2). The +1
+> is the guest kernel's nvKms deferred close (the host completes
+> UPDATE -> FINISHED but no control arrives at the +1) - guest-side, not
+> module-induced.
+>
+> **New top wall:** the direct-GL **CE ring `0xbeef0101` (gpfifo=0x4100000)
+> never resolves** - `VAS-PROMOTE cand pdb=0x108eb3000 walk rc=-2` plus
+> `NOT mapped by any registered VAS` every ~7 s - so GZDoom's CE work never
+> executes and the guest wedges ~90 s after `V_Init`. Next: walk all parked
+> candidates regardless of owner VAS and/or keep >=2 fresh same-VAS parks.
+> **Window/screen pixels remain unproven:** glxgears' window is still black
+> (the GLX probe/frames path is a per-window lottery), and X window creation
+> wedges on 3/6 boots in an unkillable Xorg spin (`_nv052600rm+0x7b`); one
+> cycle also saw 2x "Wait for channel idle timed out".
+>
+> Walls ranked: (1) direct-GL CE ring `0xbeef0101` resolution (blocks the
+> GZDoom game loop); (2) window/screen pixels and the GLX per-window lottery;
+> (3) X startup/stability and the VASpace/ScreenInit allocation lottery
+> (`_nv052600rm+0x7b`, `0x51`, vmalloc); (4) the DDX 4 GB sysmem
+> allocation/OOM (12 GB guest); (5) sustained non-black window frames.
+>
+> CUDA front unchanged (backgrounded while graphics holds the device; its
+> 10-30 status stands): `41343c63` green (`victory_mail` `VADD bad=0` +
+> `STATUS OK`; `vecadd_loop` 100 launches PASS); the fresh-boot battery's
+> red class is D2H-stage with release-discipline fixes staged; the SESSION
+> 143 Vulkan fence regression is not re-measured.
+>
+> Live at check (read-only): HEAD `4acac093` == `vgpu/master`; working tree
+> `M kernel/gsp_sema_service.c` (in-flight campaign work); evidence under
+> `backups/evidence-20261002-victory/r1769/`, `r1774/`, `r1775/`; pstore
+> empty; no reboot during the check.
+>
+> **Snapshot: 2026-11-10 ~16:45 (SESSION 156 continued; HEAD `df6e71bb`,
+> tree has in-flight kernel/tool work; supersedes the 06:10 entry below).**
+> The **first real GPU readback** landed: a guest
+> `glClear(red)+glFinish+glReadPixels` pbuffer probe returned
+> `rc=0 err=0x0 pixel=ff0000ff` (r1734), with the host logging
+> `section captured` plus `GR LAUNCH submitted` on the DDX channel
+> `0x1000014`. That proves the emulated path can render and read back through
+> the unmodified guest driver. The RM write-lock holder was identified as
+> Xorg in the DDX vidheap scrub wait (NVOS32 `ALLOC_SIZE` 0xa0000, spinning
+> on `vmap+0x6c004`); `df6e71bb` authors the all-ones release pair for a
+> scanner-registered scrub buffer with no USERD GP_PUT, which released the
+> lock and made the readback work.
+>
+> Still open: the direct-GL client channel `0xbfef0002` opens a C597 section
+> but emits only 32/64-byte setup/notify kicks (`ops_runs=0`, `section
+> captured`/`GR LAUNCH` 0) - the GL draws never reach the host. A synchronous
+> window draw wedges X (`xwd -root` writes 0 bytes) while the pbuffer probe
+> works, so screen capture must use the ivshmem frame path. X startup remains
+> a lottery (`Failed to initialize DMA` / push-buffer `0x51` / occasional
+> vmalloc 96 GB) and X can die after forward activity. No non-black screen
+> pixels yet. Milestone position: between M-GL1 and M-GL2; the readback pixel
+> is execution proof, not a screen frame.
+>
+> Walls ranked: (1) direct-GL draw submission/capture on `0xbfef0002`;
+> (2) window/screen present and X stability; (3) X startup/RM degradation
+> (`0x51`); (4) the DDX 4 GB sysmem allocation/OOM (12 GB guest); (5)
+> non-black screen frames and sustained rate.
+>
+> CUDA front unchanged (backgrounded while graphics holds the device; its
+> 10-30 status stands): `41343c63` green (`victory_mail` `VADD bad=0` +
+> `STATUS OK`; `vecadd_loop` 100 launches PASS); the fresh-boot battery's
+> red class is D2H-stage with release-discipline fixes staged; the SESSION
+> 143 Vulkan fence regression is not re-measured.
+>
+> Live at check (read-only): host up ~42 h (fresh boot 2026-11-08 22:29);
+> `vgsp` loaded + live cycle (QEMU 128357, mdev
+> `c949938a-0391-4aa0-8d49-1679878fe5cd`); `tree` has the campaign's in-flight
+> kernel/tool work (HEAD `df6e71bb`); pstore empty; no reboot during the
+> check.
+>
+> **Snapshot: 2026-11-10 ~06:10 (SESSION 156 continued; HEAD `bb802909`,
+> tree has in-flight kernel work from the campaign; supersedes the 05:30
+> entry below).**
+> The X and GR reliability work landed. `ebf3130f` fixes the X DMA-init path
+> (the pristine-FB USERD scan now runs when the ring is present but unusable,
+> the foreign-FB claim is offset-correct, the parked VAS candidate is
+> content-validated at the pump turn, and the owner-VAS fallback covers
+> `hVASpace==0`) and flips the GR pair-close/pair-safe replay fixes to default
+> ON. Result: **X direct rendering green on attempt 1 in three consecutive
+> cycles (r1687/1688/1689)**, `backend_timeout=0` (was 6), `backend_ok=5-7`,
+> and draws retire in 3-2400 ms. `bb802909` (WIP beef-ring promote +
+> draw-channel CB scan) is committed; the campaign has uncommitted kernel work
+> in flight.
+>
+> The remaining wall is still the **replayed draw writes 0 pages** (render
+> target unchanged; `bounce copy-out` reports 0 changed). It is now precise:
+> (1) the beef GR ring resolution race - `0xbeef0100` registers with `vas=0`
+> before its CE siblings publish `0xbeef0300`; the VAS is then registered
+> UNVERIFIED by the 1 ms age-out, so the ring at `0x4020000` stays
+> `ring_pa=0` and the fixed-CB scan (gated to the `0xbeef0000` family) never
+> runs. The fix is to gate the candidate promote on *verified* rather than
+> *known* and retry every pump turn. (2) Even when the scan runs (`r1687`), it
+> decodes 1492 `0x3800` offsets plus 1497 `0x39c8` data runs (1092 words) but
+> the image's `0x80` MVP block is zero; identified parser bugs (subchannel
+> bits 15:13, `0x238c` ONE_INC inline data, selector B/C swap) are not yet
+> applied, and the MVP may live at an offset >= `0x1000` or a selector B/C
+> binding. (3) The render-target bind (`svc_surf_prelude_capture`,
+> last-trusted-bind-wins) must be confirmed to match the page the copy-out
+> compares.
+>
+> The 2D path is green end-to-end, the guest's real GL draws forward and
+> execute on the physical GPU, and X is reliable; no rendered pixel through
+> the emulated vGPU yet. Milestone position: between M-GL1 and M-GL2.
+> Estimate (subjective): first non-black frame hours-to-days if the beef-ring
+> and CB decode behave like their predecessors; the two-VM GPU-accelerated
+> video after that.
+>
+> CUDA front unchanged (backgrounded while graphics holds the device; its
+> 10-30 status stands): `41343c63` green (`victory_mail` `VADD bad=0` +
+> `STATUS OK`; `vecadd_loop` 100 launches PASS); the fresh-boot battery's
+> red class is D2H-stage with release-discipline fixes staged; the SESSION
+> 143 Vulkan fence regression is not re-measured.
+>
+> Live at check (read-only): r1691 VM up (QEMU 80456, mdev
+> `eba5a4f0-ef85-4ea5-9fb4-4ef1a6b04a3b`), X green on attempt 1, glxgears
+> 300x300 black, `work_gr backend_ok=5 timeout=0`, `bounce copy-out 0
+> changed`, beef ring unresolved; `vgsp` loaded (HEAD `bb802909` plus the
+> campaign's in-flight kernel work), `guest_ram active=1`; pstore empty; no
+> reboot during the check.
+>
+> **Snapshot: 2026-11-10 ~05:30 (SESSION 156 continued; HEAD `cb8e822b`,
+> tree clean, `vgpu/master` in sync; supersedes the 19:15 entry below).**
+> The execution chain came alive overnight. The guest's **real GL draws now
+> forward and execute on the physical GPU** (`work_gr backend_ok=9` on r1683,
+> `backend_ok=5` on r1685), the 2D path is green end-to-end (accelerated X
+> fills read back correctly via `xwd`), and the earlier glxgears poll hang is
+> gone: the GSP event-IRQ fix (`a478f0b4`) now sets the RISC-V SWGEN0
+> IRQSTAT/IRQMASK/IRQDEST and latches the CPU-tree leaf so the guest services
+> the event. The working recipe is a 12 GB file-backed guest
+> (`-object memory-backend-file ... /dev/shm/vgpu-guest-ram`), the
+> `gsp-phys-guest-ram` debugfs translation, the RM-call ladder stages 5/3/4,
+> the full r1624 module-argument set, and `sema_vas_cand_ms=1` (which made X
+> green on attempt 1 in r1685). The beef GR channel `0xbeef0100` now captures
+> real GL draw sections (`len=4808`, `win=1201 words`, `prog=0x4390900`).
+>
+> The new frontier is the **constant buffer**: the draw executes but the
+> engine writes 0 pages, and `bounce copy-out` reports 0 changed. The GL
+> draw's constant-buffer source is forced to the seed page because
+> `sema-gl: cb-copy src=0x0cd70000 ... first8=00000000 ... src=synthetic-id`
+> reads all zeros; a guest-RAM scan found no MVP matrix, and the
+> `0x3f800000` hits in vidmem are shader microcode immediates, not matrices.
+> With a zero MVP every vertex collapses to the origin, so there are no
+> fragments regardless of viewport/render-target. The next step is to decode
+> the CB-bind method on the beef channel, resolve that VA through the channel
+> VAS, and copy the real page into the seed page. Secondary walls: the MME
+> front-end busy/deferred class, the GR stale-wedge recovery, the X DDX
+> push-buffer get-word/notifier recycle (X can still die after a few forward
+> frames into the RM-degraded state), and the DDX's 4 GB sysmem allocation
+> that forces the 12 GB guest.
+>
+> Honest state: still no rendered pixel through the emulated vGPU and no
+> video. The execution chain (submit -> forward -> physical GR -> stores) is
+> now live for the guest's own GL work; the first pixel is gated on the MVP
+> constant-buffer content and the present/copy-out. Milestone position:
+> between M-GL1 and M-GL2. Estimate (subjective): a first non-black frame
+> hours-to-days if the constant-buffer decode behaves like its predecessors;
+> the two-VM GPU-accelerated video after that.
+>
+> CUDA front unchanged (backgrounded while graphics holds the device; its
+> 10-30 status stands): `41343c63` green (`victory_mail` `VADD bad=0` +
+> `STATUS OK`; `vecadd_loop` 100 launches PASS); the fresh-boot battery's
+> red class is D2H-stage with release-discipline fixes staged; the SESSION
+> 143 Vulkan fence regression is not re-measured.
+>
+> Live at check (read-only): r1685 VM up (QEMU 72960, mdev
+> `0dcda61f-a8ef-4111-8993-35942d2d5392`), X green, glxgears 300x300
+> rendering black, `work_gr backend_ok=5`; `vgsp` loaded (HEAD `cb8e822b`
+> plus the runtime parameters above), `guest_ram active=1`, ladder stage 4;
+> pstore empty; no reboot during the check.
+>
+> **Snapshot: 2026-11-09 ~19:15 (SESSION 156 continued; HEAD `21e0d611`,
+> tree clean; supersedes the 19:05 entry below).**
+> The forced-GLX path moved the renderer wall: with
+> `SDL_VIDEO_X11_FORCE_EGL=0` + OpenGL, GZDoom and glxgears now use
+> `libnvidia-glcore` (the EGL/Mesa fallback is gone). The minimal windowed
+> reproducer (`glxgears`) then hangs in the glcore kick wait: the client polls
+> the per-slot `/dev/nvidia-modeset` fd (`poll(POLLIN, 1 s)`); the host's
+> sweep completes the beef notifier memory (`kick-slot completed
+> h=0xbeef0101 ...`, `client-slot cleared h=0xbeef0100`), but the guest kernel
+> never signals the event the poll waits on. The remaining edge is
+> kernel-visible completion: complete the exact notifier page the guest
+> kernel watches and signal the guest event (the kick-notify executor), not
+> just write the memory. GZDoom's window creation fails/hangs at the same step
+> and can still allocate the DDX's 4 GB sysmem block, which occasionally OOMs
+> the 12 GB guest.
+>
+> Current walls, ranked: (1) the kernel-visible GL present/kick completion
+> above; (2) the X DDX push-buffer get-word/notifier recycle (a diagnostic
+> get-word write released the DDX and let GZDoom reach `MAP01` on llvmpipe
+> earlier, but the kernel lever is not implemented); (3) the DDX's 4 GB
+> sysmem allocation (12 GB guest workaround; suspected emulation gap); (4)
+> the direct-GL draws still report `forwarded=0` - decoded and host-completed,
+> not dispatched to the physical GR engine. No rendered frame through the
+> emulated vGPU yet; the earlier `MAP01` was a llvmpipe datapoint, not the
+> target. Milestone position: between M-GL1 and M-GL2.
+>
+> CUDA front unchanged (backgrounded while graphics holds the device; its
+> 10-30 status stands): `41343c63` green (`victory_mail` `VADD bad=0` +
+> `STATUS OK`; `vecadd_loop` 100 launches PASS); the fresh-boot battery's
+> red class is D2H-stage with release-discipline fixes staged; the SESSION
+> 143 Vulkan fence regression is not re-measured.
+>
+> Live at check (read-only): host up 20 h (fresh boot 2026-11-08 22:29);
+> `vgsp` loaded (refcount 0) + mdev
+> `d22c826b-871d-4540-9fc6-63cf3e87f823` + QEMU r1679 live (12 GB guest,
+> glxgears spinning); `nvidia-smi` reports no supported GPU (the vgsp claim
+> is held); pstore empty; no reboot during the check.
+>
+> **Snapshot: 2026-11-09 ~19:05 (SESSION 156 continued; HEAD `e342bd0f`,
+> tree clean, `vgpu/master` in sync; supersedes the 12:45 entry below).**
+> Since the 12:45 entry the campaign closed the X-side execution machinery
+> and moved the pixel gate to concrete blockers. The X server's deaths were
+> separated from driver bugs: the DDX waits are fixed by `408d67d3`
+> (class-aware display arm - the 0xc57e window class has no NOTIFY bit, so a
+> bound notifier is the arm; bfef `0x8000 -> 0` NvNotification completion;
+> the decoded GL release is applied via `sema_gl_hold_apply`, default off;
+> the 0x8000 sweep is extended to the X DDX's own RM channels), on top of the
+> PMA-scrub deadlock fixes (`3701f985`, `ad93b227`) and the channel-VAS push
+> read (`c3887218`). The residual death is an OOM: the X DDX allocates 4 GB
+> of system pages at startup (kprobe and gdbstub: `nv_alloc_pages` count
+> 1048576 from Xorg), which an 8 GB guest cannot absorb once GZDoom adds its
+> own footprint; the current run uses a 12 GB guest.
+>
+> With the DDX unblocked, GZDoom reached `MAP01` for the first time, but on
+> **Mesa llvmpipe**: the NVIDIA Vulkan ICD fails `vkCreateDevice` and the
+> default OpenGL/EGL path falls back to Mesa (`libEGL ... failed to create
+> dri2 screen`). The emulated-vGPU render path is therefore not the one that
+> rendered; the campaign is forcing GLX (`SDL_VIDEO_X11_FORCE_EGL=0`) on the
+> 12 GB run and has fully decoded the DDX push-buffer wait: the 2D reserve
+> exits only when the GPU-written engine get word advances (`get <= put`) and
+> the kick requires the notifier to be recycled to `0xffff` after completion.
+> A diagnostic host write of the get word released the loop and let GZDoom
+> reach `MAP01`; the kernel levers (publish/advance the get word; recycle the
+> notifier) are the next implementation.
+>
+> Honest state: still no rendered frame through the emulated vGPU and no
+> video; GZDoom's `MAP01` is a llvmpipe datapoint, not the target. Milestone
+> position: between M-GL1 and M-GL2. Current walls, ranked: (1) renderer
+> selection - the NVIDIA Vulkan ICD must create a device or the forced-GLX
+> path must reach glcore; (2) the DDX push-buffer get-word/notifier
+> completion; (3) the 4 GB X DDX sysmem allocation (suspected emulation gap)
+> that forces the 12 GB guest; (4) the direct-GL draws still report
+> `forwarded=0` - decoded and host-completed, not dispatched to the physical
+> GR engine. Estimate (subjective): a first NVIDIA-path frame hours-to-days
+> if these behave like their predecessors; the two-VM GPU-accelerated video
+> after that.
+>
+> CUDA front unchanged (backgrounded while graphics holds the device; its
+> 10-30 status stands): `41343c63` green (`victory_mail` `VADD bad=0` +
+> `STATUS OK`; `vecadd_loop` 100 launches PASS); the fresh-boot battery's
+> red class is D2H-stage with release-discipline fixes staged; the SESSION
+> 143 Vulkan fence regression is not re-measured.
+>
+> Live at check (read-only): host up 20 h (fresh boot 2026-11-08 22:29);
+> `vgsp` loaded (refcount 0) + mdev
+> `d3a9e554-f948-45df-b81b-b5e987b0bee8` + QEMU r1678 live (12 GB guest);
+> `nvidia-smi` reports no supported GPU (the vgsp claim is held); pstore
+> empty; no reboot during the check.
+>
+> **Snapshot: 2026-11-09 ~12:45 (SESSION 156; HEAD `4acc81e8`, tree clean,
+> `vgpu/master` in sync; supersedes the 2026-11-06 ~19:00 entry below).**
+> The graphics front moved from the DS SPH validation gate to a working
+> display/GL stack with one named X-side completion wall. Since 11-06 the
+> 38-commit arc ending at `4acc81e8` landed: the host-side EVO display engine
+> (`035d033c`: core/window/imm channels 0xc57d/0xc57e/0xc57b, NV-DMA push
+> parser, SET_NOTIFIER/UPDATE-FINISHED, raster line) makes the guest display
+> chain real only with `disp_caps_seed=1` (the caps window reads all-zero
+> otherwise -> "Unsupported base display class"); the display instance table
+> is resolved in the guest BAR2 aperture as Linux enumerates it (BAR3) and
+> notifier writes are routed by target (FB shadow vs guest PA);
+> `SET_NOTIFIER_DMA` is `valid=1` and `UPDATE -> FINISHED` is 12/12; lost
+> completion events are force-retried. With that, nvidia-modeset/NvKms
+> register (`/dev/dri/card0` + `renderD128` + `fb0`, `nvidia-smi -L` green),
+> X settles, `glxinfo` reports OpenGL 4.6.0 NVIDIA 570.144 with direct
+> rendering, and GZDoom obtains a real GL context. The approved reboot
+> (2026-11-08 22:29) cleared the stale host GSP-RM state that had wedged
+> every boot in `NV_ESC_RM_VID_HEAP_CONTROL`; post-reboot runs reproduce
+> none of it.
+>
+> The windowed path then exposed and closed three completion walls:
+> (a) the UVM channel-pool tracker - a channel rank N owns pool slot N (the
+> earlier rank+1 model pre-satisfied the next rank and lost the write), the
+> release is fanned through every published VAS translation (the pool page
+> moves between RM-memdesc and VAS-walk pages; `80cbbd04`, `a3060a54`) and
+> the init slot escalates 1..4 (`f10714c9`), so six UVM channels now pass
+> their init waits; (b) the direct-GL GR release - the deferral is scoped to
+> the push's own candidate (a global cross-pass arm let stale candidates
+> defer every later release; `1ad9216a`) and `sema-sw` writes now land for
+> `beef0100`; (c) the direct-GL CE channels `beef0101/0102` - a VRAM-shape
+> USERD scan for the beef CE family (`f2476897`) finds their rings and their
+> submissions retire; the X DDX kick channel `bfef0002` decodes its ring head
+> without a USERD and authors the class-2d notification (`4acc81e8`).
+> Fullscreen GZDoom's mode set still wedges X; the campaign path is a
+> settled X + windowed GZDoom.
+>
+> Honest state: GATE1 still not met - no rendered GZDoom frame and no
+> emulated-vGPU video. Current wall (r1664): Xorg spins ~30-41% CPU in
+> `_nv018351rm` while GZDoom blocks on the X GLX reply
+> (`_xcb_wait_for_reply`) then returns to its glcore spin. The remaining
+> objects are the X RM ioctl behind `_nv018351rm`, the X GLX
+> context-creation completion (direct-GL channel completion vs a display
+> flip notifier), and the GZDoom kick-slot word (not the RM notifier page).
+> Milestone position: between M-GL1 and M-GL2 (the client and display stacks
+> execute; pixels are the gate). Estimate (subjective): a first windowed
+> GZDoom frame hours-to-days if the wall behaves like its predecessors; the
+> two-VM GPU-accelerated video follows after a real frame, with 60 fps/no
+> forcing weeks after that.
+>
+> CUDA front unchanged (backgrounded while graphics holds the device; its
+> 10-30 status stands): `41343c63` green (`victory_mail` `VADD bad=0` +
+> `STATUS OK`; `vecadd_loop` 100 launches PASS); the fresh-boot battery's
+> red class is D2H-stage with release-discipline fixes staged; the SESSION
+> 143 Vulkan fence regression is not re-measured. Watch next: the
+> `_nv018351rm` ioctl identification, the X GLX completion object, and the
+> client kick-slot word - then a rendered windowed GZDoom before any
+> capture.
+>
+> Live at check (read-only): host up 14 h (fresh boot 2026-11-08 22:29);
+> `vgsp` loaded (refcount 0) + mdev
+> `dc0cfb79-fd4e-490a-8f08-e5228caeaed0` + QEMU r1664 live; `nvidia-smi`
+> reports no supported GPU (the vgsp claim is held); pstore empty; no
+> reboot during the check.
+>
+> **Snapshot: 2026-11-06 ~19:00 (SESSION 155 continued; r1562 committed
+> post-reboot; HEAD `2f5b838c`, 1 unpushed; supersedes the ~12:55 entry
+> below).** The DS SPH validation wall narrowed to a single bit this
+> afternoon: r1562 (per-stage synth SPH disable mask, `2f5b838c`) reached
+> `ds 80000000->81040000` = **SPH18 only** (GS check2, the geometry-stage
+> attribute map) with the client's own stage VAs
+> (0x01990900/0x01990300/0x01990200/0x01990000 across j0/j1/j2/j5). Two
+> fixes got there: the pair-safe synth bind (`fe03bfe8`) emits the class's
+> own END ahead of a carried-open BEGIN/END pair and orders TYPE/
+> REGISTER_COUNT before the SPH address pair - the r1558 EC 0x0d
+> ILLEGAL_METHOD_IN_BEGIN_END class is gone (r1560: 13 beef launches,
+> 3 DS-FAST, 0 Class Error); and the client's own stage-disable records
+> (`0x2000<-0`, `0x2080<-0x20`, `0x20c0<-0x30`, `0x2100<-0x40`) cleared
+> the VSB 5/7 tess-mode pair (r1561), proving the DS validates every
+> stage - even a disabled one. The DS bitmap is decoded: `SPH<n>`,
+> n = stage*4 + check over VSA/VSB/TCS/TES/GS/PS, with four checks
+> (type/version, mpipe/stage binding, attribute map, stream-out).
+>
+> The r1562 run then poisoned (`badf1201` priv-error, TSG preempt +
+> resched) and entered the known GR timeout/wedge cascade (MME-REGS /
+> FETCH-WIT / MME-FAST spin, 18:47:21); the VM was closed and the host was
+> rebooted cleanly (logind `systemd-reboot` 18:47:20-24; pstore empty, no
+> crash). The reboot is not recorded in the acting handoff (last write
+> 17:59) - reason inferable from dmesg; no post-reboot plan written
+> there. Post-reboot: fresh boot 18:47:56; apt nvidia 570.211.01 green
+> (RTX 2080 Super Max-Q); `vgsp` was down at the check moment; the acting
+> session resumed the stack at 18:56 (vfio prereqs) and r1563 is in
+> preparation (18:57).
+>
+> Afternoon wave since the 12:55 entry: `5fad0adb` (slot-selective
+> `sema_sph_bind_mask`), `c822fa34` (engine-visible MME selector + RT0
+> third-dimension seeds), `3bb62602` (bounded setup-push hold; hold>0
+> stalls the ring behind the unreadable 60216 B setup entry - 0 is the
+> reproducible base), `fe03bfe8` (pair-safe + per-stage bind disable),
+> `91a4b48e` (docs: real render walls), `2f5b838c` (r1562). Earlier in
+> the wave (r1541-r1558): the PS-stage-only bind, the `0x2390`
+> CB-selector poison fix, the EC 0xd2 colour-target third-dimension
+> decode and the completed RT0 bind - the draw validates and stage5
+> populates.
+>
+> Honest state: GATE1 still not met - r1561's two captures 60 s apart are
+> identical and nonblack=0 (black 800x600 window and black root); the
+> best copy-out is 1-2 engine-changed pages that do not land on the
+> visible surface. Milestone position: between M-GL1 and M-GL2. Estimate
+> (subjective): GS 18 is a single named wall (GS-specific attribute/
+> stream state - glxgears emits no GEOMETRY SPH), first non-black frames
+> hours-to-days if it behaves like its predecessors; 60 fps/no-forcing
+> and a video on the emulated vGPU weeks after that; full CUDA breadth,
+> multi-VM and Windows months.
+>
+> CUDA front unchanged (backgrounded while graphics holds the device; its
+> 10-30 status stands): `41343c63` green (`victory_mail` `VADD bad=0` +
+> `STATUS OK`; `vecadd_loop` 100 launches PASS); the fresh-boot battery's
+> red class is D2H-stage with release-discipline fixes staged; the
+> SESSION 143 Vulkan fence regression is not re-measured. Watch next:
+> r1563's DS bitmap (does GS 18 clear?), then a non-poison DS transition
+> with >2 changed pages before any pixel capture.
+>
+> **Snapshot: 2026-11-06 ~12:55 (SESSION 155 continued; r1538 live;
+> HEAD `81bde9b7`; supersedes the ~01:00 entry below).** The graphics
+> campaign moved from "the DRAW macro executes" to "**the first calls-kept
+> draw windows execute with engine-authored stores, and the DS SPH
+> validation is the last gate before pixels**". The fixed-CB upload is
+> decoded end-to-end (MME-wrapper form, the assembler image delivered to
+> the engine-visible seed page, real-CB receipts gating it). The
+> class-error wall that had kept the first calls-kept window from
+> executing was a BEGIN/END pair carried across the window boundary;
+> `81bde9b7` (`sema_gl_pair_close_entry`) emits the driver's own END form
+> (`0x1614` + event word) before the first window run when the tracker
+> carries an open pair. r1529 (P0 config + close): 44 beef launches,
+> **0 Class Error**, `mac=0x22` x16, and 1-2 engine-changed copy-out
+> pages per launch - the slot-34 DRAW_IAB macro (IRAM entry 0x265, 75
+> words) executes (r1526, before the fix: 11 launches, first calls-kept
+> window poisoned at SET_FRONT_FACE `0x191c`, error 0x0d
+> ILLEGAL_METHOD_IN_BEGIN_END).
+>
+> The close is not default yet: r1532 (close + SPH window 0x10004)
+> misfired after 14 failed launches - the injected END itself faulted
+> (`0x1614`, error 0x0d) because the tracker believed a pair was open
+> that the front end had already lost - so it stays default-off until the
+> pair model is committed only on retire. The SPH version window is not
+> the DS gate: r1535 (P0 + close + `sema_sph_version_val=0x10004`) ran 49
+> launches with 0 Class Error and `mac=0x22` x18, but the DS still
+> escalated `80000000->84000420->86040624->86040666` and only 1-2 pages
+> changed (seed bi=768, clear bi=772/773). The DS signature
+> (`stage=00000000,01990900,01990200,00000000,00000000,01990000`,
+> `region=0/0`) is SPH2|SPH5|SPH9|SPH10|SPH18 with M_PIPE_STAGE=VSB|TI;
+> the three stage VAs are legal V4 headers, so the failing entries are
+> channel-level (cache/other binds), not those headers. Ranked next:
+> (1) skip binds whose page does not start with SPH version 4
+> (`sema_sph_bind_filter`, receipt `SPH-BIND-FILTER`); (2) emit the
+> program region as one 2-word INC run and fix the MME shadow read index
+> to `(mthd >> 2) & 0xfff` before trusting the `scratch[0x78]` evidence;
+> (3) make the pair model transactional (commit pair state only on
+> retire, then re-enable pair-close by default); (4) sweep every bound
+> SPH VA's first word and the per-stage bind list.
+>
+> Live at check (read-only): host up 5 h 13 m (fresh boot this morning);
+> `vgsp` loaded (refcount 0) + mdev
+> `c71c1617-b502-4ff0-9659-64df695aaa27` + QEMU 484365; r1538 (SPH
+> bind/region experiment) is live and left running; its early receipts
+> show `SPH-BIND emitted` and `SPH-REGION emitted` (bases
+> 0x1500000/0x15c0000/0x1990000/0x1ab0000), mixed 1-2/0 changed-page
+> copy-outs, and a 0-byte screen-capture fetch (no non-black frame yet);
+> `pstore` empty; no reboot during the check (in-session cycles only);
+> HEAD `81bde9b7` == `vgpu/master`, tree clean; `nvidia-smi` reports no
+> GPU (the vgsp claim is held).
+>
+> CUDA front (backgrounded while the graphics campaign holds the device;
+> its 10-30 status stands): the physical-engine path is green
+> (`41343c63`; `victory_mail` `VADD bad=0` + `STATUS OK`; `vecadd_loop`
+> 100 launches PASS); the fresh-boot battery's red class is D2H-stage
+> (release-before-work, ledger-vs-writer divergence, memset
+> readback/writeback race - all proven; release-discipline fixes staged,
+> not yet validated); the SESSION 143 Vulkan fence/completion regression
+> is still not re-measured, and the guest Vulkan pipeline renders
+> end-to-end but black (the inline-to-memory upload arm is its named
+> gap). Two guests with two mdevs coexist at boot level (guest-B CUDA
+> awaits per-guest ownership). The Vulkan black-frame path and the GL
+> pixel gate are separate; the GL draw is the one currently executing.
+>
+> Honest state: GATE1 is not met - the X screen is black/static and the
+> best capture remains the earlier 2.08% non-black static twin frames
+> (not pixels); the app's ~450 FPS is fence-level completion. The
+> milestone position is between M-GL1 and M-GL2 (the gate = a swap-hook
+> capture with real motion). Estimate (subjective): first non-black
+> frames hours-to-days if the DS gate behaves like its predecessors;
+> 60 fps / no-forcing and a video on the emulated vGPU weeks after that;
+> full CUDA breadth, multi-VM and Windows months. Watch next: r1538's DS
+> result, the SPH bind-filter / region-form fixes, and a first non-black
+> xwd on a fresh cycle.
+>
+> **Snapshot: 2026-11-04 ~12:45 (graphics-execution campaign, SESSION
+> 153/154 continued, r1442-r1451; HEAD `bbda751e`, tree clean,
+> `vgpu/master` in sync).** Since the 10-30 snapshot the active front is
+> **graphics execution**: the emulated vGPU went from "the method stream
+> retires but writes nothing" to "the direct GL client's DRAW macro
+> executes to completion and the engine writes pages - rasterised pixels
+> are the remaining wall". Engine-verified milestones since 10-30: the
+> first beef launches retiring (`fdfb4673`) and the byte-exact
+> present-blit proof (`eef52abe`); the first full window retire
+> (`e3ecd6a3`) and the DRAW-class window retire with stubbed macros
+> (`8528df77`); full MME macro-program capture with the offline proof that
+> the packed image equals the live program (`66d95894`, `ffaa39f3`); the
+> first engine store retirements (`output retirement 2/901 pages changed`,
+> CONT-104) with `0x2390` root-caused to LOAD_CONSTANT_BUFFER and the
+> constant-buffer-selector slot fix; the MME IRAM readback gate whose live
+> debug-port reads match the packed image at macro entry, and slot-57
+> macro execution to its last instruction with stores growing 9 -> 238 ->
+> 305 of ~903 (CONT-107/CONT-109, `8df33f1f`, `0eb64118`); the first
+> engine-changed render-target pages in the completion copy-out (r1385,
+> CONT-111); SESSION 154's client-formation protocol (one X-client
+> teardown + re-create makes formation reliable), the golden macro overlay
+> (`94c432d9`) and the first slot-34 (DRAW_IAB) execution via the
+> pipeline-stage bind lever (`b0171765`); and the 11-03/11-04
+> release-sequencing wave (settle hold, strict release, front-end-busy
+> deferral, window hold) plus the pipeline-binding emission fix
+> (`79545530`) together with carrying the program-address pair - the two
+> walls that blocked the called-macro path (`0x2090` binding rejection,
+> the VA-0 constant fetch) are down: on the best boot both called macros
+> reach their ends (slot 57 `mpc=930`, slot 2 `mpc=22`), 9 launches clean
+> (7 consecutive), store retirements and engine-changed copy-out pages
+> observed. Current graphics walls (ranked): (a) residual per-launch
+> poison classes under the call/window-content lottery (`0x2390` LCB,
+> `0x1614`, the `0x100 deaddead` cascade), with levers built or in flight -
+> the latest (`bbda751e`) drops the attr-prelude SET_PIPELINE run the front
+> end refuses cold; (b) the newly named **raster blocker** - draws retire
+> without storing to the X framebuffer, so render-target/surface binding
+> is the next gate; (c) the present/capture path once (b) lands. Honest
+> state: GATE1 is not met - the X screen is static/black and the guest
+> glxgears window reads 2.08% non-black static twin frames (not pixels);
+> the app loop's ~450 FPS is fence-level completion, not rendering; the
+> milestone position is between M-GL1 and M-GL2 (the gate = a swap-hook
+> capture with real motion). **CUDA front (backgrounded while the
+> graphics campaign holds the device; its 10-30 status stands):** the
+> physical-engine path is green (`41343c63` cross-class ring-claim fix;
+> `victory_mail` `VADD bad=0` + `STATUS OK`; `vecadd_loop` 100 launches
+> PASS); the fresh-boot battery's red class is D2H-stage
+> (release-before-work, a ledger-vs-writer divergence, a memset
+> readback/writeback race - all proven; release-discipline/opdef-deadline
+> fixes staged, not yet validated); the SESSION 143 Vulkan fence/
+> completion regression is still not re-measured, and the guest Vulkan
+> pipeline renders end-to-end but black (the inline-to-memory upload arm
+> is its named gap). Two guests with two mdevs coexist at boot level
+> (guest-B CUDA awaits per-guest ownership). Live at check (read-only):
+> host up 1 d 20 h; `vgsp` loaded (refcount 0) + mdev
+> `6daed337-d05d-4185-a6fa-5a978d7d1cc7` + QEMU `e726ba0b`; campaign r1451
+> in flight (the run at the check instant showed the known
+> WEDGE-REARM/`-110` failure class); pstore empty; `nvidia-smi` reports no
+> GPU (the claim is held). Commits this arc (about 90,
+> `fdfb4673`..`bbda751e`): the retire ladder, `2bc41213`..`ffaa39f3`
+> (first stores), `8df33f1f`/`0eb64118`/`e2560a54` (macro completion,
+> engine-changed pages), `94c432d9`, `b0171765`, and the SESSION 154
+> ladder `63541b75`..`bbda751e`.
+>
+> **Snapshot: 2026-10-30 ~12:20 (SESSION 153, r1013 live; HEAD `a64169db`).**
+> The arc since the SESSION 143 snapshot split in two. Guest CUDA on the
+> physical engine: the post-reboot stall is root-caused and fixed - the GR
+> ring-autopin fallback and the CE first-submission capture each guarded
+> block ownership only within their own engine class, so a channel could
+> latch a live foreign FB block (`41343c63`: cross-class block claims,
+> pre-latch CE reservations, own-block latch semantics) - and the fixed
+> build is green repeatedly (`victory_mail` `VADD bad=0` + `STATUS OK`;
+> `vecadd_loop` 100 launches PASS). The fresh-boot battery's remaining red
+> class is D2H-stage (release-before-work, a ledger-vs-writer page
+> divergence and a memset readback/writeback race are all proven;
+> release-discipline fixes are staged but uncommitted; the opdef-deadline
+> slot-complete path is the next fix). X/GL on the emulated vGPU: the wall
+> that stood since the early sessions is closed - `fffae7b1` gets Xorg `:0`
+> through the nvidia-push DMA sanity push and ScreenInit (`glxinfo` =
+> OpenGL 4.6.0 NVIDIA 570.144, direct rendering, GZDoom launches), with the
+> RC watchdog channel registered/serviced (`8898bd00`+`42c9626b`) and
+> per-client VAS resolution (`38ba1e2d`: a channel's VAs resolve through
+> its own VAS first). The app-side 10 s/frame waits are the client's own
+> give-up manager; the `sema_xw_mirror` pair completes presents (glxgears
+> latches 128-146 FPS, 200+ in the later shim runs) but produces no
+> rendered output - the GL draw stream is marshalled, not executed. The
+> engine now executes the real GL method stream in two forms: the C597
+> section capture + synthesized compute launch retires its QMD on real
+> sm_75 SASS (`0ee574a3`..`595e023a`), and the verbatim 3D method-stream
+> replay lane retires real 3D methods with no QMD (r932); the hard limit
+> is that rasterised GL pixels still need the real 3D pipeline. SESSION
+> 153's headline: the direct GL client's device-init gate is root-caused to
+> the driver-shared memfd slot word (bit 0 set = glcore skips its
+> class-0xc46f channel creation); cleared, the client allocates its
+> channels (0xbeef0100/0101/0102 plus 0x902d/0xc5b5/0xc597/0x9072/0xa140/
+> 0x90f1) and `glReadPixels` returns with GL error 0 - fixed field-side by
+> the kernel keeper `sema_shared_hold_pa` (`a64169db`, holds bit0 clear
+> deterministically) plus host hold/toggle automation (the MakeCurrent
+> handshake needs the 2<->3 transition). Current walls (ranked): (a) the
+> fresh-boot Xorg DMA-init failure in r1013 (a 10 s `Failed to initialize
+> DMA` -> no X server, so no client; a different wait from the member-spin
+> class); (b) the client PUT-visibility wall - the direct client's channels
+> never submit (its process writes no GP_PUT anywhere, the BAR0/BAR1-shadow
+> premise was falsified by direct measurement, and the submitting DDX-side
+> channel's USERD is guest RAM already tracked by the RAM scan); (c) the
+> pixel wall - no render content reaches any ring (X-side pushes are 32-64
+> B housekeeping BEGINs; every capture/readback is black). Landmine:
+> killing/exiting a direct client can trip a 4 GB `nv_alloc_system_pages`
+> guest-kernel oops - never kill clients; re-cycle instead. Delivered on
+> the emulated vGPU: the R18 CUDA-animation video (`70134652`; 60/60
+> frames zero faults, frames exact vs CPU math, single-page kernels only -
+> the window-0 code shadow carries one 4 KB page, so kernels >4 KB stay
+> hostile until it grows) and two two-VM GZDoom videos (`375d627a` tools;
+> the GPU-accelerated one runs on virtio-gpu/virgl on the host iGPU, not
+> the emulated vGPU, which remains the core frontier). Host clean, pstore
+> empty; live: r1013 mdev `95446a6c-d5da-4e74-920b-5ac0d7ccc303`, QEMU
+> 2335256, guest no Xorg/no GL client, pin/sem helpers up. Also open: the
+> SESSION 143 Vulkan-client completion regression (fence timeout with the
+> push re-completed) - not re-measured since r816, priority moved to the
+> GL path. Commits this arc: `41343c63`, `fffae7b1`, `8898bd00`,
+> `42c9626b`, `38ba1e2d`, `6f2e6193`, `0ee574a3`..`595e023a`, `70134652`,
+> `375d627a`, `1fd8d50a`, `f500779b`..`a64169db` (SESSION 153 ladder).
+>
+> **Snapshot: 2026-10-26 (SESSION 143, post-reboot).** The r800 walk guard
+> holds and the `gsp_phys_gr_min_data=0` bypass reaches the real engine: the
+> guest Vulkan compute launch is now *submitted* (no oops, no degenerate-set
+> refusal), the engine fetches the host-deposited QMD and the firmware reports
+> a real `MMU Fault ... @ 0xdf_d8feb000, FAULT_PDE` at the guest program VA -
+> the channel/context are alive, the program page is empty and unmapped. The
+> util-sweep channel-visibility work (per-channel begin/skip/read=none lines)
+> proves the Vulkan copy-class channels (0xbeef0101/0xbeef0102, engines 11/12)
+> are registered and swept but never pushed, and that no channel carries
+> program bytes or a `LAUNCH_DMA`: the code page (0x62b000 / rotating 0xc8b000)
+> never fills. The frontier is therefore (1) the driver's staging-ring ->
+> code-heap upload copy, which is not among the decoded pushes, and (2) the
+> engine page-table mapping for the program VA. Separately, the refusal path no
+> longer reaches the earlier three-black-frame baseline (`SYNTH-FAULT` vs the
+> software completion/fence ordering), which must be restored before further
+> observation. Docs: `docs/04-implementation/04-real-render-walls.md` sections
+> 20-21. Commits: `34e611f4`, `c5510744`, `28def33e`, `0ca8ff9f`.
+>
+> **Snapshot: 2026-11-06 ~01:00 (the guest's REAL Vulkan pipeline now
+> renders on the emulated vGPU: the first `VKFRAME seq=1..3` /
+> `VKFRAME_DONE frames=3 640x480 saved=3` / `VKFRAME_IDLE ok` runs
+> end-to-end — instance, device, allocation, image/view/buffer/shader/
+> descriptor/pipeline/command-buffer/fence, queue submit, fence release
+> and frame readback all complete with a zero-touch service pipeline.
+> The chain of fixes behind it: the push-stream parser now accepts the
+> driver's real shapes (the `0x0001fff0` SET_SUBDEVICE_MASK bracket and
+> zero NOP gaps — the class that silently skipped every large push), the
+> fence fold (`sema_gr_ahead`) sweeps the pre-built GPFIFO continuation
+> beyond GP_PUT and applies the submit's INC-5 RELEASE groups
+> forward-only, the host-triggered VAS page-directory anchoring verifies
+> the parked `COPY_SERVER_PDES` candidate against a content-located ring
+> pair so the walk resolves every push VA before its first read, the
+> COMPR+2MB VidHeap class is downgraded at the ioctl so
+> `vkAllocateMemory` succeeds, the SEC2 scrubber's finish payload is
+> authored by the service, the `0x9096` VidHeap enumeration and the
+> `FIFO_GET_ENGINE_CONTEXT_PROPERTIES` ZCULL geometry are answered, and
+> the C5C0-section -> vendor-launch translator found the real dispatch
+> (a `SET_INLINE_QMD_ADDRESS_B` + 64-word run building QMD `0x4b85f00`,
+> grid 40x30, plus the C5B5 copy-out). The frames are still BLACK: the
+> driver delivers SASS/descriptors through its MME program + inline-to-
+> memory stream (decoded in full; the payload rides the next GPFIFO
+> entry as a source-view call), and the utility/copy-channel
+> `LOAD_INLINE_DATA` arm that must materialize those writes is the
+> current frontier (arbitration + `sema-utildec` witness landed). CUDA
+> meanwhile: the best fresh-boot battery is 8 pass / 3 fail / 1 hang
+> (the Vulkan work does not regress CUDA; always battery-first on a
+> fresh boot); GL runs on the guest GPU (next wall = the FBO class); the
+> Looking Glass frame path is proven end-to-end (guest render -> KVMFR
+> ivshmem -> host PNG frame); two guests with 512M + 1GiB emulated VRAM
+> coexist at boot level; the 0.9.9 release-preview demo video v1 is
+> synced to files.vgpu.io (the updated video with GZDOOM working is the
+> next publish). Frontier = non-black frames, then Xorg -> GZDOOM
+> (GL/Vulkan) -> KVMFR/LG frames -> CUDA 15/15 + soak -> the perfect
+> 1.0.0 video -> Windows guests).**
> This is a dated public
> status page, not live state; it is refreshed on every progress check. Live
> working notes are maintained outside this repository; the public
@@ -23,6 +678,20 @@ program against the physical TU104 backend (a `vectorAdd`-class kernel whose
results verify), then the remaining open gates (multi-VM, 3D, Windows,
isolation, performance, portability).
+**Graphics objective (companion).** Land the first rasterised frame from an
+unmodified guest graphics client on the emulated vGPU - the graphics ladder
+**M-GL1** (client context-init executes) -> **M-GL2** (`glxgears` non-black
+with motion) -> **M-GL3** (GZDoom GL through the mdev) -> **M-GL4** (60 fps,
+no forcing) -> **M-GL5/M-GL6** (two VMs; video) - with gate definitions in
+[`docs/04-implementation/05-graphics-execution-plan.md`](docs/04-implementation/05-graphics-execution-plan.md).
+The current position is between M-GL1 and M-GL2: the display and GL stacks
+now execute in the guest (NvKms registers, `/dev/dri`, X settles, `glxinfo`
+4.6.0 direct, GZDoom obtains a real GL context) and windowed GZDoom reaches
+renderer startup; the remaining gate is the X RM ioctl / GLX completion path
+before a rendered frame (see the snapshot above). Both objectives are needed
+for the 1.0 mission; the CUDA front is backgrounded while the graphics
+campaign holds the device.
+
**Status.**
- **Emulation front: GREEN.** The driver-API smoke completes end-to-end
@@ -515,11 +1184,24 @@ isolation, performance, portability).
can drive the host-owned device to an ECC Xid; shadowed BAR2 prevents it -
committed and holding, no Xid since). Recurring and separate: guest-kernel boot
panics (a NULL-in-interrupt/swap class) can kill a no-claim run at startup -
- guest-side only, host stays healthy. A new host panic class was logged
- 2026-10-05 11:18 with the (saved, reverted) pool-write-refusal experiment: a
- sleeping VFIO mutex taken in atomic context in the sema GMMU walk plus a
- vmalloc fatal exception in the bridge marshal path; reboot recovered the
- host, no Xid.
+ guest-side only, host stays healthy. A new host panic class was logged
+ 2026-10-05 11:18 with the (saved, reverted) pool-write-refusal experiment: a
+ sleeping VFIO mutex taken in atomic context in the sema GMMU walk plus a
+ vmalloc fatal exception in the bridge marshal path; reboot recovered the
+ host, no Xid.
+5. **Graphics execution (the display/GL campaign; current top front).** The
+ production display and GL stacks now run end-to-end in the guest - the host
+ EVO display engine serves the push-buffer channels, NvKms registers, X
+ settles, `glxinfo` is green and GZDoom obtains a real GL context - and the
+ direct-GL GR/CE channels submit. The remaining gates are: (a) the X RM
+ ioctl behind `_nv018351rm` and the GLX context-creation completion
+ (direct-GL channel completion vs a display flip notifier); (b) the GZDoom
+ kick-slot word (the client polls a kick-slot GPU VA, not the RM notifier
+ page); (c) the raster/present path once (a)-(b) complete. Fullscreen
+ GZDoom's mode set still wedges X; the campaign path is a settled X +
+ windowed GZDoom. GATE1 (a non-black frame with motion) is unmet. Full
+ context: the 2026-11-09 and 2026-11-06 snapshots above and
+ [`docs/04-implementation/05-graphics-execution-plan.md`](docs/04-implementation/05-graphics-execution-plan.md).
## Options to accelerate debugging toward end-to-end CUDA (candidate techniques; not directives)
@@ -671,9 +1353,11 @@ meant to execute on the physical GPU.
| CUDA userspace: `cuInit`, `cuDeviceGetCount`, `cuDeviceGet` | ✅ |
| `cuCtxCreate` returns | ✅ (the whole smoke test now completes) |
| `cuMemAlloc` + `cuMemcpy` roundtrip (`ALL OK` in the smoke test) | ✅ payload roundtrip verified 64/64 in the guest |
-| Full `nvidia-smi` output / kernel launch | 🟡 the static runtime initializes end-to-end with **real releases** and the launch now executes through the host bridge (see next row); a full `nvidia-smi` (per-process/utilization) remains unverified |
-| CUDA kernel execution (`vectorAdd`) | ✅ **First green end-to-end guest CUDA (2026-10-04 ~16:20, no-claim host bridge):** `MAIL` + `VADD n=1048576 bad=0 checksum=392344090.500000` + `STATUS OK`, three consecutive deterministic supervised cycles, committed `cf6ff542`. The vadd runs through the host CUDA bridge daemon; forwarding guest engine work to the real GPU is the remaining backend path. |
-| Graphics (3D), video | ❌ |
+| Full `nvidia-smi` output / kernel launch | 🟡 the static runtime initializes end-to-end with **real releases**; a full `nvidia-smi` (per-process/utilization) remains unverified |
+| CUDA kernel execution (`vectorAdd`) | ✅ **Guest CUDA executes on the physical GR engine (host bridge disabled, since 2026-10-14):** `victory_mail` `VADD bad=0` + `STATUS OK` and `vecadd_loop` 100 launches PASS; matmul/transformer green after the 2026-10-20 boot-lottery fix (`c72f8948`). Remaining red class: the D2H-stage data classes (release-discipline fixes staged); launch-latency robustness; then battery/soak/multi-tenant breadth. |
+| Graphics execution - OpenGL/X on the emulated vGPU | 🟡 the production display/GL stack now runs: nvidia-modeset/NvKms register (`/dev/dri/card0`, `renderD128`, `fb0`; `nvidia-smi -L`), X settles, `glxinfo` reports 4.6.0 (NVIDIA, direct rendering), GZDoom obtains a real GL context, and the direct-GL GR/CE channels submit (`beef0100/0101/0102`); the UVM channel-pool, GR release-deferral and CE USERD walls are closed. **No rendered frame yet:** the remaining gate is the X RM ioctl/GLX completion (`_nv018351rm`) plus the client kick-slot word; fullscreen GZDoom's mode set still wedges X, so the campaign uses a settled X + windowed GZDoom. Ladder position: between M-GL1 and M-GL2. |
+| Vulkan on the emulated vGPU | 🟡 the guest pipeline renders end-to-end but black; the inline-to-memory upload arm is the named gap; the SESSION 143 fence/completion regression is still open. |
+| Video | 🟡 R18 CUDA-animation video on the emulated vGPU (60/60 frames, exact vs CPU math); two two-VM GZDoom videos (the GPU-accelerated one is the labelled virtio-gpu/virgl path, not the emulated vGPU); the two-VM GPU-accelerated GZDoom video on the emulated vGPU is not yet produced. |
| Faults, multi-version, Windows, migration, multi-tenancy, performance | ❌ |
Test status is tracked with the CUDA driver-API smoke test