From 0ca802cd7fafbf71558aeb0305b40f5738c466b9 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 28 Jul 2026 13:19:13 +0200 Subject: [PATCH] docs(render): measure the terrain clip block's set, and close the shader audit Slice V6i-1 recorded terrain_modern.vert's TerrainClip block as landing in the wrong descriptor set under the Vulkan dialect. That was reasoning from the missing ACDREAM_UBO_SET macro; it is now measured. Disassembling the committed spv/terrain_modern.vert.spv shows the block as OpVariable ... Uniform decorated DescriptorSet 0 / Binding 2, where set 0's layout declares a storage buffer. The audit the section asked for is also done rather than deferred. Every compiled .spv was disassembled: mesh_modern.vert's nine set-0 entries are all StorageBuffer, correctly, and every other uniform block in every other shader already carries the macro. terrain_modern.vert is the only one. sky.vert is the precedent - it declares the SAME shared clip block as ACDREAM_UBO_SET binding = 2 - so there is no numbering question for the world arm to settle, only a one-word omission to fix, plus declaring set 1 bindings 2 and 4 in the uniform set layout. Binding 4 is section 5.5.8's still-open UniformSkyParams, which sky.vert and sky.frag both declare. Documentation only; no source, shader or .spv is touched. Co-Authored-By: Claude Fable 5 --- docs/plans/2026-07-27-vulkan-campaign.md | 32 ++++++++++++++++-------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/docs/plans/2026-07-27-vulkan-campaign.md b/docs/plans/2026-07-27-vulkan-campaign.md index 393be07a..65c005c3 100644 --- a/docs/plans/2026-07-27-vulkan-campaign.md +++ b/docs/plans/2026-07-27-vulkan-campaign.md @@ -1552,16 +1552,28 @@ one this slice measured: needs, so the missing piece is an `ITextureArray` implementation over `IGpuTexture`, not a codec. -2. **`terrain_modern.vert`'s `TerrainClip` block is in the wrong set for Vulkan, - and it is the same class of gap §5.5.8 recorded for `UniformSkyParams`.** It - is declared `layout(std140, binding = 2) uniform TerrainClip` with **no - `ACDREAM_UBO_SET`**, so under the Vulkan dialect it lands at set 0 binding 2 — - which set 0's layout declares as a STORAGE buffer. GL is unaffected (the macro - expands to nothing and the UBO namespace is separate), and nothing has caught - it because no terrain pipeline has ever been created on Vulkan. Whoever draws - terrain must add the macro, declare binding 2 in the uniform set layout, and - raise `DynamicUniformBindingCount` to 3 — still far under the guaranteed 8. - Worth auditing every remaining shader for the same omission in the same pass. +2. **`terrain_modern.vert`'s `TerrainClip` block is in the wrong descriptor set, + measured on the committed SPIR-V.** It is declared + `layout(std140, binding = 2) uniform TerrainClip` with **no + `ACDREAM_UBO_SET`**, so under the Vulkan dialect it lands in set 0. + Disassembling `spv/terrain_modern.vert.spv` confirms it rather than infers it: + the block is `OpVariable ... Uniform` decorated `DescriptorSet 0` / `Binding + 2`, and set 0's layout declares binding 2 as a STORAGE buffer. A terrain + pipeline built against the shared layout is therefore malformed. GL is + unaffected — the macro expands to nothing and GL's UBO namespace is separate — + and nothing has caught it because no terrain pipeline has ever been created on + Vulkan. + + **The audit is done and this is the only one.** Every compiled `.spv` was + disassembled: `mesh_modern.vert`'s nine set-0 entries are all + `StorageBuffer`, correctly; every other uniform block in every other shader + already carries the macro. `sky.vert` is the precedent — it declares the SAME + block as `ACDREAM_UBO_SET binding = 2` — so there is no numbering question to + settle, only a one-word omission to fix. The fix is that word plus declaring + bindings 2 and 4 in `VulkanPipelineLayouts.CreateUniformSetLayout` (4 is + §5.5.8's still-open `UniformSkyParams`, which `sky.vert` and `sky.frag` both + declare) and raising `DynamicUniformBindingCount` accordingly — still far + under Vulkan's guaranteed 8. 3. **The flat-versus-PView question decides how much of the world arm is one slice.** `WorldSceneRenderer` is already backend-neutral — it takes