docs: S4 packet — particles take the retail DrawMesh branch table; #459 names the unconsumed-attribute candidates

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-03 17:14:57 +02:00
parent 17315f0e7d
commit 6435655d73
2 changed files with 11 additions and 5 deletions

View file

@ -120,7 +120,7 @@ may be force-stopped after two failed graceful closes, and ACE then holds the se
## #459 — Five fragment shaders declare SPIR-V `DemoteToHelperInvocation` without the device feature (validation error at every launch)
**Status:** RESOLVED 2026-09-03 at `e33fd2472``shaderDemoteToHelperInvocation` is now read through the Vulkan 1.3 feature chain, enabled at device creation, and gated as required in `VulkanCapabilityRecord` (236 Vulkan tests + the hermetic lane green). Proof: the four-pose validation launch at that commit (`logs/selfgate-20260903-171009-fix459-validation`, `logs/vk-validation-459.log`) reports ZERO validation errors; only the ten pre-existing `WARNING-Shader-OutputNotConsumed` performance warnings remain (one pipeline declares a vertex attribute at location 1 its shader never reads — still to be identified; harmless). Found 2026-09-03 by the first Vulkan-validation-layer self-gate of Campaign OVERHAUL v2 (S3 chunk 4 fix round 2's gate; the layer was forced through the loader with `VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation`, since `ACDREAM_DEVTOOLS=1` only adds the debug-utils extension — `VulkanInterop.cs:182-183` creates the instance with `EnabledLayerCount = 0`).
**Status:** RESOLVED 2026-09-03 at `e33fd2472``shaderDemoteToHelperInvocation` is now read through the Vulkan 1.3 feature chain, enabled at device creation, and gated as required in `VulkanCapabilityRecord` (236 Vulkan tests + the hermetic lane green). Proof: the four-pose validation launch at that commit (`logs/selfgate-20260903-171009-fix459-validation`, `logs/vk-validation-459.log`) reports ZERO validation errors; only the ten pre-existing `WARNING-Shader-OutputNotConsumed` performance warnings remain (one pipeline declares a vertex attribute at location 1 its shader never reads — harmless; `spirv-dis` narrows the module to a vertex shader with a single `Location 0` input that is built into ~10 pipeline variants: `portal_depth.vert` (the seal/punch variants) or the `directional_shadow_terrain`/`_world_opaque` pair — confirm by matching the reported `VkShaderModule` handle against the creation order when someone trims that pipeline's vertex-input state). Found 2026-09-03 by the first Vulkan-validation-layer self-gate of Campaign OVERHAUL v2 (S3 chunk 4 fix round 2's gate; the layer was forced through the loader with `VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation`, since `ACDREAM_DEVTOOLS=1` only adds the debug-utils extension — `VulkanInterop.cs:182-183` creates the instance with `EnabledLayerCount = 0`).
**Severity:** LOW today (every driver we run on accepts it), MEDIUM by the spec (undefined behavior: `VUID-VkShaderModuleCreateInfo-pCode-08740`)
**Component:** `tools/ShaderCompiler` target environment / `VulkanGpuDevice` feature chain

View file

@ -132,10 +132,16 @@ seal/punch color-state row from S4-c1 kept or retired per its decision.
`DrawBlock` call AFTER `DrawSortCell` returns, so chunk 2 adds one leaf
method at the sort-cell EXIT (a `WalkFrameEventKind` of its own, ordered
after the cell's object turn) — not a print-site change.
- Where does the particle submitter's list membership come from — the
particle draw is retail's own `AddMeshToAlphaList` consumer (billboards go
to ALPHA), or is it drawn through the emitter's cell turn immediately?
Check `ParticleRenderer.cs`'s submit site against the spec's §4 table.
- PARTLY SETTLED (2026-09-03): `ParticleRenderer` submits every deferred
particle draw (billboard and mesh kinds alike) to the single queue with a
viewer distance (`queue.Submit(_alphaSource, token, sqrt(DistanceSq))`).
In retail a particle is a `DrawMesh` like any other subset, so its list is
decided by the §4 branch table on the emitter's subset mask and material
(rows 3/4 → ALPHA under the default `0x0E` delay mask; row 1 immediate
while `m_currentlyDrawingSky` is set — the weather emitters). Chunk 2
routes particles through the same branch table, not a particle-specific
rule; the parts capture (`*.parts.log`, `PD`/`DM` lines) is the oracle for
which emitters ever appear as immediate draws.
- SETTLED (2026-09-03): the `alphadepth` captures' `AM` lines carry the list
selector (`AM mesh=… surf=… csurf=… new=… clip=… listSel=…``listSel`
is the list, `new` the first-for-list flag, `clip` the clip-map duplicate,