implements PLN-0120
This commit is contained in:
parent
67a629dbe4
commit
850ca8691b
File diff suppressed because one or more lines are too long
@ -2,7 +2,7 @@
|
|||||||
id: PLN-0120
|
id: PLN-0120
|
||||||
ticket: real-render-worker-establishment
|
ticket: real-render-worker-establishment
|
||||||
title: Update Real Render Worker Specs
|
title: Update Real Render Worker Specs
|
||||||
status: open
|
status: done
|
||||||
created: 2026-06-15
|
created: 2026-06-15
|
||||||
completed:
|
completed:
|
||||||
ref_decisions: [DEC-0033]
|
ref_decisions: [DEC-0033]
|
||||||
|
|||||||
@ -73,6 +73,24 @@ Color values in the runtime, HAL, host-facing framebuffer, and GFX ABI are
|
|||||||
logical RGBA8888 values. RGB565 is not a supported runtime framebuffer,
|
logical RGBA8888 values. RGB565 is not a supported runtime framebuffer,
|
||||||
palette, host presentation, or compatibility contract.
|
palette, host presentation, or compatibility contract.
|
||||||
|
|
||||||
|
### Published owned frame
|
||||||
|
|
||||||
|
The canonical worker-published frame value is `OwnedRgba8888Frame`.
|
||||||
|
|
||||||
|
`OwnedRgba8888Frame` contains:
|
||||||
|
|
||||||
|
- the logical `FrameId`;
|
||||||
|
- render ownership metadata;
|
||||||
|
- width and height in pixels;
|
||||||
|
- stride in pixels;
|
||||||
|
- an owned `Vec<u32>` containing packed RGBA8888 pixels in canonical RGBA
|
||||||
|
channel order.
|
||||||
|
|
||||||
|
The pixel vector is owned by the published frame. Consumers may copy it into a
|
||||||
|
host upload buffer, retain it as the latest published frame, or repeat it for a
|
||||||
|
host redraw. Consumers MUST NOT interpret the frame as a native texture,
|
||||||
|
swapchain image, window handle, or host GPU resource.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 3. Double Buffering
|
## 3. Double Buffering
|
||||||
@ -134,6 +152,11 @@ to the logical/runtime side before handoff, or to an owning service. They MUST
|
|||||||
NOT require the render consumer to hold mutable VM, `Hardware`, `Gfx`, or
|
NOT require the render consumer to hold mutable VM, `Hardware`, `Gfx`, or
|
||||||
`FrameComposer` references.
|
`FrameComposer` references.
|
||||||
|
|
||||||
|
Read-only resource APIs expose compact lookup by ID. They do not expose mutable
|
||||||
|
bank state, `Arc` ownership as part of the contract, copies of whole banks, or
|
||||||
|
snapshot payloads. The implementation may choose its internal sharing mechanism,
|
||||||
|
but the render boundary contract is ID-based read-only access.
|
||||||
|
|
||||||
Local host implementations may keep a concrete hardware object internally as a
|
Local host implementations may keep a concrete hardware object internally as a
|
||||||
platform implementation detail. That object is not part of the runtime-facing
|
platform implementation detail. That object is not part of the runtime-facing
|
||||||
render boundary; the boundary is the typed platform service set.
|
render boundary; the boundary is the typed platform service set.
|
||||||
@ -155,6 +178,12 @@ latest-wins semantics:
|
|||||||
|
|
||||||
The consumer status is telemetry. It is not a semantic ACK to the VM.
|
The consumer status is telemetry. It is not a semantic ACK to the VM.
|
||||||
|
|
||||||
|
The real render worker consumes owned `RenderSubmission` values from this
|
||||||
|
single-slot handoff and publishes owned `OwnedRgba8888Frame` values. The
|
||||||
|
producer path MUST remain non-blocking with respect to worker rasterization and
|
||||||
|
host present. A slow worker can cause replacement/drop telemetry, but it MUST
|
||||||
|
NOT create an unbounded queue or stall VM logical frame production.
|
||||||
|
|
||||||
### 4.4 Frame pacing
|
### 4.4 Frame pacing
|
||||||
|
|
||||||
Game logical frames are paced by the runtime frame scheduler, not by render
|
Game logical frames are paced by the runtime frame scheduler, not by render
|
||||||
@ -170,6 +199,10 @@ sequential. The render consumer may repeat the last valid frame, and telemetry
|
|||||||
records the overrun/repeat. The VM MUST NOT produce catch-up frames to skip
|
records the overrun/repeat. The VM MUST NOT produce catch-up frames to skip
|
||||||
from frame `N` to frame `N+k`.
|
from frame `N` to frame `N+k`.
|
||||||
|
|
||||||
|
Repeating a frame means reusing the latest published `OwnedRgba8888Frame`
|
||||||
|
without recomposing, rerunning VM code, or consuming a new submission. Repeat
|
||||||
|
behavior is presentation cadence behavior, not guest-visible execution.
|
||||||
|
|
||||||
### 4.5 AppMode policy
|
### 4.5 AppMode policy
|
||||||
|
|
||||||
Render execution policy is explicit by pipeline/AppMode:
|
Render execution policy is explicit by pipeline/AppMode:
|
||||||
@ -231,6 +264,17 @@ Minimum render telemetry includes:
|
|||||||
- last produced, consumed, presented, dropped, and error frame IDs;
|
- last produced, consumed, presented, dropped, and error frame IDs;
|
||||||
- active render epoch.
|
- active render epoch.
|
||||||
|
|
||||||
|
### 4.8 Shutdown and typed failures
|
||||||
|
|
||||||
|
Render worker shutdown is bounded and observable. A shutdown request MUST
|
||||||
|
wake a waiting worker, discard pending submissions that will not be consumed,
|
||||||
|
and either join within the configured timeout or report a typed shutdown
|
||||||
|
failure.
|
||||||
|
|
||||||
|
Worker backend failures, sink publication failures, stale ownership discards,
|
||||||
|
panic capture, and shutdown timeout are typed render worker outcomes. They are
|
||||||
|
recorded through telemetry and diagnostics; they do not become VM-visible ACKs.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. PROMETEU Graphical Structure
|
## 5. PROMETEU Graphical Structure
|
||||||
|
|||||||
@ -100,7 +100,34 @@ Important properties:
|
|||||||
- no execution occurs outside the frame loop;
|
- no execution occurs outside the frame loop;
|
||||||
- frame structure remains observable for host tooling and host-owned certification.
|
- frame structure remains observable for host tooling and host-owned certification.
|
||||||
|
|
||||||
## 7 Determinism and Best Practices
|
## 7 Render Worker Concurrency
|
||||||
|
|
||||||
|
The render worker is not a machine-visible event source and does not introduce
|
||||||
|
guest callbacks. It is an implementation-side consumer of closed render
|
||||||
|
submissions.
|
||||||
|
|
||||||
|
The render worker handoff uses single-slot latest-wins semantics:
|
||||||
|
|
||||||
|
- a producer publishes at most one pending owned `RenderSubmission`;
|
||||||
|
- a newer submission replaces an older unconsumed pending submission;
|
||||||
|
- replacement is counted as telemetry;
|
||||||
|
- the producer does not wait for worker rasterization or host present;
|
||||||
|
- the worker takes ownership of the submission it consumes.
|
||||||
|
|
||||||
|
The worker publishes `OwnedRgba8888Frame` values. Each published frame owns its
|
||||||
|
RGBA8888 pixel vector and carries frame and ownership metadata. Repeating a
|
||||||
|
frame reuses the latest published owned frame and does not execute guest code
|
||||||
|
or recompose the frame.
|
||||||
|
|
||||||
|
Render resources reachable from a submission are resolved through read-only
|
||||||
|
ID-based access. The worker MUST NOT hold mutable VM state, mutable `Hardware`,
|
||||||
|
mutable `Gfx`, or a live mutable `FrameComposer` as its cross-thread contract.
|
||||||
|
|
||||||
|
Shutdown is explicit and bounded. A shutdown request wakes a waiting worker,
|
||||||
|
causes pending work that will not be consumed to be discarded, and reports a
|
||||||
|
typed failure if the worker cannot join within the configured timeout.
|
||||||
|
|
||||||
|
## 8 Determinism and Best Practices
|
||||||
|
|
||||||
PROMETEU encourages:
|
PROMETEU encourages:
|
||||||
|
|
||||||
@ -115,7 +142,7 @@ PROMETEU discourages:
|
|||||||
- hidden timing channels;
|
- hidden timing channels;
|
||||||
- ambiguous out-of-band execution.
|
- ambiguous out-of-band execution.
|
||||||
|
|
||||||
## 8 Relationship to Other Specs
|
## 9 Relationship to Other Specs
|
||||||
|
|
||||||
- [`09a-coroutines-and-cooperative-scheduling.md`](09a-coroutines-and-cooperative-scheduling.md) defines coroutine lifecycle and scheduling behavior.
|
- [`09a-coroutines-and-cooperative-scheduling.md`](09a-coroutines-and-cooperative-scheduling.md) defines coroutine lifecycle and scheduling behavior.
|
||||||
- [`10-debug-inspection-and-profiling.md`](10-debug-inspection-and-profiling.md) defines observability and diagnostics surfaces.
|
- [`10-debug-inspection-and-profiling.md`](10-debug-inspection-and-profiling.md) defines observability and diagnostics surfaces.
|
||||||
|
|||||||
@ -118,6 +118,8 @@ Hardware differences:
|
|||||||
The graphics system:
|
The graphics system:
|
||||||
|
|
||||||
- produces typed logical render submissions that render to RGBA8888 output
|
- produces typed logical render submissions that render to RGBA8888 output
|
||||||
|
- may consume Game submissions through a render worker that publishes owned
|
||||||
|
`OwnedRgba8888Frame` values
|
||||||
- uses an indexed palette
|
- uses an indexed palette
|
||||||
- does not depend on a specific GPU
|
- does not depend on a specific GPU
|
||||||
|
|
||||||
@ -126,7 +128,8 @@ The platform layer:
|
|||||||
- exposes typed service facades for render submission, render backend
|
- exposes typed service facades for render submission, render backend
|
||||||
execution, Game 2D composition, input, audio, assets, and telemetry
|
execution, Game 2D composition, input, audio, assets, and telemetry
|
||||||
- consumes closed render submissions through a render-surface implementation
|
- consumes closed render submissions through a render-surface implementation
|
||||||
- transports published RGBA8888 output into a host presentation surface without
|
- transports published RGBA8888 output or worker-published
|
||||||
|
`OwnedRgba8888Frame` pixels into a host presentation surface without
|
||||||
injecting host-owned debug overlay pixels
|
injecting host-owned debug overlay pixels
|
||||||
- is the runtime-facing portability boundary; runtime and firmware code must not
|
- is the runtime-facing portability boundary; runtime and firmware code must not
|
||||||
depend on a monolithic hardware bridge or on a concrete hardware aggregate
|
depend on a monolithic hardware bridge or on a concrete hardware aggregate
|
||||||
@ -135,6 +138,12 @@ The host presentation layer MUST treat RGBA8888 as the canonical logical
|
|||||||
framebuffer format. RGB565 conversion is not part of the normal host
|
framebuffer format. RGB565 conversion is not part of the normal host
|
||||||
presentation contract.
|
presentation contract.
|
||||||
|
|
||||||
|
Native upload and present belong to the host event loop. The render worker MUST
|
||||||
|
NOT own or require a native window, swapchain, `pixels` surface, SDL texture, or
|
||||||
|
host GPU texture as part of its contract. The worker output is an owned
|
||||||
|
RGBA8888 frame; the host decides how to upload that frame to the native
|
||||||
|
presentation API for the current platform.
|
||||||
|
|
||||||
Host presentation SHOULD be driven by published render submissions and explicit
|
Host presentation SHOULD be driven by published render submissions and explicit
|
||||||
host-owned invalidation, not by perpetual redraw polling.
|
host-owned invalidation, not by perpetual redraw polling.
|
||||||
|
|
||||||
|
|||||||
@ -56,6 +56,13 @@ input, audio, assets, and telemetry. A concrete local hardware aggregate may
|
|||||||
exist inside a host or test platform, but it is not the normative runtime-facing
|
exist inside a host or test platform, but it is not the normative runtime-facing
|
||||||
contract.
|
contract.
|
||||||
|
|
||||||
|
The real render worker contract is documented across the GFX, events, and
|
||||||
|
portability chapters. `04-gfx-peripheral.md` defines the render submission and
|
||||||
|
`OwnedRgba8888Frame` publication contract, `09-events-and-concurrency.md`
|
||||||
|
defines latest-wins handoff and bounded shutdown behavior, and
|
||||||
|
`11-portability-and-cross-platform-execution.md` defines the split between
|
||||||
|
worker-owned RGBA8888 frame production and host-owned native upload/present.
|
||||||
|
|
||||||
## Document Functions
|
## Document Functions
|
||||||
|
|
||||||
- `normative`: defines the technical contract, expected behavior, or implementation-facing surface.
|
- `normative`: defines the technical contract, expected behavior, or implementation-facing surface.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user