docs(terrain): decode transient shade cache lookup

This commit is contained in:
2026-07-18 17:55:59 +04:00
parent 7c9a6215eb
commit 3f2f56892f
+20 -10
View File
@@ -1598,20 +1598,30 @@ The cache boundary is now mechanically separated from the WEAR loader. In the
`GetShade` object, the `Shade.wea` manager is stored at byte offset `3092`, but `GetShade` object, the `Shade.wea` manager is stored at byte offset `3092`, but
the dispatcher calls a distinct object at byte offset `3244`. Its virtual slot the dispatcher calls a distinct object at byte offset `3244`. Its virtual slot
`+16` receives every type-11 key repeatedly with mode values `512`, `16`, `+16` receives every type-11 key repeatedly with mode values `512`, `16`,
`20497`, and `20752`, and returns a runtime record rather than a WEAR row. The `20497`, and `20752`. The cache object itself has an eight-byte entry table at
dispatcher reads that record's flags at `+60`, a secondary selector at `+24`, `+316` and its exclusive key count at `+320`: the first dword of an entry is a
an optional byte at `+88`, a referenced state block at `+104`, three signed stored-record pointer and its byte at `+4` selects a 212-byte profile bank. A
shorts at `+108`, and another selector at `+112`. Those fields are inputs to key outside that count, or an entry pointer below `0x1000`, fails the lookup.
visibility tests, primitive construction and texture/secondary passes, but the On success the method returns the shared result view at cache offset `+24`, not
cache builder and bit meanings are still not recovered; the Vulkan path must the stored-record pointer and not a WEAR row. Thus the dispatcher's observed
not map any of them to invented pipeline state. flags at result-view `+60`, secondary selector `+24`, optional byte `+88`,
referenced state block `+104`, three signed shorts `+108`, and another selector
`+112` are materialized lookup state, not yet proven on-disk record offsets.
Mode `0x0200` (`512`) only validates the key in the recovered path; mode
`0x5011` includes the recovered selector-table transfer and mode `0x5110`
includes the recovered bank-byte transfer. The meanings of their remaining
bits, the cache builder, and the result fields remain unrecovered, so the Vulkan
path must not map any of them to invented pipeline state.
A read-only elevated AutoDemo probe confirms that this is a lifecycle boundary, A read-only elevated AutoDemo probe confirms that this is a lifecycle boundary,
not a permanently allocated table: the live `GetShade` singleton is initialized not a permanently allocated table: the live `GetShade` singleton is initialized
and its `Shade.wea` manager pointer is non-null, while its byte-offset `3244` and its `Shade.wea` manager pointer is non-null, while its byte-offset `3244`
cache pointer was null at the sampled instant. Therefore a future runtime cache pointer is normally null. Passive 100-ms sampling of the unattended
implementation must treat cache availability as contextual and cannot dereference AutoDemo caught it briefly at `0x035C64B4`; its relocated vtable is
or prebuild the cache solely from constructor state. `Terrain.dll` RVA `0x643D0` and slot `+16` is RVA `0x10910`, matching the
recovered lookup routine. Therefore a future runtime implementation must treat
cache availability as contextual and cannot dereference or prebuild the cache
solely from constructor state.
The static Vulkan bridge now carries each contiguous face run as a separate The static Vulkan bridge now carries each contiguous face run as a separate
draw range keyed by the original packed `material_tag`; it neither reorders draw range keyed by the original packed `material_tag`; it neither reorders