summaryrefslogtreecommitdiffstats
path: root/wiki/Graphics-Execution.md
diff options
context:
space:
mode:
Diffstat (limited to 'wiki/Graphics-Execution.md')
-rw-r--r--wiki/Graphics-Execution.md70
1 files changed, 45 insertions, 25 deletions
diff --git a/wiki/Graphics-Execution.md b/wiki/Graphics-Execution.md
index 48423f8..59196d5 100644
--- a/wiki/Graphics-Execution.md
+++ b/wiki/Graphics-Execution.md
@@ -12,7 +12,7 @@
> [`../docs/04-implementation/04-real-render-walls.md`](../docs/04-implementation/04-real-render-walls.md)
> (the measured walls); the docs tree wins on disagreement.
-Status: 2026-10-30, tree `master @ b4930168`. Tags: `[live]` observed end to
+Status: 2026-11-09, tree `master @ 4acc81e8`. Tags: `[live]` observed end to
end; `[wip]` partially built; `[wall]` current blocker; `[target]` defined
success state; `[planned]` designed, not built.
@@ -82,11 +82,14 @@ fidelity:
faults across repeated launches. This proved engine-side dispatch before
the verbatim lane existed. The program itself is still a development
stand-in at this rung — execution proof, not pixels.
-3. **Forwarding the client's own pushes** `[wall]`. The goal state: the GL
- client's own GPFIFO ring and method streams are read, decoded and executed
- with the client's real per-draw state. The GL client's channel is created
- today, but it never submits — its pushes have not been made readable — and
- this lane is gated on the ring/push-readability work (§6).
+3. **Forwarding the client's own pushes** `[wip]`. The GL client's own
+ channels now register, submit and retire: the direct-GL GR channel
+ (`0xbeef0100`) and its CE siblings (`0xbeef0101`/`0xbeef0102`) are
+ discovered, their rings and releases are decoded, and the X server's DDX
+ kick channel (`0xbfef0002`) is decoded from its ring head with its
+ class-2D notification authored. What remains is completing the GLX
+ context-creation handshake and the client's kick-slot wait (§6), not
+ making the pushes readable.
## 4. The channel and object picture
@@ -95,9 +98,17 @@ fidelity:
module traps. Channels are typed by engine: a graphics channel carries 3D
state and draws; copy-class channels carry memory movements.
* **The graphics object class** the guest's 3D stream binds is the Turing
- graphics class, `0xC597`. The stream the emulation can capture today comes
- from the **X server's channel** (`OpenGL`); the 2D present/readback work
+ graphics class, `0xC597`. Streams now come from both the **X server's
+ channel** and the **direct GL client's own channels** (`0xbeef0100` GR plus
+ the `0xbeef0101`/`0xbeef0102` CE siblings); the 2D present/readback work
rides lighter 2D-class and copy-engine shapes.
+* **Display and modeset** `[live]`. The guest's modeset path is served by an
+ emulated display engine: the display push-buffer channels (core `0xc57d`,
+ window `0xc57e`, immediate/window `0xc57b`) are registered, their push
+ buffers parsed, and the notifier/`UPDATE` completion authored. This is what
+ lets nvidia-modeset/NvKms register (`/dev/dri`), X settle and GLX clients
+ obtain a real GL context. The display-capability seam is parameterised in
+ the campaign configuration.
* **Cells of state**: 3D streams are long—hundreds of method words per draw —
and mix state binds (viewport, render target, ZS, blend/ROP), program and
constant binds, vertex/index streams and draw-issuing methods. The capture
@@ -117,6 +128,10 @@ release group wakes the client. The emulation relays engine completions into
guest-observable memory (MSI-X plus a poller), and the guest resumes from
there.
+For the display path, completion is the notifier write and `UPDATE ->
+FINISHED`; a completion event deferred by the reply path is force-retried
+until it posts, so the X server's mode set finishes.
+
During bring-up the module also carries a **diagnostics-only mirror** for apps
that spin on a shared progress word; it exists so a run can proceed while the
natural completion path is being finished. The 60-fps milestone explicitly
@@ -124,20 +139,18 @@ requires it switched off, along with any external poke.
## 6. Where the frontier is (ranked walls)
-1. **The GL client's submissions** `[wall]`. The client's channel exists but
- never submits: direct measurement shows the client process writes no put
- pointer in any mapping the service can see, and its pushes are not yet
- reachable. Everything downstream waits on this.
-2. **Program (SASS) delivery** `[wall]`. Graphics programs reach the device
- through the driver's copy/utility-channel uploads; those inline-data
- writes are not yet materialised for the GL/Vulkan clients, and the program
- page the engine fetches is empty. With the data-set gate bypassed, the
- engine fetches the launch and MMU-faults (`FAULT_PDE`) at the program VA —
- proof the channel and context are alive, and that mapping + content are
- the missing pair.
-3. **Non-black frames** `[wall]`. Once draws execute with real state and real
- programs, the capture must show motion; every frame captured so far is
- black.
+1. **The X GLX context-creation completion** `[wall]`. With the UVM
+ channel-pool and direct-GL submission walls closed, the X server spins in
+ its RM ioctl path (`_nv018351rm`) while a GL client's GLX context request
+ waits on the X reply. The X DDX's own channels and the GLX reply are the
+ current named objects. (Fullscreen GZDoom's client-triggered mode set can
+ still wedge X; the campaign path is a settled X plus windowed GZDoom.)
+2. **The client kick-slot word** `[wall]`. The GL client polls a kick-slot GPU
+ address for its completion; the RM notifier page is a different object, so
+ the completion must be authored at the client's kick-slot address.
+3. **Non-black frames** `[wall]`. Once the GLX context completes and the
+ client's kick wait resolves, the capture must show motion; every frame
+ captured so far is black.
4. **Sustained frame rate, and two VMs** `[target]`. The defined end state:
60 fps in one VM with no forcing, then two VMs on two mediated devices
with non-black frames in both.
@@ -147,19 +160,26 @@ requires it switched off, along with any external poke.
| Capability | State |
|---|---|
| X server initialises on the emulated vGPU (driver DMA sanity push, ScreenInit) | `[live]` |
-| `glxinfo` enumerates the emulated GPU with the NVIDIA renderer | `[live]` |
-| GZDoom launches and runs on the emulated vGPU | `[live]` (pixels frontier) |
+| Display engine serves the modeset push buffers; notifier plus `UPDATE -> FINISHED` | `[live]` (campaign configuration) |
+| nvidia-modeset/NvKms registers (`/dev/dri/card0`, `renderD128`, `fb0`); `nvidia-smi -L` enumerates | `[live]` |
+| `glxinfo` reports the emulated GPU with the NVIDIA renderer (OpenGL 4.6.0, direct rendering) | `[live]` |
+| GZDoom obtains a real GL context; windowed reaches renderer startup | `[live]` (pixels frontier) |
| GL section capture: the X server's `0xC597` stream decoded | `[live]` |
| 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]` |
| 2D screen fills and copy-engine present ops execute | `[live]` |
-| Direct GL client: device-init gate handled, channels allocate, readback path returns clean | `[wip]` (client submissions not yet) |
+| Direct GL client: device-init gate handled, channels allocate, readback path returns clean | `[live]` |
+| Direct GL client channels submit and retire (GR `0xbeef0100`, CE `0xbeef0101`/`0xbeef0102`); DDX kick channel decoded | `[live]` |
+| X GLX context-creation completion and the client kick-slot word | `[wall]` |
| Non-black pixels from the emulated vGPU's 3D pipeline | `[wall]` |
| Windows/DirectX guests | `[planned]` |
## 8. What is not claimed
* No non-black pixel has been produced by the emulated vGPU's 3D pipeline yet.
+* Display/KMS bring-up (NvKms, `/dev/dri`, X, a real GL context) is not a
+ rendered-frame claim; the GLX context-creation and kick-slot completions are
+ the current walls.
* No frame-rate or latency numbers: the scheduled measurement is defined
(60 fps over 60 s, no forcing) but not yet met.
* The `virgl`-based demo videos are a different, labelled path — not this one.