Vector Data
rawFeatures non-null means this tile+interval was parsed in the raw fast path (rule: raw-vector-fast-path — originally circle-only, generalized to Fill/Line/Circle via VectorTileSource.setRawPathEligible) — it and features are never both populated. This is the single flag every reader branches on; there is no separate map tracking "raw mode," which is what caused prior gate-hold desync bugs.
Properties
True after releaseCpuGeometryIfIdle dropped Feature snapshots. Native MVT bytes and GPU meshes remain. Distinct from a tile that parsed with zero features.
Copy-on-write so consume-after-upload can MutableList.clear on a worker while the render thread still fingerprints or triangulates a snapshot (ArrayList iterators otherwise throw ConcurrentModificationException and abort Mapbox's JNI render thread).
Raw MVT feature path (rule: raw-vector-fast-path). Constructor-compatible with the previous val; the setter is private so end-user access is unchanged. Cleared after GPU upload.
Functions
Parsed empty — not the same as cpuGeometryReleased.
Drop CPU Features only after every GL consumer of this source has a mesh (or is vacuous). Fill/line/circle share one VectorData; consuming after the first mesh starved siblings, left the play-press spinner up, and forced just-in-time re-parse at the playhead.
iOS consume-after-upload: drop parsed Feature / Gson copies once no renderer is still triangulating this snapshot and every source consumer has a mesh. Mesh cache keys stay stable via remembered fingerprints.