fix(pipeline): MP1a - sink delegate restores immediate side-stage enqueue (exception-path faithfulness)
Coordinator-directed follow-up. The buffer-and-drain seam diverged from the original on the exception path: pre-MP1a, CollectEmittersFromScript enqueued particle-preload meshes DIRECTLY into _stagedMeshData mid-Prepare, so preloads staged before a later throw in the same Prepare* call (reachable via PrepareEnvCellMeshData side-staging during its StaticObjects loop, then PrepareCellStructMeshData throwing on a malformed-dat texture decode) were already safely enqueued. The drain version only flushed after a successful return — on throw, entries stranded on the shared extractor until an unrelated successful call flushed them, and were silently dropped on dispose. Fix: MeshExtractor takes an Action<ObjectMeshData>? sideStagedSink constructor parameter; the two CollectEmittersFromScript sites become _sideStagedSink?.Invoke(meshData) — the original code shape (immediate hand-off) at those exact lines. ObjectMeshManager wires the sink to _stagedMeshData.Enqueue, restoring the original immediate-enqueue semantics including on mid-Prepare throw. _sideStaged buffer, DrainSideStaged(), and the ProcessQueueAsync drain loop are deleted. The MP1b bake tool passes its own collector. Inventory doc updated: MP1a note now records the sink seam and the Content-owned upload enums, so its no-behavior-change claim is accurate. dotnet build green; full test suite 4059 passed / 0 failed / 4 skipped. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
5722681bf5
commit
932f904e00
3 changed files with 39 additions and 37 deletions
|
|
@ -53,8 +53,26 @@ behavior change, no divergence-register row.
|
|||
- `src/AcDream.Content/TextureKey.cs` — the atlas dedup key, lifted out of
|
||||
the GL-owning `TextureAtlasManager` (which stays in App and now
|
||||
references the lifted struct).
|
||||
- `src/AcDream.Content/UploadFormats.cs` — Content-owned
|
||||
`UploadPixelFormat`/`UploadPixelType` enums carried by
|
||||
`MeshBatchData`/`TextureBatchData` instead of
|
||||
`Silk.NET.OpenGL.PixelFormat`/`PixelType` (Content must stay
|
||||
Silk.NET-free — the bake tool must not ship GL binaries). Underlying
|
||||
values are the GL ABI constants, numerically identical to the Silk.NET
|
||||
members; App casts at its single upload boundary (the `AddTexture` call
|
||||
in `UploadGfxObjMeshData`) via a lifted nullable enum conversion —
|
||||
value- and null-preserving.
|
||||
- `src/AcDream.Content/IDatReaderWriter.cs`, `EdgeLineBuilder.cs` — GL-free
|
||||
dependencies of the extractor, moved (namespace-only) alongside it.
|
||||
- **Side-stage sink seam:** `CollectEmittersFromScript` pre-loads particle
|
||||
GfxObj meshes mid-extraction and, pre-MP1a, enqueued them directly onto
|
||||
`ObjectMeshManager._stagedMeshData`. The extractor now takes an
|
||||
`Action<ObjectMeshData>? sideStagedSink` constructor parameter; App wires
|
||||
it to `_stagedMeshData.Enqueue`, preserving the original
|
||||
immediate-enqueue semantics exactly — including on a mid-`Prepare*`
|
||||
throw (preloads staged before a malformed-dat texture-decode exception
|
||||
survive, as they always did). The MP1b bake tool passes its own
|
||||
collector.
|
||||
- **Stays in `src/AcDream.App/Rendering/Wb/`:** `ObjectMeshManager` (now a
|
||||
thin wrapper owning the staged-queue/worker-pool/Dispose-quiesce lifecycle
|
||||
and all GL upload — constructs one `MeshExtractor` and delegates every
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue