summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-11-15 11:18:58 -0500
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-11-15 11:18:58 -0500
commit45b03a89e6d836cb8a7a5d83e9d78c7a50de2994 (patch)
tree41cb5740cc2c7c653a6231822de45dea7f5584b6
parentb9e7e84249a28a5e296a0f97e00a3bdf2e5ce6df (diff)
downloadopen-iov-45b03a89e6d836cb8a7a5d83e9d78c7a50de2994.tar.gz
open-iov-45b03a89e6d836cb8a7a5d83e9d78c7a50de2994.zip
wiki: refresh the graphics frontier to the DS stage-image gate (eng51 landed; draw macro executes, store pending)
-rw-r--r--wiki/Execution-Frontier.md53
-rw-r--r--wiki/Execution-Plane.md21
-rw-r--r--wiki/FAQ.md20
-rw-r--r--wiki/Graphics-Execution.md104
-rw-r--r--wiki/Host-Module.md13
-rw-r--r--wiki/OpenGL.md37
-rw-r--r--wiki/Physical-GPU-Backend.md14
-rw-r--r--wiki/Project-Goals.md5
-rw-r--r--wiki/Project-Plan.md5
9 files changed, 159 insertions, 113 deletions
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]` |