From 45b03a89e6d836cb8a7a5d83e9d78c7a50de2994 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Rasmusson Date: Sun, 15 Nov 2026 11:18:58 -0500 Subject: wiki: refresh the graphics frontier to the DS stage-image gate (eng51 landed; draw macro executes, store pending) --- wiki/Execution-Frontier.md | 53 +++++++++++++--------- wiki/Execution-Plane.md | 21 +++++---- wiki/FAQ.md | 20 +++++---- wiki/Graphics-Execution.md | 104 ++++++++++++++++++++++++------------------- wiki/Host-Module.md | 13 ++++-- wiki/OpenGL.md | 37 +++++++++------ wiki/Physical-GPU-Backend.md | 14 +++--- wiki/Project-Goals.md | 5 ++- wiki/Project-Plan.md | 5 ++- 9 files changed, 159 insertions(+), 113 deletions(-) (limited to 'wiki') diff --git a/wiki/Execution-Frontier.md b/wiki/Execution-Frontier.md index f24a15a..5f0acfc 100644 --- a/wiki/Execution-Frontier.md +++ b/wiki/Execution-Frontier.md @@ -14,7 +14,8 @@ > [`../docs/04-implementation/03-execution-frontier.md`](../docs/04-implementation/03-execution-frontier.md); > the docs tree wins on disagreement. -Status: 2026-11-14, tree `master @ 339da842`. +Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in +the working tree. Tags: `[live]` observed; `[wip]` partial; `[wall]` current blocker; theories are labelled as such. @@ -112,15 +113,21 @@ the direct-GL submission is fully decoded: no client push carries a method-grammar draw header — the work is macro-driven (data-block blobs plus small state pushes invoking MME macros) — and the recycled pushes are now recovered, so the client's draw-state push opens a `C597` section, captures, -and reaches the engine with the golden MME overlay. What is missing is -**window/screen pixels through the NVIDIA path**: the beef lane's 2799-word -packed MME program cannot complete inside its <=2048-word block with the -draw window, so `live_gen` never promotes and the draw never stores -(`wrote=0`, `px0=0`); the multi-part keep-window mechanism is committed -default-off with the A/B pending, RT routing was tested and refuted as the -cause, the `CODESRC` fault-park class is prevented, glxgears' window is -black, and a synchronous window draw wedges X on some boots. The X -first-generation start lottery is now the dominant throughput limiter. The +and reaches the engine with the golden MME overlay. The MME chain then +advanced from the multi-part gate to **draw-macro execution**: multi-frame +keep-windows land, the part-launch poison is eliminated (the client's own +`SET_REPORT_SEMAPHORE`/`SET_NOTIFY` writes to remapped client VAs were the +real fault; they are redirected to a mapped scratch slot), the 2799-word pack +completes (2799/2799), the first `MME-PACK-REARM` fires, the fixed-CB region +is aliased, and `DRAW_IAB` (`mac=0x22`) runs with the SPH-BIND prelude intact +(84 words) and the DS stage VAs populated. What is missing is +**window/screen pixels through the NVIDIA path**: the DS stage-0/1 image is +the last named gate (the synthesized binds read `family+0x900`, which is zero +in the live family page, while the client's VTG SPH image is at +`family+0x600`), so the draw never stores (`wrote=0`, `px0=0`); the +window/screen present path is unproven, glxgears' window is black, and a +synchronous window draw wedges X on some boots. The per-boot binding and X +first-generation start lottery are now the dominant throughput limiter. The guest Vulkan pipeline's inline-to-memory upload arm is its gap. The full picture lives on [`Graphics-Execution.md`](Graphics-Execution.md). @@ -187,12 +194,15 @@ GPU-rendered frames and videos are captured off-screen, and the direct-GL ring/USERD machinery is substantially hardened); the direct-GL submission is fully decoded (macro-driven; no method-grammar draw header in any push), the recycled pushes are recovered, and the client's draw-state push opens, -captures and reaches the engine. The remaining gap is MME macro completion: -the beef lane's 2799-word packed program cannot complete inside its -<=2048-word block with the draw window, so `live_gen` never promotes and the -draw never stores (RT routing was tested and refuted as the cause; the -multi-part keep-window A/B is pending). glxgears' window is black, a window -draw wedges X on some boots, and the X first-generation start lottery is the +captures and reaches the engine. The MME chain now completes and executes the +draw macro: multi-frame keep-windows land, the 2799-word pack completes, the +first `MME-PACK-REARM` fires, the fixed-CB region is aliased, and `DRAW_IAB` +(`mac=0x22`) runs with the SPH-BIND prelude intact and the DS stage VAs +populated. The remaining gap is the **DS stage-0/1 image** (the synthesized +binds read `family+0x900`, which is zero in the live family page, while the +client's VTG SPH image is at `family+0x600`; the `+0x600` bind is in flight) +so the draw stores. glxgears' window is black, a window draw wedges X on some +boots, and the per-boot binding plus X first-generation start lottery is the dominant throughput limiter ([`Graphics-Execution.md`](Graphics-Execution.md)). @@ -208,12 +218,11 @@ dominant throughput limiter 4. **Hold the acceptance battery** — vector-add, matrix-multiply and the transformer kernel; each entry is accepted only on its own verification output (`bad=0` + `STATUS OK`). -5. **The graphics pixel frontier** — land the MME multi-part keep-window A/B - so the beef macro program completes and `live_gen` promotes, verify the - store (`wrote>0`) at the bound render target, make the window/screen - present land, and reduce the X first-generation start lottery so the - proven off-screen frames become window pixels; the lanes, the walls and - the milestone ladder are on +5. **The graphics pixel frontier** — finish the DS stage-0/1 image bind + (`family+0x600`) so the executed `DRAW_IAB` macro stores (`wrote>0`) at the + bound render target, then make the window/screen present land, and reduce + the per-boot binding/X start lottery so the proven off-screen frames become + window pixels; the lanes, the walls and the milestone ladder are on [`Graphics-Execution.md`](Graphics-Execution.md). ## 7. Theories, resolved diff --git a/wiki/Execution-Plane.md b/wiki/Execution-Plane.md index 9c6909c..7f6dd6b 100644 --- a/wiki/Execution-Plane.md +++ b/wiki/Execution-Plane.md @@ -8,7 +8,8 @@ > when the two disagree, the docs tree wins. Front door: > [`../docs/README.md`](../docs/README.md). -Status: 2026-11-14, tree `master @ 339da842`. Tags: `[live]` proven with the +Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in +the working tree. Tags: `[live]` proven with the stock guest driver; `[gated]` implemented, default-off or parameter-gated; `[wip]` partial; `[wall]` current blocker; `[target]` named success latch; `[planned]` designed, not built. @@ -161,14 +162,18 @@ guest: push + QMD + GPFIFO entry + doorbell (BAR0 0x88704) (no method-grammar draw header; the work is macro-driven — data-block blobs plus small state pushes invoking MME macros), the recycled pushes are recovered, and the client's draw-state push opens, captures and reaches the - engine (`GR LAUNCH submitted` + OK, golden MME overlay accepted). No + engine (`GR LAUNCH submitted` + OK, golden MME overlay accepted). The MME + chain now completes and executes the draw macro: multi-frame keep-windows + land, the 2799-word pack completes, the first `MME-PACK-REARM` fires, the + fixed-CB region is aliased, and `DRAW_IAB` (`mac=0x22`) runs with the + SPH-BIND prelude intact (84 words) and the DS stage VAs populated. No non-black **window/screen** frame has been produced through the NVIDIA path - yet: the MME macro program does not complete (the 2799-word packed program - cannot fit its <=2048-word block with the draw window, so `live_gen` never - promotes; the multi-part keep-window A/B is pending), RT routing was tested - and refuted as the cause, glxgears' window is black, and X start keeps a - per-boot first-generation lottery, so those are the named blockers. The - lanes and the ladder are on + yet: the remaining gate is the DS stage-0/1 image (the synthesized binds + read `family+0x900`, zero in the live family page, while the client's VTG + SPH image is at `family+0x600`), so the draw never stores (`wrote=0`, + `px0=0`); the window/screen present is unproven, and the per-boot binding + plus X first-generation lottery is the throughput limiter. Those are the + named blockers. The lanes and the ladder are on [`Graphics-Execution.md`](Graphics-Execution.md). ## 6. Portability diff --git a/wiki/FAQ.md b/wiki/FAQ.md index 1a068c5..37179ee 100644 --- a/wiki/FAQ.md +++ b/wiki/FAQ.md @@ -5,7 +5,8 @@ > [`../docs/09-reference/glossary-and-faq.md`](../docs/09-reference/glossary-and-faq.md); > the docs tree wins on disagreement. -Status: 2026-11-14, tree `master @ 339da842`. +Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in +the working tree. ## Project and positioning @@ -52,13 +53,16 @@ minutes), captured GL sections now execute on the engine, and the direct-GL submission is fully decoded: it carries no classic draw header (the work is macro-driven; data-block blobs plus small state pushes invoking MME macros), the recycled pushes are recovered, and the client's draw-state push opens, -captures and reaches the engine. Window and screen pixels are still the wall: -the MME macro program does not complete (the 2799-word packed program cannot -fit its <=2048-word block with the draw window, so `live_gen` never promotes -and the draw never stores; the multi-part keep-window A/B is pending), RT -routing was tested and refuted as the cause, glxgears' window is black, and X -start keeps a per-boot first-generation lottery. The guest Vulkan pipeline -runs end to end (device +captures and reaches the engine. The MME chain now completes and executes the +draw macro: multi-frame keep-windows land, the 2799-word pack completes, the +first `MME-PACK-REARM` fires, the fixed-CB region is aliased, and `DRAW_IAB` +(`mac=0x22`) runs with the SPH-BIND prelude intact and the DS stage VAs +populated. Window and screen pixels are still the wall: the remaining gate is +the DS stage-0/1 image (the synthesized binds read `family+0x900`, zero in +the live family page, while the client's VTG SPH image is at `family+0x600`), +so the draw never stores, glxgears' window is black, and the per-boot binding +plus X first-generation start lottery is the throughput limiter. The guest +Vulkan pipeline runs end to end (device → command buffer → fence → readback) but frames are black. See [`OpenGL.md`](OpenGL.md), [`Vulkan.md`](Vulkan.md) and [`Graphics-Execution.md`](Graphics-Execution.md). diff --git a/wiki/Graphics-Execution.md b/wiki/Graphics-Execution.md index 7879505..b221180 100644 --- a/wiki/Graphics-Execution.md +++ b/wiki/Graphics-Execution.md @@ -12,7 +12,8 @@ > [`../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-14, tree `master @ 339da842`. Tags: `[live]` observed end to +Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in +the working tree. Tags: `[live]` observed end to end; `[wip]` partially built; `[wall]` current blocker; `[target]` defined success state; `[planned]` designed, not built. @@ -109,17 +110,28 @@ fidelity: verbatim 3D lane (the first direct-GL stream3d marks), and with the golden MME overlay satisfying the prelude gate it **reaches the engine** (`GR LAUNCH submitted` + OK, MME-PRELUDE pack 1701 IR words, MME-GOLDEN - slot 0 accepted). The current wall is **MME macro completion**: the beef - lane's 2799-word packed program cannot complete inside its <=2048-word - block together with the 156-400-word draw window, so the load-only carrier - gate drops every beef window and `live_gen` never promotes; a multi-part - keep-window mechanism is committed default-off (`b44694b5`) and enabled in - the campaign parameters (`339da842`), with the A/B pending. RT routing was - tested and refuted as the store cause (RT0 bind verified 16x, still - `wrote=0`), and the `CODESRC` fault-park class is prevented (a suspect - program page is relocated to the engine-mapped window-0 shadow; - `17c7ed7c`). The window stays black; the window/screen present is still the - frontier (§6). + slot 0 accepted). The MME chain then advanced from the multi-part gate to + **draw-macro execution**: the multi-part keep-window mechanism won + multi-frame windows, the part-launch poison was eliminated (the real fault + was the client's own `SET_REPORT_SEMAPHORE`/`SET_NOTIFY` writes to client + VAs remapped by the host scratch page-table pool — redirected to a mapped + scratch slot; 49 cycles with zero poison and zero MMU faults), the + 2799-word pack completes (2799/2799), engine-global completion plus + keep-done-across-recycle produced the first `MME-PACK-REARM`, the fixed-CB + region is aliased, and the released calls run macros through to + **`DRAW_IAB` (`mac=0x22`)**. Two synthesized-prelude defects were then + fixed: the SPH-BIND prelude self-destructed because an auto-dropped run + broke its kept/final count (`444ae2c1`), and the stage block was silently + skipped by a double-counted budget; with both fixed the prelude emits 84 + words and the DS stage VAs populate (one validated boot carried the full + post-REARM chain, `mac=0x22` and `DS 86040624`). The remaining gap is the + **DS stage-0/1 image**: the synthesized binds read `family+0x900` (zero in + the live family page) while the client's VTG SPH image is at + `family+0x600`, so binding `+0x600` is the in-flight change. Stores still + miss (`wrote=0`, `px0=0`), the window/screen present is still the frontier + (§6), and the per-boot binding lottery (the GL client usually rides the X + channel in indirect mode, and X start keeps a first-generation lottery) is + the throughput limiter. ## 4. The channel and object picture @@ -189,30 +201,29 @@ requires it switched off, along with any external poke. ## 6. Where the frontier is (ranked walls) -1. **Direct-GL MME macro completion** `[wall]`. Delivery to the lane is no - longer the gap: the submission is fully decoded (nine NV906F entries tile - one contiguous buffer; no method-grammar draw header exists; the per-frame - work is data-block blobs plus real state pushes that invoke MME macros), - the recycled pushes are recovered by the content-gated FB-shadow and - LOW-band rescues, the client's 324-B draw-state push opens a `C597` - section, is captured and marked for the verbatim 3D lane, and reaches the - engine with the golden MME overlay (`GR LAUNCH submitted` + OK, - MME-PRELUDE pack 1701 IR words, MME-GOLDEN slot 0 accepted). The wall is - the multi-part program gate: the beef lane's 2799-word packed MME program - cannot complete inside a <=2048-word block together with its 156-400-word - draw window, so the load-only carrier gate drops each beef window - (`MME-LOAD-ONLY carrier ... window=156 ... dropped`) and `live_gen` never - promotes. A multi-part keep-window mechanism is committed default-off - (`b44694b5`) and enabled in the campaign parameters (`339da842`); the A/B - is pending. Two hypotheses were closed on the way: the QMD-carrier theory - (refuted: the entry format has no QMD bit, the blob is not a QMD, no QMD - magic in 256 MiB BAR1) and RT routing (the clear targets RT0 while the - window binds RT1; binding RT0 is verified 16x with correct target/geometry - but the store still misses, 61/61 `wrote=0`) — the store wall is macro/ - front-end execution, not reachability. Related reliability result: the +1. **Direct-GL MME draw-macro execution and stores** `[wall]`. Delivery to + the lane and the multi-part program gate are closed: the submission is + fully decoded (nine NV906F entries tile one contiguous buffer; no + method-grammar draw header exists; the per-frame work is data-block blobs + plus real state pushes that invoke MME macros), the recycled pushes are + recovered by the content-gated FB-shadow and LOW-band rescues, the + client's 324-B draw-state push opens a `C597` section, is captured and + marked for the verbatim 3D lane, and reaches the engine with the golden + MME overlay (`GR LAUNCH submitted` + OK). The 2799-word pack completes + (2799/2799), the first `MME-PACK-REARM` fires (engine-global completion + plus keep-done-across-recycle), the fixed-CB region is aliased, the + released calls run macros, and `DRAW_IAB` (`mac=0x22`) executes. The + prelude now emits 84 words and the DS stage VAs populate; the last named + gate is the **DS stage-0/1 image**: the synthesized binds read + `family+0x900` (zero in the live family page) while the client's VTG SPH + image is at `family+0x600`, so the `+0x600` bind is in flight. Stores + still miss (`wrote=0`, `px0=0`). Closed on the way: the QMD-carrier theory + (refuted: no QMD bit in the entry format, no QMD magic in 256 MiB BAR1) + and RT routing (the clear targets RT0 while the window binds RT1; RT0 bind + verified 16x with correct target/geometry, still 61/61 `wrote=0`). The `CODESRC` fault-park class is prevented by relocating a suspect program - page to the engine-mapped window-0 shadow (`17c7ed7c`; one validated boot: - 31 relocations, 51 GR launches, 79 GP_GET advances, 0 `FAULT_PDE`, 0 + page to the engine-mapped window-0 shadow (`17c7ed7c`; validated boot: 31 + relocations, 51 GR launches, 79 GP_GET advances, 0 `FAULT_PDE`, 0 `WEDGE-REARM`, `backend_ok=35`). 2. **Window/screen present** `[wall]`. The pbuffer and off-screen frame paths are proven (`pixel=ff0000ff`, 500/500 non-black frames, captured videos), @@ -236,14 +247,9 @@ requires it switched off, along with any external poke. recovered by an offline filesystem check. 4. **Non-black window frames and sustained rate** `[wall]`/`[target]`. Once - the command-stream delivery, the window/screen present and X screen-init - land, the capture must show motion in a window, then 60 fps in one VM with - no forcing, then two VMs on two mediated devices with non-black frames in - both. -4. **Non-black window frames and sustained rate** `[wall]`/`[target]`. Once - the command-stream delivery, the window/screen present and X screen-init - land, the capture must show motion in a window, then 60 fps in one VM with - no forcing, then two VMs on two mediated devices with non-black frames in + the draw stores, the window/screen present and X screen-init land, the + capture must show motion in a window, 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 @@ -279,7 +285,11 @@ requires it switched off, along with any external poke. | Verbatim 3D method-stream replay retired by the engine (no MMU fault) | `[live]` | | Synthesized launch executes real `sm_75` SASS; Turing `V3` program header accepted | `[live]` | | Emulated FB/GART sizing traps fixed (FB info replies in KB; GART default 256 MiB), removing the 4 GiB guest-allocation class | `[live]` | -| Direct-GL MME macro completion (multi-part keep-window: the 2799-word packed program + 156-400-word draw window cannot fit the <=2048-word block; `live_gen` never promotes) | `[wall]` — mechanism committed `b44694b5` (default off) and enabled in params (`339da842`); A/B pending | +| Multi-part MME keep-window: multi-frame windows admitted; the 2799-word pack completes (2799/2799) | `[live]` | +| Part-launch poison eliminated: client `SET_REPORT_SEMAPHORE`/`SET_NOTIFY` targets redirected to a mapped scratch slot (49 cycles, 0 poison, 0 MMU faults) | `[live]` | +| First `MME-PACK-REARM` captured (engine-global completion plus keep-done-across-recycle); fixed-CB region aliased; released calls run macros | `[live]` | +| `DRAW_IAB` (`mac=0x22`) executes; SPH-BIND prelude emits 84 words; DS stage VAs populate | `[live]` (single validated boot) | +| DS stage-0/1 image (synthesized binds read `family+0x900` = zero; the client's VTG SPH image is at `family+0x600`) | `[wall]` — `+0x600` bind in flight | | Window/screen present produces non-black window pixels | `[wall]` | | X screen-init first-generation lottery (`modeNum` parity; only an immediately-post-boot X passes DDX DMA init; dominant throughput limiter) | `[wip]` | | Non-black screen pixels from the emulated vGPU's 3D pipeline | `[wall]` | @@ -295,9 +305,9 @@ requires it switched off, along with any external poke. * Display/KMS bring-up (NvKms, `/dev/dri`, X, a real GL context) is not a rendered-frame claim. GZDoom reaching `V_Init: allocate screen` proves the client's GL init and the direct-GL GR lane, not the game loop or a - presented frame; the client's draw-state push reaches the engine, but the - MME macro program does not complete, so its draws do not store and the - window stays black. + presented frame; the client's draw-state push reaches the engine, the MME + program completes and the draw macro executes, but the DS stage image is + not yet right, so its draws do not store and the window stays black. * The engine-zero-write (NOWRITE) campaign is not a rendering result: it and the draw census together proved the submission is macro-driven (no method-grammar draw header exists), that RT routing is not the cause, and diff --git a/wiki/Host-Module.md b/wiki/Host-Module.md index 6eebeaf..4557dbe 100644 --- a/wiki/Host-Module.md +++ b/wiki/Host-Module.md @@ -6,7 +6,8 @@ > source: [`../docs/03-architecture/06-host-module-and-hybrid-model.md`](../docs/03-architecture/06-host-module-and-hybrid-model.md); > the docs tree wins on disagreement with this page. > -> Status: 2026-11-14, tree `master @ 339da842`. Tags: `[live]` observed with +> Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes +> in the working tree. Tags: `[live]` observed with > the stock guest driver; `[wip]` demonstrated live, being productized; > `[gated]` implemented default-off behind supervised gates; `[wall]` known > blocking limit; `[target]` designed, not built; `[planned]` roadmap. @@ -137,9 +138,13 @@ client-allocated USERD resolution, foreign-USERD skip). The direct-GL submission is fully decoded (macro-driven; no classic draw header), the recycled pushes are recovered by the content-gated FB-shadow and LOW-band rescues, and the client's draw-state push opens, captures and reaches the -engine with the golden MME overlay. The remaining GL gap is MME macro -completion (the packed program cannot fit its block with the draw window; -multi-part keep-window A/B pending) and the window/screen present path, which +engine with the golden MME overlay. The MME chain now completes and executes +the draw macro: multi-frame keep-windows land, the 2799-word pack completes, +the first `MME-PACK-REARM` fires, the fixed-CB region is aliased, and +`DRAW_IAB` (`mac=0x22`) runs with the SPH-BIND prelude intact and the DS stage +VAs populated. The remaining GL gap is the DS stage-0/1 image (the synthesized +binds read `family+0x900`, zero in the live family page, while the client's +VTG SPH image is at `family+0x600`) and the window/screen present path, which currently stays black or wedges X. ## 6. Debug parameters diff --git a/wiki/OpenGL.md b/wiki/OpenGL.md index b647eef..3d04e8e 100644 --- a/wiki/OpenGL.md +++ b/wiki/OpenGL.md @@ -12,7 +12,8 @@ > [`../docs/03-architecture/02-guest-stack-and-cudasw.md`](../docs/03-architecture/02-guest-stack-and-cudasw.md) > (the guest stack). The docs tree wins on disagreement. -Status: 2026-11-14, tree `master @ 339da842`. Tags: `[live]` observed with the +Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in +the working tree. Tags: `[live]` observed with the stock guest driver; `[wip]` partial; `[wall]` current blocker; `[target]` defined success state. @@ -99,7 +100,11 @@ Rated honestly, against the milestone ladder in the plan: | Engine executes a launch built from the captured section (real `sm_75` SASS retired) | `[live]` | | Verbatim 3D method-stream replay retired by the engine, no MMU fault | `[live]` | | Emulated FB/GART sizing traps fixed (FB info replies in KB; GART default 256 MiB), removing the 4 GiB guest-allocation class | `[live]` | -| Direct-GL MME macro completion (multi-part keep-window: 2799-word packed program + 156-400-word draw window cannot fit the <=2048-word block; `live_gen` never promotes) | `[wall]` — mechanism committed `b44694b5` (default off) and enabled in params (`339da842`); A/B pending | +| Multi-part MME keep-window: multi-frame windows admitted; the 2799-word pack completes (2799/2799) | `[live]` | +| Part-launch poison eliminated: client `SET_REPORT_SEMAPHORE`/`SET_NOTIFY` targets redirected to a mapped scratch slot (49 cycles, 0 poison, 0 MMU faults) | `[live]` | +| First `MME-PACK-REARM` captured (engine-global completion plus keep-done-across-recycle); fixed-CB region aliased; released calls run macros | `[live]` | +| `DRAW_IAB` (`mac=0x22`) executes; SPH-BIND prelude emits 84 words; DS stage VAs populate | `[live]` (single validated boot) | +| DS stage-0/1 image (synthesized binds read `family+0x900` = zero; the client's VTG SPH image is at `family+0x600`) | `[wall]` — `+0x600` bind in flight | | Window/screen present produces non-black screen pixels | `[wall]` | | X screen-init first-generation lottery (`modeNum` parity; only an immediately-post-boot X passes DDX DMA init; dominant throughput limiter) | `[wip]` | | 60 fps sustained, no forcing (M-GL4) | `[target]` | @@ -130,14 +135,17 @@ videos (45.4 s and 50 s). Captured GL sections now execute on the engine, and the direct-GL client's submission is fully decoded: it carries no classic draw header — the work is macro-driven (data-block blobs plus small state pushes invoking MME macros), the recycled pushes are recovered, and the -client's draw-state push opens, captures and reaches the engine. The -remaining gates are **MME macro completion** (the 2799-word packed program -cannot complete inside its <=2048-word block with the 156-400-word draw -window, so `live_gen` never promotes; the multi-part keep-window mechanism is -committed default-off and enabled for the pending A/B), the window/screen -present path (glxgears' window is black and a window draw can wedge X), and -the X first-generation screen-init lottery — then the first rendered screen -frame. +client's draw-state push opens, captures and reaches the engine. The MME chain +now completes and executes the draw macro: multi-frame keep-windows land, the +2799-word pack completes (2799/2799), the first `MME-PACK-REARM` fires, the +fixed-CB region is aliased, and `DRAW_IAB` (`mac=0x22`) runs with the SPH-BIND +prelude intact (84 words) and the DS stage VAs populated. The remaining gates +are the **DS stage-0/1 image** (the synthesized binds read `family+0x900`, +which is zero in the live family page, while the client's VTG SPH image is at +`family+0x600`; the `+0x600` bind is in flight) so the draw stores, the +window/screen present path (glxgears' window is black and a window draw can +wedge X), and the per-boot binding/X first-generation start lottery — then the +first rendered screen frame. ## 6. What is not claimed @@ -145,10 +153,11 @@ frame. vGPU yet; every screen capture so far is black. The non-black frames and the videos (45.4 s and 50 s) come from the off-screen pbuffer path (pbuffer -> sysmem -> kvmfr ivshmem -> host reader), not from a windowed X screen - capture. The client's draw-state push now reaches the engine, but the MME - macro program does not complete so the draw never stores, a synchronous - window draw wedges X, and X start retains a per-boot first-generation - lottery. Those are the current walls. + capture. The client's draw-state push reaches the engine, the MME program + completes and the draw macro executes, but the DS stage image is not yet + right so the draw never stores, a synchronous window draw wedges X, and X + start retains a per-boot first-generation lottery. Those are the current + walls. * GZDoom reaching `V_Init: allocate screen` is not a rendered-frame claim; it proves the client's GL init and the direct-GL GR lane, not the game loop or a presented frame. diff --git a/wiki/Physical-GPU-Backend.md b/wiki/Physical-GPU-Backend.md index 9b4a88f..ad033be 100644 --- a/wiki/Physical-GPU-Backend.md +++ b/wiki/Physical-GPU-Backend.md @@ -5,7 +5,8 @@ > guest-facing emulation. Canonical sources: [`../docs/03-architecture/08-physical-gpu-integration.md`](../docs/03-architecture/08-physical-gpu-integration.md) > and [`../docs/03-architecture/11-physical-backend-guest-wiring.md`](../docs/03-architecture/11-physical-backend-guest-wiring.md); the docs tree wins on disagreement. -Status: 2026-11-14, tree `master @ 339da842`. Tags: `[live]` proven with the +Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in +the working tree. Tags: `[live]` proven with the stock guest driver; `[gated]` implemented default-off; `[wip]` partially built; `[wall]` current blocker; `[target]` planned end state. @@ -109,7 +110,7 @@ FAIL a failed mutating operation parks the device in a locked fail-safe; | Host RM client and first real engine work (static config, real objects, 4 KiB CE copy) | done `[live]` | | Guest-copy forwarding, deferred release, hardware-primary copies, engine-authored relay, fault relay | verified live (seams parameterised and fail-open); the staged-transfer class is under repair `[live]` | | CUDA kernel execution (`vectorAdd` and further clients) | done `[live]` — stock guest CUDA clients (vector-add, matrix-multiply, transformer) execute on the physical engine with verified results and engine-authored completions relayed to the guest | -| Graphics method-stream execution (verbatim 3D replay, synthesized launches, direct-GL client channels) | `[wip]` — the engine retires real graphics streams, the display/KMS stack registers and X + stock GLX are green (the DDX/ScreenInit stability walls are closed, X green >10 minutes), captured GL sections execute, the direct-GL submission is fully decoded (macro-driven, no classic draw header), the client's draw-state push reaches the engine, and the first non-black GPU-rendered frames are captured off-screen; MME macro completion (multi-part keep-window A/B pending) and the window/screen present are the frontier ([`Graphics-Execution.md`](Graphics-Execution.md)) | +| Graphics method-stream execution (verbatim 3D replay, synthesized launches, direct-GL client channels) | `[wip]` — the engine retires real graphics streams, the display/KMS stack registers and X + stock GLX are green (the DDX/ScreenInit stability walls are closed, X green >10 minutes), captured GL sections execute, the direct-GL submission is fully decoded (macro-driven, no classic draw header), the client's draw-state push reaches the engine, the MME pack completes and the `DRAW_IAB` macro executes, and the first non-black GPU-rendered frames are captured off-screen; the DS stage image (so the draw stores) and the window/screen present are the frontier ([`Graphics-Execution.md`](Graphics-Execution.md)) | ## 7. The execution frontier @@ -129,10 +130,11 @@ the stock GLX path are fully green (`glxinfo -B` rc 0, ~520 FPS `glxgears`), the DDX 3D replay executes, captured GL sections execute on the engine, and the first non-black GPU-rendered frames are proven (500/500 off-screen frames per run plus captured videos); the direct-GL submission is fully decoded -(macro-driven) and its draw-state push reaches the engine, so the remaining -graphics gates are MME macro completion (multi-part keep-window A/B pending), -the window/screen present, and the X first-generation start lottery before -non-black window pixels. The remaining +(macro-driven) and its draw-state push reaches the engine, the MME pack +completes and the `DRAW_IAB` macro executes, so the remaining graphics gates +are the DS stage image (so the draw stores), the window/screen present, and +the per-boot binding/X first-generation start lottery before non-black window +pixels. The remaining compute work is the staged-transfer class (under repair), the every-boot acceptance campaign, and per-guest execution isolation — see [`Execution-Frontier.md`](Execution-Frontier.md) and diff --git a/wiki/Project-Goals.md b/wiki/Project-Goals.md index 39eb1be..6d9e15a 100644 --- a/wiki/Project-Goals.md +++ b/wiki/Project-Goals.md @@ -10,7 +10,8 @@ > [`Execution-Frontier.md`](Execution-Frontier.md) and > [`Graphics-Execution.md`](Graphics-Execution.md). -Status: 2026-11-14, tree `master @ 339da842`. Tags: `[live]` working with the +Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in +the working tree. Tags: `[live]` working with the stock guest driver; `[wip]` in progress; `[planned]` designed, not built; `[target]` bring-up ahead; `[non-goal]` explicitly out of scope. @@ -51,7 +52,7 @@ drivers, no license.** | Stock guest driver initialisation | The unmodified driver probes, initialises and enumerates as on bare metal (`nvidia-smi`) | `[live]` — TU104 reference platform | | Full CUDA driver-API surface | Context creation, allocation, copies, free, destroy complete with correct results | `[live]` — the driver-API smoke prints `ALL OK`; the 64-byte payload round-trips | | CUDA kernel execution on real hardware | Verified guest kernels execute on the physical GPU, with engine-authored completions waking the guest | `[live]` — vector-add, matrix-multiply and transformer clients green on fresh boots; the staged-transfer class, the every-boot acceptance campaign and per-guest isolation are in progress ([`Execution-Frontier.md`](Execution-Frontier.md)) | -| OpenGL (3D graphics) | Stock guest GL applications render real pixels through the emulated vGPU | `[wip]` — the display/KMS stack and X run, the stock NVIDIA GLX path is fully green (`glxinfo -B` rc 0, OpenGL 4.6.0 direct, `glxgears` ~520 FPS), the 2D path is green, the DDX 3D replay executes, the X DDX/ScreenInit stability walls are closed (X green >10 minutes), captured GL sections execute on the engine, the direct-GL submission is fully decoded (macro-driven, no classic draw header), the client's draw-state push reaches the engine, and the first non-black GPU-rendered frames plus captured videos (45.4 s and 50 s) are proven off-screen; GZDoom reaches `V_Init`. Window/screen pixels remain the frontier: the MME macro program does not complete (multi-part keep-window A/B pending), RT routing was refuted as the cause, the store still misses (`wrote=0`), the window/screen present is unproven, and X start keeps a first-generation lottery ([`OpenGL.md`](OpenGL.md)) | +| OpenGL (3D graphics) | Stock guest GL applications render real pixels through the emulated vGPU | `[wip]` — the display/KMS stack and X run, the stock NVIDIA GLX path is fully green (`glxinfo -B` rc 0, OpenGL 4.6.0 direct, `glxgears` ~520 FPS), the 2D path is green, the DDX 3D replay executes, the X DDX/ScreenInit stability walls are closed (X green >10 minutes), captured GL sections execute on the engine, the direct-GL submission is fully decoded (macro-driven, no classic draw header), the client's draw-state push reaches the engine, the MME pack completes and the `DRAW_IAB` macro executes, and the first non-black GPU-rendered frames plus captured videos (45.4 s and 50 s) are proven off-screen; GZDoom reaches `V_Init`. Window/screen pixels remain the frontier: the DS stage image is the last named gate before stores, the window/screen present is unproven, and the per-boot binding/X first-generation lottery is the throughput limiter ([`OpenGL.md`](OpenGL.md)) | | Vulkan | Stock guest Vulkan applications render real pixels | `[wip]` — the pipeline runs end to end (device → command buffer → fence → readback); frames are black — program delivery and program-VA mapping are the frontier ([`Vulkan.md`](Vulkan.md)) | | Windows guests (DirectX, CUDA) | A stock WDDM driver and stock D3D/CUDA applications run in Windows guests | `[target]` — not started; same emulation target ([`DirectX.md`](DirectX.md)) | | Video (NVENC/NVDEC) | Encode/decode through the emulated device | `[planned]` | diff --git a/wiki/Project-Plan.md b/wiki/Project-Plan.md index 3d10d8d..2be9780 100644 --- a/wiki/Project-Plan.md +++ b/wiki/Project-Plan.md @@ -15,7 +15,8 @@ > [`../docs/06-portability/03-device-validation-and-porting-sequence.md`](../docs/06-portability/03-device-validation-and-porting-sequence.md); > the docs tree wins on disagreement. -Status: 2026-11-14, tree `master @ 339da842`. Tags: `[done]`, `[active]`, +Status: 2026-11-15, tree `master @ 444ae2c1` plus in-flight graphics changes in +the working tree. Tags: `[done]`, `[active]`, `[ahead]` — the plan's own state vocabulary, distinct from the goal tags. ## 1. How the plan works @@ -44,7 +45,7 @@ itself: |---|---|---|---| | **P0 — Platform** | Emulated vGPU device, GSP boot and GSP-RM emulation, stock guest driver initialisation | Driver-API smoke green (`ALL OK`) = evaluation rung 2 | `[done]` | | **P1 — First execution (compute)** | Guest CUDA kernels executing on the physical GPU, with engine-authored completions; then hardening | Verified clients + engine-authored completion = rung 3 core; hardening: staged-transfer class, every-boot acceptance, per-guest isolation | `[active]` — execution green; hardening in progress | -| **P2 — Graphics execution** | OpenGL/Vulkan draw commands executed by the physical 3D pipeline and delivered as readable pixels | The graphics ladder: M-GL1 client context-init executes; M-GL2 `glxgears` non-black; M-GL3 GZDoom GL non-black through the mdev | `[active]` — between M-GL1 and M-GL2 with M-GL2's off-screen half proven: the display/KMS and DDX replay machinery work, X + stock GLX are green, the first non-black GPU-rendered frames and videos are captured, the X DDX/ScreenInit stability walls are closed, captured GL sections execute on the engine, the direct-GL submission is fully decoded (macro-driven, no classic draw header), and the client's draw-state push now reaches the engine; the remaining walls are MME macro completion (multi-part keep-window A/B pending), the window/screen present, and the X first-generation start lottery | +| **P2 — Graphics execution** | OpenGL/Vulkan draw commands executed by the physical 3D pipeline and delivered as readable pixels | The graphics ladder: M-GL1 client context-init executes; M-GL2 `glxgears` non-black; M-GL3 GZDoom GL non-black through the mdev | `[active]` — between M-GL1 and M-GL2 with M-GL2's off-screen half proven: the display/KMS and DDX replay machinery work, X + stock GLX are green, the first non-black GPU-rendered frames and videos are captured, the X DDX/ScreenInit stability walls are closed, captured GL sections execute on the engine, the direct-GL submission is fully decoded (macro-driven, no classic draw header), the client's draw-state push reaches the engine, the MME pack completes and the `DRAW_IAB` macro executes; the remaining walls are the DS stage image (so the draw stores), the window/screen present, and the per-boot binding/X first-generation start lottery | | **P3 — Sustained and multi-tenant** | Frame rates without assistance; multiple VMs sharing the GPU with measured fairness; soak-stable operation | Graphics M-GL4 (60 fps, no forcing) and M-GL5 (two VMs, two mdevs); CUDA battery + soak; per-guest execution isolation = rungs 4/5 | `[ahead]` | | **P4 — Breadth** | Video (NVENC/NVDEC), Windows/DirectX guests, live migration, non-KVM hypervisor transports | Per-case bring-up gates plus the matrix's evidence expectations | `[ahead]` | | **P5 — Scale and portability** | New GPU generations and driver families carried forward; published performance programme | A profile + measured delta per version, validated on hardware; A/B numbers published per the measurement contract | `[ahead]` | -- cgit v1.2.3