From 6e36bf2c1bd1d4d9bbbfb029fce279b4d4c373a7 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Sat, 31 Oct 2026 19:27:38 +0800 Subject: [PATCH] [Chore, Docs] (...): drop the archived notes and move the skill under tools - the archive freeze rule goes with the directory - code comments lose citations to the removed notes --- .../scripts/probes/dmahash.c | 34 - .../scripts/probes/texfmt.c | 95 - CONTRIBUTING.md | 2 - MobileGL/Config.h | 6 +- MobileGL/ConfigLoader.cpp | 2 +- MobileGL/MG_Backend/BackendRoles.h | 2 +- MobileGL/MG_Backend/DirectGLES/DirectGLES.h | 2 +- .../DirectGLES/DirectGLESContext.cpp | 2 +- .../MG_Backend/DirectGLES/DirectGLESCopy.cpp | 4 +- .../DirectGLES/DirectGLESReadback.cpp | 2 +- .../DirectGLES/DirectGLESSharedImage.cpp | 2 +- MobileGL/MG_Backend/DirectGLES/Managers.h | 12 +- .../MG_Backend/DirectGLES/ManagersBuffers.cpp | 2 +- .../DirectGLES/ManagersTextures.cpp | 6 +- .../MG_Backend/DirectVulkan/DirectVulkan.cpp | 4 +- .../DirectVulkan/Renderer/UniformManager.cpp | 6 +- .../Renderer/VertexInputStateFactory.cpp | 2 +- .../DirectVulkan/Renderer/VkTextureManager.h | 2 +- .../DirectVulkan/Renderer/VulkanRenderer.h | 2 +- .../DirectVulkan/Renderer/WireFramebuffer.cpp | 4 +- .../DirectVulkan/Renderer/WireSharedImage.cpp | 2 +- MobileGL/MG_Backend/Init.cpp | 2 +- MobileGL/MG_Backend/Record/RecordVerbSink.cpp | 10 +- MobileGL/MG_Backend/Record/RecordVerbSink.h | 2 +- .../MG_Backend/Record/StagedTextureStore.h | 2 +- MobileGL/MG_Backend/SharedImageTypes.h | 2 +- MobileGL/MG_Gbm/MobileGLGbm.cpp | 2 +- .../MG_Impl/EGLImpl/SharedImageFlushPolicy.h | 2 +- .../MG_Impl/GLImpl/Texture/GL_Texture.cpp | 2 +- MobileGL/MG_Impl/GLXImpl/X11Present.h | 2 +- MobileGL/MG_Impl/Pipe/PipeFill.cpp | 16 +- MobileGL/MG_Impl/Pipe/ProgramEmit.h | 2 +- MobileGL/MG_Impl/Pipe/SetHashSuppressor.h | 2 +- MobileGL/MG_Impl/Pipe/Tracker.h | 24 +- MobileGL/MG_Impl/Pipe/Verb/VerbPort.h | 2 +- MobileGL/MG_Impl/SharedImageApi.h | 2 +- MobileGL/MG_IntegrationTest/P8Coverage.cmake | 4 +- .../CopyImageStoreReadbackScenario.cpp | 2 +- .../Scenarios/CtWireScenario.cpp | 6 +- .../DepthStencilReadbackMatrixScenario.cpp | 17 +- .../Scenarios/F1WireScenario.cpp | 2 +- .../Scenarios/FencePollScenario.cpp | 2 +- .../GenerateMipmapServerScenario.cpp | 2 +- .../Scenarios/IndexedDrawFamilyScenario.cpp | 2 +- .../Scenarios/LargeArenaAdoptionScenario.cpp | 6 +- .../Scenarios/PackBufferReadbackScenario.cpp | 2 +- .../Scenarios/TextureRemintPullScenario.cpp | 2 +- .../Scenarios/TextureUploadShapeScenario.cpp | 2 +- .../Scenarios/TextureViewAliasScenario.cpp | 4 +- .../Scenarios/TriangleScenario.cpp | 2 +- .../WireIndirectDispatchScenario.cpp | 2 +- .../Scenarios/WireMipShapeScenario.cpp | 2 +- MobileGL/MG_Pipe/MGPipe.h | 2 +- MobileGL/MG_Pipe/MGPipeTypes.h | 10 +- MobileGL/MG_Pipe/PipeApply.cpp | 2 +- MobileGL/MG_Pipe/PipeApply.h | 6 +- MobileGL/MG_Pipe/PipeVerbSink.h | 4 +- MobileGL/MG_Pipe/generated/PipeWire.inc | 2 +- .../MG_Remote/Client/BackendObject_Remote.h | 2 +- MobileGL/MG_Remote/Client/ClientSession.cpp | 2 +- MobileGL/MG_Remote/Client/ClientSession.h | 4 +- MobileGL/MG_Remote/Client/WireTables.cpp | 2 +- MobileGL/MG_Remote/Server/PipeApplier.cpp | 2 +- MobileGL/MG_Remote/Server/PipeApplier.h | 4 +- MobileGL/MG_Remote/Server/ServerMain.cpp | 2 +- MobileGL/MG_Remote/Server/ServerSession.cpp | 2 +- MobileGL/MG_Remote/Server/ServerSession.h | 4 +- .../MG_Remote/Server/SharedImageRegistry.h | 4 +- MobileGL/MG_Remote/Wire/PipeWireCodec.cpp | 22 +- .../GLState/BufferState/BufferState.h | 2 +- MobileGL/MG_Test/Pipe/FieldOwnershipTest.cpp | 2 +- MobileGL/MG_Test/Pipe/PipeCatalogueTest.cpp | 32 +- .../MG_Test/Pipe/ShaderBufferEmitTest.cpp | 2 +- MobileGL/MG_Test/Pipe/TrackerTest.cpp | 2 +- MobileGL/MG_Test/Util/PipeStatsTest.cpp | 2 +- MobileGL/MG_Test/Wire/AdoptInboxTest.cpp | 2 +- MobileGL/MG_Test/Wire/AdoptTierStreamTest.cpp | 2 +- .../MG_Test/Wire/GlamorEglSequenceTest.cpp | 2 +- MobileGL/MG_Test/Wire/PipeWireCodecTest.cpp | 10 +- MobileGL/MG_Test/Wire/RemoteClientAdoptT0.inc | 2 +- .../MG_Test/Wire/RemoteClientControls.inc | 2 +- MobileGL/MG_Test/Wire/RemoteClientTest.cpp | 6 +- MobileGL/MG_Test/Wire/ServerLoopTest.cpp | 2 +- MobileGL/MG_Test/Wire/SessionTest.cpp | 2 +- MobileGL/MG_Test/Wire/SharedImageTest.cpp | 2 +- .../MG_Test/Wire/StagedTextureStoreTest.cpp | 2 +- docs/Disaggregated/ARCHITECTURE.md | 4 +- docs/Disaggregated/CURRENT_STAGE_PROGRESS.md | 4 +- docs/Disaggregated/DEBTS.md | 18 +- docs/Disaggregated/MEASUREMENTS.md | 42 +- docs/Disaggregated/OPEN-QUESTIONS.md | 2 +- docs/Disaggregated/README.md | 5 +- docs/Disaggregated/ROADMAP.md | 48 +- .../design/02-catalogue-and-records.md | 2 +- .../design/04-reverse-channel.md | 4 +- .../design/05-backend-and-server.md | 2 +- docs/Disaggregated/design/06-transport.md | 2 +- .../design/07-memory-readback-verification.md | 2 +- .../design/08-runtime-and-platform.md | 2 +- .../design/09-build-switches-counters.md | 2 +- docs/Disaggregated/design/10-phase-shapes.md | 8 +- .../design/11-state-ownership.md | 2 +- docs/Disaggregated/guide/build-and-run.md | 2 +- .../guide/pin-verification-2026-09-07.md | 28 - docs/Disaggregated/pwait/README.md | 4 +- docs/MobileVA/plan.md | 655 --- docs/Performance/glmark2-handoff.md | 201 - docs/Performance/ipc-create-window.md | 3 +- docs/archive/README.md | 12 - .../contracts/CONTRACT-MAGMA-RUNAHEAD.md | 63 - docs/archive/contracts/CONTRACT-P10.md | 54 - docs/archive/contracts/CONTRACT-P11.md | 354 -- docs/archive/contracts/CONTRACT-P12.md | 64 - docs/archive/contracts/CONTRACT-P5.md | 642 --- docs/archive/contracts/CONTRACT-P5B.md | 485 -- docs/archive/contracts/CONTRACT-P5C.md | 543 -- docs/archive/contracts/CONTRACT-P5E.md | 804 --- docs/archive/contracts/CONTRACT-P6.md | 757 --- docs/archive/contracts/CONTRACT-P65.md | 60 - docs/archive/contracts/CONTRACT-P7.md | 199 - docs/archive/contracts/CONTRACT-P8.md | 53 - docs/archive/contracts/CONTRACT-P9.md | 71 - docs/archive/notes/README.md | 74 - docs/archive/notes/anland/README.md | 166 - docs/archive/notes/anland/brief-anland.md | 24 - docs/archive/notes/anland/brief-mobilegl.md | 21 - .../notes/anland/changes-for-d1100-mali.md | 174 - docs/archive/notes/anland/kgsl-as-server.md | 47 - docs/archive/notes/anland/report-anland.md | 270 - docs/archive/notes/anland/report-mobilegl.md | 591 -- .../archive/notes/handoff/review-b3r3-b2r4.md | 6 - docs/archive/notes/handoff/review-b4.md | 22 - docs/archive/notes/handoff/review-f-fix.md | 7 - docs/archive/notes/handoff/review-f2.md | 15 - docs/archive/notes/handoff/review-g5.md | 11 - docs/archive/notes/handoff/review-m2-r2.md | 14 - docs/archive/notes/handoff/review-m3.md | 11 - .../notes/handoff/review-p7-closeout-codex.md | 51 - .../archive/notes/handoff/review-ratchet88.md | 11 - .../archive/notes/handoff/review-v1-fix-r2.md | 11 - docs/archive/notes/p0/BRIEF-DOCS.md | 26 - docs/archive/notes/p0/BRIEF-P0.md | 48 - docs/archive/notes/p0/README.md | 94 - docs/archive/notes/p0/p0-device-findings.md | 30 - docs/archive/notes/p05/BRIEF-P05.md | 434 -- docs/archive/notes/p05/README.md | 24 - .../p05/p05-results/include-gate-review-v1.md | 95 - .../notes/p05/p05-results/include-gate-v1.md | 280 - .../program-artifacts-review-v1.md | 114 - .../p05/p05-results/program-artifacts-v1.md | 66 - .../p05/p05-results/value-types-review-v1.md | 83 - .../notes/p05/p05-results/value-types-v1.md | 63 - docs/archive/notes/p1/BRIEF-P1.md | 572 -- docs/archive/notes/p1/P1-LANE-FINDINGS.md | 65 - docs/archive/notes/p1/README.md | 57 - .../notes/p1/p1-results/core-contract.md | 73 - .../notes/p1/p1-results/core-review-v1.md | 103 - .../notes/p1/p1-results/core-review-v2.md | 95 - .../notes/p1/p1-results/core-review-v3.md | 324 -- docs/archive/notes/p1/p1-results/core-v1.md | 82 - docs/archive/notes/p1/p1-results/core-v2.md | 80 - docs/archive/notes/p1/p1-results/core-v3.md | 62 - .../notes/p1/p1-results/espryt-review-v1.md | 70 - docs/archive/notes/p1/p1-results/espryt-v1.md | 79 - .../notes/p1/p1-results/fix-core-review-v1.md | 260 - .../notes/p1/p1-results/fix-core-v1.md | 284 - .../p1/p1-results/fix-tests-review-v1.md | 272 - .../notes/p1/p1-results/fix-tests-v1.md | 214 - .../notes/p1/p1-results/magma-review-v1.md | 87 - docs/archive/notes/p1/p1-results/magma-v1.md | 72 - .../notes/p1/p1-results/verify-review-v1.md | 97 - .../notes/p1/p1-results/verify-review-v2.md | 69 - docs/archive/notes/p1/p1-results/verify-v1.md | 84 - docs/archive/notes/p1/p1-results/verify-v2.md | 202 - docs/archive/notes/p10/A-FENCE-POLL.md | 37 - docs/archive/notes/p10/C-MEASUREMENTS.md | 46 - .../notes/p10/INTEGRATOR-DECISIONS-P10.md | 20 - docs/archive/notes/p10/PLAN-P10.md | 38 - docs/archive/notes/p10/README.md | 25 - docs/archive/notes/p11/A-DEVICE.md | 38 - docs/archive/notes/p11/B0-CROSS-APP.md | 43 - docs/archive/notes/p11/B2-DEVICE.md | 43 - docs/archive/notes/p11/HSPIKE.md | 23 - .../notes/p11/INTEGRATOR-DECISIONS-P11.md | 26 - docs/archive/notes/p11/PLAN-P11.md | 53 - docs/archive/notes/p11/README.md | 30 - docs/archive/notes/p12/BRIEF-onscreen.md | 161 - .../notes/p12/CREATE-WINDOW-MEASURED.md | 340 -- .../archive/notes/p12/CROSSHOST-ACCEPTANCE.md | 44 - .../notes/p12/DEVICELOST-AND-UPLOAD-WAITS.md | 331 -- docs/archive/notes/p12/FCL-ACCEPTANCE.md | 43 - .../notes/p12/INTEGRATOR-DECISIONS-P12.md | 21 - docs/archive/notes/p12/PLAN-P12.md | 104 - docs/archive/notes/p12/README.md | 118 - .../notes/p12/UNPUBLISH-GUARD-SIGNALS.md | 128 - docs/archive/notes/p12/android/build.sh | 42 - docs/archive/notes/p12/android/check1.sh | 43 - docs/archive/notes/p12/android/check3.sh | 47 - docs/archive/notes/p12/android/check4.sh | 52 - docs/archive/notes/p12/android/check5.sh | 48 - docs/archive/notes/p12/android/check7.sh | 55 - docs/archive/notes/p12/android/cleanup.sh | 19 - .../p12/android/client-devicelost-probe.patch | 37 - docs/archive/notes/p12/android/commit1.sh | 14 - docs/archive/notes/p12/android/commit2.sh | 9 - docs/archive/notes/p12/android/commit3.sh | 11 - docs/archive/notes/p12/android/dev.sh | 163 - docs/archive/notes/p12/android/final-run.sh | 22 - docs/archive/notes/p12/android/g1.sh | 15 - .../notes/p12/android/host-inproc-server.py | 25 - docs/archive/notes/p12/android/hostkill.sh | 41 - docs/archive/notes/p12/android/hostrepro.sh | 43 - .../archive/notes/p12/android/launch-build.sh | 8 - docs/archive/notes/p12/android/pidlines.sh | 4 - docs/archive/notes/p12/android/precheck.sh | 39 - .../notes/p12/android/redonce-tools.sh | 41 - .../notes/p12/android/redonce-twins.sh | 21 - .../notes/p12/android/run-tool-tests.sh | 10 - .../notes/p12/android/sanity-test-append.cpp | 69 - docs/archive/notes/p12/android/show.sh | 9 - docs/archive/notes/p12/android/thumbs.py | 20 - docs/archive/notes/p12/android/verify-apk.sh | 14 - .../notes/p12/device/00-found-state.txt | 9 - .../p12/device/1-onscreen-espryt/check.log | 95 - .../replay/evidence-during-replay-540p.png | Bin 11249 -> 0 bytes .../replay/evidence-during-replay.png | Bin 101748 -> 0 bytes .../replay/output/result.json | 32 - .../device/1-onscreen-espryt/tds-start.txt | 3 - .../p12/device/2-onscreen-magma/check.log | 106 - .../replay/evidence-during-replay-540p.png | Bin 11249 -> 0 bytes .../replay/evidence-during-replay.png | Bin 101748 -> 0 bytes .../replay/output/result.json | 32 - .../second/evidence-during-replay-540p.png | Bin 7734 -> 0 bytes .../second/evidence-during-replay.png | Bin 47510 -> 0 bytes .../second/output/result.json | 32 - .../p12/device/2-onscreen-magma/tds-start.txt | 3 - .../device/3-sequential-and-busy/check.log | 47 - .../long/evidence-during-replay-540p.png | Bin 7739 -> 0 bytes .../long/evidence-during-replay.png | Bin 47544 -> 0 bytes .../long/output/result.json | 32 - .../second/evidence-during-replay-540p.png | Bin 11249 -> 0 bytes .../second/evidence-during-replay.png | Bin 101748 -> 0 bytes .../second/output/result.json | 32 - .../after/evidence-during-replay-540p.png | Bin 11249 -> 0 bytes .../after/evidence-during-replay.png | Bin 101748 -> 0 bytes .../4-window-lost/after/output/result.json | 32 - .../notes/p12/device/4-window-lost/check.log | 62 - .../p12/device/4-window-lost/tds-restart.txt | 3 - .../p12/device/5-offscreen-service/check.log | 21 - .../offscreen/output/result.json | 32 - .../5-offscreen-service/ps-after-start.txt | 2 - .../device/5-offscreen-service/tds-start.txt | 3 - .../check.log | 25 - .../next/output/result.json | 32 - .../ps-end.txt | 3 - .../refused/output/result.json | 32 - .../notes/p12/device/7-one-server/check.log | 38 - .../device/7-one-server/ps-after-activity.txt | 2 - .../device/7-one-server/ps-after-service.txt | 2 - .../p12/device/7-one-server/ps-before.txt | 3 - .../p12/device/7-one-server/tds-activity.txt | 3 - .../p12/device/7-one-server/tds-service2.txt | 3 - .../p12/device/99-cleanup/final-state.txt | 6 - .../notes/p12/device/evidence-strip.png | Bin 109854 -> 0 bytes .../1-onscreen-espryt/check.log | 115 - .../replay/evidence-during-replay-540p.png | Bin 11249 -> 0 bytes .../replay/evidence-during-replay.png | Bin 101748 -> 0 bytes .../replay/output/result.json | 32 - .../1-onscreen-espryt/tds-start.txt | 4 - .../3-sequential-and-busy/check.log | 42 - .../second/evidence-during-replay-540p.png | Bin 1958 -> 0 bytes .../second/evidence-during-replay.png | Bin 20336 -> 0 bytes .../second/output/result.json | 32 - .../1-onscreen-espryt/check.log | 94 - .../replay/evidence-during-replay-540p.png | Bin 11249 -> 0 bytes .../replay/evidence-during-replay.png | Bin 101748 -> 0 bytes .../replay/output/result.json | 32 - .../1-onscreen-espryt/tds-start.txt | 3 - .../trial-a4a940db/2-onscreen-magma/check.log | 94 - .../replay/evidence-during-replay-540p.png | Bin 11249 -> 0 bytes .../replay/evidence-during-replay.png | Bin 101748 -> 0 bytes .../replay/output/result.json | 32 - .../2-onscreen-magma/tds-start.txt | 3 - .../3-sequential-and-busy/check.log | 43 - .../long/output/result.json | 32 - .../second/evidence-during-replay-540p.png | Bin 98405 -> 0 bytes .../second/evidence-during-replay.png | Bin 1529578 -> 0 bytes .../second/output/result.json | 32 - .../after/evidence-during-replay-540p.png | Bin 11249 -> 0 bytes .../after/evidence-during-replay.png | Bin 101748 -> 0 bytes .../4-window-lost/after/output/result.json | 32 - .../trial-a4a940db/4-window-lost/check.log | 62 - .../4-window-lost/tds-restart.txt | 3 - .../5-offscreen-service/check.log | 21 - .../offscreen/output/result.json | 32 - .../5-offscreen-service/ps-after-start.txt | 2 - .../5-offscreen-service/tds-start.txt | 3 - .../check.log | 24 - .../next/output/result.json | 32 - .../ps-end.txt | 2 - .../refused/output/result.json | 32 - .../trial-a4a940db/7-one-server/check.log | 52 - .../7-one-server/ps-after-activity.txt | 2 - .../7-one-server/ps-after-service.txt | 2 - .../trial-a4a940db/7-one-server/ps-before.txt | 3 - .../7-one-server/tds-activity.txt | 3 - .../7-one-server/tds-service2.txt | 3 - docs/archive/notes/p12/fix-icd.sh | 12 - docs/archive/notes/p12/g1-base-names.sh | 6 - docs/archive/notes/p12/gate-container.sh | 47 - docs/archive/notes/p12/gate.sh | 59 - .../archive/notes/p12/gate/build-29b7b284.log | 20 - .../archive/notes/p12/gate/build-984db455.log | 21 - .../archive/notes/p12/gate/build-a4a940db.log | 21 - docs/archive/notes/p12/gate/gate-android1.log | 37 - .../notes/p12/gate/gate-review-3c342c97.log | 42 - .../p12/gate/gate-review-d04ac7d1-cmake4.log | 50 - docs/archive/notes/p12/map-apk-process.md | 131 - docs/archive/notes/p12/map-client-surface.md | 163 - docs/archive/notes/p12/map-docs-contract.md | 139 - docs/archive/notes/p12/map-server-surface.md | 150 - docs/archive/notes/p12/p203.sh | 8 - docs/archive/notes/p12/setup-tree.sh | 40 - docs/archive/notes/p13/HANDOFF-2026-10-06.md | 81 - .../notes/p13/INTEGRATOR-DECISIONS-P13.md | 6 - docs/archive/notes/p13/PLAN-P13.md | 223 - docs/archive/notes/p13/README.md | 81 - docs/archive/notes/p13/W5-DESIGN.md | 208 - docs/archive/notes/p13/W5-INVENTORY.csv | 995 ---- docs/archive/notes/p13/fcl-soak/README.md | 67 - .../fcl-soak/run004-magma-ftrace-signal34.txt | 5 - .../fcl-soak/run004-magma-logcat-excerpt.txt | 7 - .../run004-magma-sigcgt-transitions.txt | 4 - .../p13/fcl-soak/soak-ab-p12-p13-summary.txt | 22 - .../p13/fcl-soak/soak-p12-control-summary.txt | 12 - .../p13/fcl-soak/soak-p13-clean-summary.txt | 32 - docs/archive/notes/p13/fcl-soak/soak2.sh | 76 - docs/archive/notes/p13/fcl-soak/soak3.sh | 74 - docs/archive/notes/p13/tools/s3-ops-1.txt | 20 - docs/archive/notes/p13/tools/s3-ops-2.txt | 21 - docs/archive/notes/p13/tools/s3-ops-3.txt | 3 - docs/archive/notes/p13/tools/w5_classify.py | 156 - docs/archive/notes/p13/tools/w5_regate.py | 117 - docs/archive/notes/p13/tools/w5_rewrite.py | 94 - docs/archive/notes/p2/BRIEF-P2.md | 971 ---- docs/archive/notes/p2/INTEGRATOR-DECISIONS.md | 33 - docs/archive/notes/p2/README.md | 95 - docs/archive/notes/p2/ab/ab-summary-final.md | 110 - .../archive/notes/p2/ab/ab-summary-interim.md | 43 - docs/archive/notes/p2/ab/ab-summary-xiaomi.md | 62 - docs/archive/notes/p2/ab/ab-summary.md | 110 - docs/archive/notes/p2/bench/driverbench.md | 25 - docs/archive/notes/p2/devices/REPORT.md | 417 -- docs/archive/notes/p2/p2-results/contract.md | 229 - .../notes/p2/p2-results/espryt-review-v1.md | 402 -- .../notes/p2/p2-results/espryt-review-v2.md | 274 - .../notes/p2/p2-results/espryt-review-v3.md | 363 -- .../notes/p2/p2-results/espryt-review-v4.md | 358 -- .../notes/p2/p2-results/espryt-review-v5.md | 232 - docs/archive/notes/p2/p2-results/espryt-v1.md | 268 - docs/archive/notes/p2/p2-results/espryt-v2.md | 360 -- docs/archive/notes/p2/p2-results/espryt-v3.md | 446 -- docs/archive/notes/p2/p2-results/espryt-v4.md | 474 -- docs/archive/notes/p2/p2-results/espryt-v5.md | 311 -- .../notes/p2/p2-results/fix-aba-review-v1.md | 363 -- .../archive/notes/p2/p2-results/fix-aba-v1.md | 291 - .../archive/notes/p2/p2-results/fix-aba-v2.md | 280 - .../notes/p2/p2-results/gates-review-v1.md | 277 - .../notes/p2/p2-results/gates-review-v2.md | 300 -- .../notes/p2/p2-results/gates-review-v3.md | 267 - docs/archive/notes/p2/p2-results/gates-v1.md | 370 -- docs/archive/notes/p2/p2-results/gates-v2.md | 357 -- docs/archive/notes/p2/p2-results/gates-v3.md | 352 -- .../notes/p2/p2-results/magma-review-v1.md | 311 -- .../notes/p2/p2-results/magma-review-v2.md | 332 -- .../notes/p2/p2-results/magma-review-v3.md | 303 -- docs/archive/notes/p2/p2-results/magma-v1.md | 257 - docs/archive/notes/p2/p2-results/magma-v2.md | 316 -- docs/archive/notes/p2/p2-results/magma-v3.md | 372 -- .../notes/p2/p2-results/spans-review-v1.md | 334 -- .../notes/p2/p2-results/spans-review-v2.md | 347 -- .../notes/p2/p2-results/spans-review-v3.md | 252 - docs/archive/notes/p2/p2-results/spans-v1.md | 224 - docs/archive/notes/p2/p2-results/spans-v2.md | 288 - docs/archive/notes/p2/p2-results/spans-v3.md | 273 - .../notes/p2/p2-results/tracker-review-v1.md | 358 -- .../notes/p2/p2-results/tracker-review-v2.md | 402 -- .../notes/p2/p2-results/tracker-review-v3.md | 405 -- .../notes/p2/p2-results/tracker-review-v4.md | 329 -- .../notes/p2/p2-results/tracker-review-v5.md | 237 - .../archive/notes/p2/p2-results/tracker-v1.md | 270 - .../archive/notes/p2/p2-results/tracker-v2.md | 334 -- .../archive/notes/p2/p2-results/tracker-v3.md | 376 -- .../archive/notes/p2/p2-results/tracker-v4.md | 345 -- .../archive/notes/p2/p2-results/tracker-v5.md | 363 -- docs/archive/notes/p2/scout-docs-spec.md | 432 -- docs/archive/notes/p2/scout-measure-infra.md | 528 -- docs/archive/notes/p2/scout-render-state.md | 810 --- docs/archive/notes/p2/scout-track-h.md | 320 -- docs/archive/notes/p2/scout-tracker.md | 397 -- docs/archive/notes/p34b/README.md | 82 - docs/archive/notes/p34b/espryt-d1.md | 388 -- docs/archive/notes/p34b/espryt-d2.md | 354 -- docs/archive/notes/p34b/espryt-d3.md | 385 -- .../notes/p34b/split-scenario-census.md | 174 - docs/archive/notes/p3a/BRIEF-P3A.md | 1715 ------ .../archive/notes/p3a/INTEGRATOR-DECISIONS.md | 275 - docs/archive/notes/p3a/README.md | 117 - docs/archive/notes/p3a/ab/ab-summary-oppo.md | 87 - docs/archive/notes/p3a/ab/ab3-final.md | 39 - docs/archive/notes/p3a/ab/ab3-interim.md | 39 - docs/archive/notes/p3a/bench/driverbench.md | 27 - .../p3a/p3a-results/asan-doublefree-v1.md | 322 -- .../notes/p3a/p3a-results/client-review-v1.md | 429 -- .../notes/p3a/p3a-results/client-v1.md | 434 -- .../notes/p3a/p3a-results/client-v2.md | 461 -- .../p3a/p3a-results/contract-review-v1.md | 362 -- .../notes/p3a/p3a-results/contract-v1.md | 411 -- .../notes/p3a/p3a-results/espryt-review-v1.md | 514 -- .../notes/p3a/p3a-results/espryt-v1.md | 474 -- .../notes/p3a/p3a-results/espryt-v2.md | 527 -- .../notes/p3a/p3a-results/espryt-v3.md | 616 --- .../notes/p3a/p3a-results/exit-order-v1.md | 338 -- .../notes/p3a/p3a-results/final-review-v1.md | 401 -- .../archive/notes/p3a/p3a-results/final-v2.md | 376 -- .../notes/p3a/p3a-results/gates-review-v1.md | 365 -- .../archive/notes/p3a/p3a-results/gates-v1.md | 344 -- .../archive/notes/p3a/p3a-results/gates-v2.md | 371 -- .../notes/p3a/p3a-results/wire-review-v1.md | 529 -- docs/archive/notes/p3a/p3a-results/wire-v1.md | 256 - docs/archive/notes/p3a/p3a-results/wire-v2.md | 403 -- docs/archive/notes/p3a/scout-docs-spec.md | 407 -- .../archive/notes/p3a/scout-espryt-buffers.md | 688 --- docs/archive/notes/p3a/scout-espryt-vao.md | 595 --- .../archive/notes/p3a/scout-pipe-and-tests.md | 912 ---- docs/archive/notes/p4a/BRIEF-P4A.md | 2460 --------- .../archive/notes/p4a/INTEGRATOR-DECISIONS.md | 806 --- docs/archive/notes/p4a/README.md | 95 - docs/archive/notes/p4a/ab-redmi/three-arm.md | 27 - docs/archive/notes/p4a/ab-redmi/two-arm.md | 68 - docs/archive/notes/p4a/ab/main-two-arm.md | 73 - .../ab/prefix-a38bdab4/three-arm-prefix.md | 49 - .../ab/prefix-a38bdab4/three-arm-xiaomi.md | 49 - docs/archive/notes/p4a/ab/three-arm-prefix.md | 49 - docs/archive/notes/p4a/ab/three-arm.md | 49 - docs/archive/notes/p4a/bench/driverbench.md | 27 - .../p4a/p4a-results/clientfb-review-v1.md | 430 -- .../p4a/p4a-results/clientfb-review-v2.md | 362 -- .../notes/p4a/p4a-results/clientfb-v1.md | 434 -- .../notes/p4a/p4a-results/clientfb-v2.md | 519 -- .../p4a/p4a-results/clientsp-review-v1.md | 470 -- .../p4a/p4a-results/clientsp-review-v2.md | 491 -- .../notes/p4a/p4a-results/clientsp-v1.md | 434 -- .../notes/p4a/p4a-results/clientsp-v2.md | 370 -- .../notes/p4a/p4a-results/clientsp-v3.md | 374 -- .../p4a/p4a-results/contract-review-v1.md | 405 -- .../notes/p4a/p4a-results/contract-v1.md | 576 -- .../notes/p4a/p4a-results/contract-v2.md | 469 -- .../notes/p4a/p4a-results/contract-v3.md | 322 -- .../notes/p4a/p4a-results/contract-v4.md | 333 -- .../notes/p4a/p4a-results/contract-v5.md | 310 -- .../notes/p4a/p4a-results/contract-v6.md | 225 - .../notes/p4a/p4a-results/contract-v7.md | 217 - .../p4a/p4a-results/esprytdraw-review-v1.md | 530 -- .../notes/p4a/p4a-results/esprytdraw-v1.md | 508 -- .../notes/p4a/p4a-results/esprytdraw-v2.md | 437 -- .../notes/p4a/p4a-results/esprytdraw-v3.md | 690 --- .../p4a/p4a-results/esprytobj-review-v1.md | 375 -- .../p4a/p4a-results/esprytobj-review-v2.md | 483 -- .../notes/p4a/p4a-results/esprytobj-v1.md | 571 -- .../notes/p4a/p4a-results/esprytobj-v2.md | 666 --- .../notes/p4a/p4a-results/esprytobj-v3.md | 479 -- .../notes/p4a/p4a-results/fable-seam-audit.md | 444 -- .../notes/p4a/p4a-results/fablefix-v1.md | 441 -- .../notes/p4a/p4a-results/final-review-v1.md | 484 -- .../p4a-finalfix-gate-symbols.md | 28 - .../notes/p4a/p4a-results/finalfix-v1.md | 328 -- .../notes/p4a/p4a-results/gates-review-v1.md | 563 -- .../notes/p4a/p4a-results/gates-review-v2.md | 523 -- .../archive/notes/p4a/p4a-results/gates-v1.md | 459 -- .../archive/notes/p4a/p4a-results/gates-v2.md | 380 -- .../archive/notes/p4a/p4a-results/gates-v3.md | 395 -- .../notes/p4a/p4a-results/wire-review-v1.md | 364 -- .../notes/p4a/p4a-results/wire-review-v2.md | 392 -- docs/archive/notes/p4a/p4a-results/wire-v1.md | 491 -- docs/archive/notes/p4a/p4a-results/wire-v2.md | 348 -- docs/archive/notes/p4a/p4a-results/wire-v3.md | 409 -- docs/archive/notes/p4a/scout-docs-spec.md | 955 ---- .../notes/p4a/scout-espryt-framebuffer.md | 815 --- .../notes/p4a/scout-espryt-sampler-program.md | 810 --- .../archive/notes/p4a/scout-frontend-state.md | 933 ---- .../notes/p4a/scout-pipe-and-client.md | 1051 ---- docs/archive/notes/p5/BRIEF-P5.md | 904 ---- docs/archive/notes/p5/PACKAGE-PREAMBLE.md | 75 - docs/archive/notes/p5/README.md | 135 - .../notes/p5/p5-results/ab-v1-tables.md | 1357 ----- docs/archive/notes/p5/p5-results/ab-v1.md | 1468 ----- docs/archive/notes/p5/p5-results/ap-v1.md | 225 - docs/archive/notes/p5/p5-results/apkci-v1.md | 39 - .../notes/p5/p5-results/b1-review-v1.md | 384 -- docs/archive/notes/p5/p5-results/b1-v1.md | 581 -- docs/archive/notes/p5/p5-results/b1-v2.md | 553 -- docs/archive/notes/p5/p5-results/c0-v1.md | 663 --- .../notes/p5/p5-results/c1-codex-review-v2.md | 162 - .../notes/p5/p5-results/c1-codex-verify-v2.md | 852 --- .../notes/p5/p5-results/c1-review-v2.md | 482 -- .../notes/p5/p5-results/c1-review-v3.md | 646 --- docs/archive/notes/p5/p5-results/c1-v1.md | 370 -- docs/archive/notes/p5/p5-results/c1-v2.md | 387 -- docs/archive/notes/p5/p5-results/c1-v3.md | 296 - docs/archive/notes/p5/p5-results/c1f-v1.md | 240 - docs/archive/notes/p5/p5-results/c1g-v1.md | 71 - docs/archive/notes/p5/p5-results/dp-v1.md | 19 - .../notes/p5/p5-results/j0-review-v1.md | 361 -- docs/archive/notes/p5/p5-results/j0-v1.md | 122 - docs/archive/notes/p5/p5-results/j0-v2.md | 221 - docs/archive/notes/p5/p5-results/j0-v3.md | 67 - docs/archive/notes/p5/p5-results/joint-v1.md | 1495 ------ .../notes/p5/p5-results/p1-review-v1.md | 295 - docs/archive/notes/p5/p5-results/p1-v1.md | 667 --- docs/archive/notes/p5/p5-results/p1-v2.md | 105 - .../p5/p5-results/p5-close-codex-review.md | 234 - .../notes/p5/p5-results/s1-review-v1.md | 519 -- docs/archive/notes/p5/p5-results/s1-v1.md | 513 -- docs/archive/notes/p5/p5-results/s1-v2.md | 130 - docs/archive/notes/p5/p5-results/s1-v3.md | 317 -- .../notes/p5/p5-results/t1-review-v1.md | 369 -- docs/archive/notes/p5/p5-results/t1-v1.md | 517 -- docs/archive/notes/p5/p5-results/t1-v2.md | 259 - .../notes/p5/p5-results/v1-codex-review.md | 172 - .../notes/p5/p5-results/v1-codex-verify.md | 521 -- .../notes/p5/p5-results/v1-review-v1.md | 453 -- .../notes/p5/p5-results/v1-review-v2.md | 745 --- docs/archive/notes/p5/p5-results/v1-v1.md | 407 -- docs/archive/notes/p5/p5-results/v1-v2.md | 251 - docs/archive/notes/p5/p5-results/v1-v3.md | 449 -- .../notes/p5/p5-results/w1-review-v1.md | 423 -- docs/archive/notes/p5/p5-results/w1-v1.md | 512 -- docs/archive/notes/p5/p5-results/w1-v2.md | 364 -- .../notes/p5/p5-results/wave1-codex-review.md | 125 - .../notes/p5/p5-results/wave1-codex-verify.md | 669 --- docs/archive/notes/p5/p5-results/x2-v1.md | 398 -- docs/archive/notes/p5/p5-results/x2m-v1.md | 73 - docs/archive/notes/p5/prompts/c1-round1.md | 34 - docs/archive/notes/p5/prompts/v1-round1.md | 34 - .../p5/scout-backend-install-and-thread.md | 601 --- .../notes/p5/scout-caps-reply-reverse.md | 661 --- ...cout-gpu-writes-and-persistent-map-push.md | 588 -- docs/archive/notes/p5/scout-premortem.md | 580 -- .../notes/p5/scout-test-ci-plumbing.md | 525 -- docs/archive/notes/p5/scout-transport.md | 387 -- .../notes/p5/scout-unmigrated-census.md | 549 -- docs/archive/notes/p5/scout-wire-codec.md | 603 --- docs/archive/notes/p5/verb-census.md | 173 - docs/archive/notes/p5b/BRIEF-P5B.md | 88 - docs/archive/notes/p5b/PACKAGE-PREAMBLE.md | 101 - docs/archive/notes/p5b/README.md | 150 - .../notes/p5b/p5b-results/blit-codex-v1.md | 25 - docs/archive/notes/p5b/p5b-results/c0b-v1.md | 278 - .../p5b-results/codex-apk-redmi-runner-v1.md | 87 - .../notes/p5b/p5b-results/d1-codex-v1.md | 124 - .../notes/p5b/p5b-results/docs-codex-v1.md | 26 - .../p5b/p5b-results/docs-final-codex-v1.md | 18 - docs/archive/notes/p5b/p5b-results/f1-v1.md | 144 - docs/archive/notes/p5b/p5b-results/i1-v1.md | 299 -- .../p5b/p5b-results/indexspan-codex-v1.md | 9 - .../notes/p5b/p5b-results/joint-codex-v1.md | 175 - .../notes/p5b/p5b-results/mip-codex-v1.md | 53 - .../p5b/p5b-results/p5b-close-codex-review.md | 195 - .../notes/p5b/p5b-results/r1-codex-v1.md | 76 - docs/archive/notes/p5b/p5b-results/r2-v1.md | 119 - .../notes/p5b/p5b-results/sync-codex-v1.md | 53 - .../notes/p5b/p5b-results/t2-codex-v1.md | 200 - .../notes/p5b/p5b-results/wait-codex-v1.md | 34 - docs/archive/notes/p5c/BRIEF-p5c-audit.md | 42 - docs/archive/notes/p5c/README.md | 114 - docs/archive/notes/p5c/p5c-audit-v1.md | 204 - docs/archive/notes/p5d/BRIEF-P5D-R3.md | 237 - .../notes/p5d/P5D-INPROC-PERFORMANCE.md | 90 - docs/archive/notes/p5d/README.md | 54 - docs/archive/notes/p5d/RESULTS-P5D-R3.md | 66 - docs/archive/notes/p5d/reports/B.md | 188 - docs/archive/notes/p5d/reports/C.md | 250 - docs/archive/notes/p5d/reports/D.md | 222 - .../p5d/reports/E-lockstep-feasibility.md | 288 - docs/archive/notes/p5d/reports/T.md | 286 - docs/archive/notes/p5e/BRIEF-P5E.md | 322 -- docs/archive/notes/p5e/CONTRACT-P5E-draft.md | 500 -- docs/archive/notes/p5e/FACTS-P5E.md | 207 - docs/archive/notes/p5e/FLIP-CHECKLIST.md | 92 - .../notes/p5e/INTEGRATOR-DECISIONS-P5E.md | 64 - docs/archive/notes/p5e/KIMI-AUDIT-P5E.md | 57 - docs/archive/notes/p5e/KIMI-DEVICE-VERIFY.md | 130 - docs/archive/notes/p5e/P5E-RUNAHEAD.md | 198 - .../archive/notes/p5e/PACKAGE-PREAMBLE-P5E.md | 67 - .../notes/p5e/PERF-BASELINE-7c6f6886.md | 112 - docs/archive/notes/p5e/PERF-CORRECTION.md | 47 - docs/archive/notes/p5e/PERF-NEXT-TARGETS.md | 42 - .../notes/p5e/PERF-PROFILE-7c6f6886.md | 145 - .../notes/p5e/PREAMBLE-ADDENDUM-WAVE3.md | 98 - docs/archive/notes/p5e/README.md | 193 - docs/archive/notes/p5e/SCOUT-P5E.md | 192 - .../notes/p5e/STRICT-BASELINE-2fde7034.md | 37 - docs/archive/notes/p5e/STRICT-WORKLIST.md | 95 - docs/archive/notes/p5e/TASK-c0e.md | 65 - docs/archive/notes/p5e/TASK-fb.md | 71 - docs/archive/notes/p5e/TASK-gl.md | 202 - docs/archive/notes/p5e/TASK-id.md | 59 - docs/archive/notes/p5e/TASK-mv.md | 103 - docs/archive/notes/p5e/TASK-pa.md | 164 - docs/archive/notes/p5e/TASK-pg.md | 67 - docs/archive/notes/p5e/TASK-ra.md | 70 - docs/archive/notes/p5e/TASK-ra2.md | 119 - docs/archive/notes/p5e/TASK-sb.md | 82 - docs/archive/notes/p5e/TASK-tx2.md | 74 - docs/archive/notes/p5e/TASK-vi.md | 69 - docs/archive/notes/p5e/WAVE3-CENSUS.md | 60 - docs/archive/notes/p5e/kimi-audit.md | 254 - docs/archive/notes/p5e/reports/c0e-v1.md | 192 - .../p5e/reports/device-verify-3cc4e1ec.md | 60 - docs/archive/notes/p5e/reports/fb-v1.md | 215 - docs/archive/notes/p5e/reports/fix1-v1.md | 256 - docs/archive/notes/p5e/reports/gl-v1.md | 264 - docs/archive/notes/p5e/reports/id-v1.md | 215 - docs/archive/notes/p5e/reports/mv-v1.md | 237 - docs/archive/notes/p5e/reports/pa-v1.md | 234 - docs/archive/notes/p5e/reports/pg-v1.md | 198 - docs/archive/notes/p5e/reports/ra-v1.md | 200 - docs/archive/notes/p5e/reports/ra2-v1.md | 394 -- docs/archive/notes/p5e/reports/sb-v1.md | 213 - docs/archive/notes/p5e/reports/tx2-v1.md | 213 - docs/archive/notes/p5e/reports/vi-v1.md | 235 - docs/archive/notes/p5e/scout-S1.md | 239 - docs/archive/notes/p5e/scout-S2.md | 250 - docs/archive/notes/p5e/scout-S3.md | 250 - docs/archive/notes/p5e/scout-S4.md | 246 - docs/archive/notes/p5e/scout-S5.md | 250 - docs/archive/notes/p5e/scout-S6.md | 107 - docs/archive/notes/p5e/scout-S7.md | 226 - .../notes/p5f/HANDOFF-CI-INPROC-20260920.md | 203 - docs/archive/notes/p5f/HANDOFF-P5F.md | 80 - .../notes/p5f/P5F-WIRE-COMPLETENESS.md | 302 -- docs/archive/notes/p5f/README.md | 61 - docs/archive/notes/p5f/close-report.md | 115 - docs/archive/notes/p5f/close-review.md | 78 - docs/archive/notes/p5f/device-report.md | 64 - docs/archive/notes/p5f/f0-dualblock-recon.md | 428 -- docs/archive/notes/p5f/f0-egl.md | 228 - docs/archive/notes/p5f/f0-env.md | 309 -- docs/archive/notes/p5f/f0-fields.md | 408 -- docs/archive/notes/p5f/f0-magma.md | 175 - docs/archive/notes/p5f/f0-registry.md | 225 - docs/archive/notes/p5f/f0-reverse-channel.md | 259 - docs/archive/notes/p5f/f0-statics.md | 305 -- docs/archive/notes/p5f/f1-report.md | 186 - docs/archive/notes/p5f/fc-contract-draft.md | 104 - docs/archive/notes/p5f/fc-report.md | 161 - docs/archive/notes/p5f/fcl-e2e-report.md | 95 - docs/archive/notes/p5f/fe-report.md | 164 - docs/archive/notes/p5f/fm-report.md | 161 - docs/archive/notes/p5f/fr-report.md | 90 - docs/archive/notes/p5f/fs-report.md | 135 - docs/archive/notes/p5f/fv-report.md | 86 - docs/archive/notes/p5f/magma-inproc-fix.md | 108 - .../notes/p5f/magma-rd32-performance-fix.json | 163 - .../notes/p5f/magma-rd32-performance-fix.md | 105 - docs/archive/notes/p5f/magma-runahead.md | 142 - docs/archive/notes/p5f/rd32-fourway.json | 594 --- docs/archive/notes/p5f/rd32-fourway.md | 85 - docs/archive/notes/p5f/wave2-report.md | 96 - docs/archive/notes/p6/P6-CONTRACT-DRAFT.md | 222 - docs/archive/notes/p6/P6-ENDSTATE-REVIEW.md | 406 -- docs/archive/notes/p6/P6-SPAWN-PLAN.md | 126 - docs/archive/notes/p6/README.md | 378 -- docs/archive/notes/p6/a6-audit-rows.md | 336 -- docs/archive/notes/p6/a6-audit-v1.md | 270 - .../notes/p6/a6-link-experiment-data.md | 249 - docs/archive/notes/p6/a6-link-experiment.md | 227 - docs/archive/notes/p6/census-classC.md | 150 - .../notes/p6/docs-closeout-measurements.md | 122 - .../notes/p6/docs-closeout-progress.md | 213 - .../archive/notes/p6/docs-closeout-roadmap.md | 181 - docs/archive/notes/p6/gate7-device-ab.md | 512 -- .../archive/notes/p6/gate8-doorbell-device.md | 333 -- docs/archive/notes/p6/gate8-wire-counters.md | 911 ---- docs/archive/notes/p6/git-worktree-fix.md | 337 -- docs/archive/notes/p6/lk-itemisation.md | 104 - docs/archive/notes/p65/README.md | 187 - .../archive/notes/p65/code-review-findings.md | 48 - .../notes/p65/data-link-implementation.md | 57 - docs/archive/notes/p65/evidence-index.md | 83 - .../notes/p65/mainmenu-trace-difference.md | 141 - docs/archive/notes/p65/peer-loss-probe.md | 60 - docs/archive/notes/p65/performance.md | 184 - docs/archive/notes/p65/validation-status.md | 290 - docs/archive/notes/p65/window-1b-p7w5.md | 50 - docs/archive/notes/p65/window-1b-p7w6.md | 62 - docs/archive/notes/p65/wire-and-validation.md | 143 - docs/archive/notes/p7/HANDOFF-2026-09-22.md | 79 - docs/archive/notes/p7/HANDOFF-2026-09-23.md | 22 - .../notes/p7/INTEGRATOR-DECISIONS-P7.md | 69 - docs/archive/notes/p7/PLAN-PH-P34B-P7.md | 150 - docs/archive/notes/p7/README.md | 120 - .../notes/p7/device-window-1-runbook.md | 608 --- .../p7/device-window-1/00-session/README.md | 29 - .../00-session/apk-install.txt | 4 - .../00-session/apk-p7w2-install.txt | 2 - .../00-session/apk-p7w2.sha256 | 1 - .../p7/device-window-1/00-session/apk.sha256 | 1 - .../00-session/boot-id-after.txt | 1 - .../00-session/boot-id-before.txt | 1 - .../00-session/deviceidle-before.txt | 1 - .../deviceidle-whitelist-before.txt | 0 .../device-window-1/00-session/packages.txt | 1 - .../00-session/pin-check-00.txt | 9 - .../00-session/pin-session-start.txt | 17 - .../p7/device-window-1/CTS-base/README.md | 16 - .../CTS-base/pin-after-dsa.txt | 9 - .../CTS-base/pin-after-packed-pixels.txt | 9 - .../CTS-base/pin-after-shader-image.txt | 9 - .../CTS-base/pin-after-ssbo.txt | 9 - .../CTS-base/pin-after-texture.txt | 9 - .../CTS-base/pin-before-dsa.txt | 9 - .../CTS-base/pin-before-packed-pixels.txt | 9 - .../CTS-base/pin-before-shader-image.txt | 9 - .../CTS-base/pin-before-ssbo.txt | 9 - .../CTS-base/pin-before-texture.txt | 9 - .../p7/device-window-1/CTS-base/preflight.txt | 10 - .../device-window-1/CTS-base/probe-gl46.txt | 701 --- .../device-window-1/CTS-base/report-dsa.json | 388 -- .../device-window-1/CTS-base/report-dsa.txt | 14 - .../CTS-base/report-packed-pixels.json | 4747 ----------------- .../CTS-base/report-packed-pixels.txt | 9 - .../CTS-base/report-shader-image.json | 142 - .../CTS-base/report-shader-image.txt | 14 - .../device-window-1/CTS-base/report-ssbo.json | 139 - .../device-window-1/CTS-base/report-ssbo.txt | 9 - .../CTS-base/report-texture.json | 1071 ---- .../CTS-base/report-texture.txt | 24 - .../p7/device-window-1/CTS-base/run-base.log | 41 - .../CTS-base/runs/dsa/crashed.txt | 0 .../CTS-base/runs/dsa/hung.txt | 0 .../CTS-base/runs/dsa/unrun.txt | 0 .../CTS-base/runs/packed-pixels/crashed.txt | 0 .../CTS-base/runs/packed-pixels/hung.txt | 0 .../CTS-base/runs/packed-pixels/unrun.txt | 0 .../CTS-base/runs/shader-image/crashed.txt | 0 .../CTS-base/runs/shader-image/hung.txt | 0 .../CTS-base/runs/shader-image/unrun.txt | 0 .../CTS-base/runs/ssbo/crashed.txt | 0 .../CTS-base/runs/ssbo/hung.txt | 0 .../CTS-base/runs/ssbo/unrun.txt | 0 .../CTS-base/runs/texture/crashed.txt | 0 .../CTS-base/runs/texture/hung.txt | 0 .../CTS-base/runs/texture/skipped.txt | 1 - .../CTS-base/runs/texture/unrun.txt | 0 .../E0-attribution/E0a-inproc-summary.json | 1153 ---- .../E0-attribution/E0a-inproc-summary.txt | 87 - .../E0-attribution/E0a-inproc.log | 4513 ---------------- .../E0-attribution/E0a-monolith-summary.json | 1255 ----- .../E0-attribution/E0a-monolith-summary.txt | 81 - .../E0-attribution/E0a-monolith.log | 2290 -------- .../E0-attribution/divergent-cases.md | 35 - .../E0-attribution/exclusions.md | 13 - .../E0-attribution/pin-after-inproc.txt | 9 - .../E0-attribution/pin-after-monolith.txt | 9 - .../E0-attribution/pin-before-inproc.txt | 9 - .../E0-attribution/pin-before-monolith.txt | 9 - .../E1-lockstep/E1-summary.json | 163 - .../E1-lockstep/E1-summary.txt | 21 - .../p7/device-window-1/E1-lockstep/E1.log | 2062 ------- .../p7/device-window-1/E1-lockstep/README.md | 17 - .../device-window-1/E1-lockstep/arm-proof.txt | 21 - .../device-window-1/E1-lockstep/pin-after.txt | 9 - .../E1-lockstep/pin-before.txt | 9 - .../E4-segv/E4a-gles-inproc.log | 907 ---- .../E4-segv/E4b-gles-inproc-noblock.log | 454 -- .../p7/device-window-1/E4-segv/README.md | 12 - .../E7-coldcache/E7-cold-monolith.log | 38 - .../E7-coldcache/E7-cold-ra1-1.log | 240 - .../E7-coldcache/E7-cold-ra1-2.log | 240 - .../E7-coldcache/E7-cold-ra1-3.log | 240 - .../E7-coldcache/E8-cold-fif1-1.log | 39 - .../E7-coldcache/E8-cold-fif1-2.log | 240 - .../F1-verify/F1-openra-ra0-summary.json | 85 - .../F1-verify/F1-openra-ra1-summary.json | 85 - .../p7/device-window-1/F1-verify/F1-ra0.log | 513 -- .../p7/device-window-1/F1-verify/F1-ra1.log | 312 -- .../p7/device-window-1/F1-verify/README.md | 36 - .../p7/device-window-1/W4-verify/README.md | 89 - .../W4-verify/apk-p7w4-install.txt | 2 - .../device-window-1/W4-verify/apk-p7w4.sha256 | 1 - .../W4-verify/audit-cold-1.log | 7 - .../W4-verify/audit-cold-2.log | 240 - .../W4-verify/audit-warm-1.log | 240 - .../W4-verify/bsl-mem-inproc.log | 437 -- .../W4-verify/bsl-mem-monolith.log | 38 - .../W4-verify/bsl-mem-spawn.log | 435 -- .../W4-verify/bsl-monolith.log | 38 - .../device-window-1/W4-verify/bsl-spawn.log | 867 --- .../W4-verify/dump-inproc-1.log | 241 - .../W4-verify/dump-inproc-2.log | 241 - .../W4-verify/dump-inproc-3.log | 241 - .../W4-verify/dump-inproc-4.log | 241 - .../W4-verify/dump-monolith-1.log | 36 - .../W4-verify/dump2-inproc-1.log | 241 - .../W4-verify/dump2-inproc-2.log | 241 - .../W4-verify/dump2-inproc-3.log | 241 - .../W4-verify/dump2-spawn-1.log | 241 - .../W4-verify/dump2-spawn-2.log | 241 - .../device-window-1/W4-verify/fif1-cold-1.log | 39 - .../device-window-1/W4-verify/fif1-cold-2.log | 240 - .../p7/device-window-1/W4-verify/fif4-1.log | 240 - .../p7/device-window-1/W4-verify/fif4-2.log | 240 - .../p7/device-window-1/W4-verify/fif4-3.log | 240 - .../p7/device-window-1/W4-verify/fif8-1.log | 240 - .../p7/device-window-1/W4-verify/fif8-2.log | 240 - .../p7/device-window-1/W4-verify/fif8-3.log | 240 - .../device-window-1/W4-verify/iterationt.log | 78 - .../W4-verify/matrix-inproc-summary.json | 1238 ----- .../W4-verify/matrix-inproc-summary.txt | 82 - .../W4-verify/matrix-inproc.log | 2731 ---------- .../W4-verify/openra-cold-1.log | 39 - .../W4-verify/openra-cold-2.log | 240 - .../W4-verify/openra-cold-3.log | 240 - .../W4-verify/plain-cold-4.log | 39 - .../W4-verify/plain-cold-5.log | 240 - .../W4-verify/plain-warm-1.log | 240 - .../p7/device-window-1/W4-verify/spawn-1.log | 238 - .../p7/device-window-1/W4-verify/spawn-2.log | 37 - .../p7/device-window-1/W4-verify/spawn-3.log | 238 - .../W4-verify/stats-audit-warm-1.log | 39 - .../W4-verify/stats-cold-1.log | 39 - .../W4-verify/stats-cold-2.log | 39 - .../W4-verify/stats-lockstep-cold-1.log | 240 - .../W4-verify/stats-warm-1.log | 39 - .../p7/device-window-1/W5-verify/README.md | 35 - .../W5-verify/apk-p7w5-install.txt | 2 - .../device-window-1/W5-verify/apk-p7w5.sha256 | 1 - .../W5-verify/dump-inproc-1.log | 37 - .../W5-verify/dump-inproc-2.log | 37 - .../W5-verify/dump-inproc-3.log | 37 - .../p7/device-window-1/W5-verify/fif8-1.log | 39 - .../p7/device-window-1/W5-verify/fif8-2.log | 39 - .../p7/device-window-1/W5-verify/fif8-3.log | 39 - .../W5-verify/inproc-cold-1.log | 39 - .../W5-verify/inproc-cold-2.log | 39 - .../W5-verify/inproc-cold-3.log | 39 - .../W5-verify/inproc-lock-cold-1.log | 39 - .../W5-verify/inproc-lock-cold-2.log | 39 - .../W5-verify/inproc-lock-cold-3.log | 39 - .../W5-verify/inproc-lock-warm-1.log | 39 - .../W5-verify/inproc-lock-warm-2.log | 39 - .../W5-verify/inproc-lock-warm-3.log | 39 - .../W5-verify/inproc-warm-1.log | 39 - .../W5-verify/inproc-warm-2.log | 39 - .../W5-verify/inproc-warm-3.log | 39 - .../p7/device-window-1/W5-verify/regress.log | 117 - .../W5-verify/spawn-cold-1.log | 39 - .../W5-verify/spawn-cold-2.log | 39 - .../W5-verify/spawn-cold-3.log | 39 - .../W5-verify/spawn-lock-1.log | 39 - .../W5-verify/spawn-lock-2.log | 39 - .../W5-verify/spawn-lock-3.log | 39 - .../W5-verify/spawn-warm-1.log | 39 - .../W5-verify/spawn-warm-2.log | 39 - .../W5-verify/spawn-warm-3.log | 39 - .../p7/device-window-1/W6-verify/README.md | 15 - .../device-window-1/W6-verify/apk-install.txt | 4 - .../device-window-1/W6-verify/apk-p7w6.sha256 | 1 - .../W6-verify/bsl-actual.sha256 | 7 - .../W6-verify/bsl-inproc-summary.txt | 7 - .../W6-verify/bsl-spawn-summary.txt | 7 - .../p7/device-window-1/X1-verify/README.md | 14 - .../X1-verify/X1-dv-inproc.log | 320 -- .../X1-verify/X1-gles-inproc.log | 39 - .../notes/p7/device-window-2/README.md | 29 - .../dry-run/build-p7w7dry-14e1c8b9/apk.sha256 | 1 - .../build-p7w7dry-14e1c8b9/host.sha256 | 3 - .../dry-run/build-p7w7dry-14e1c8b9/lib.sha256 | 2 - .../dry-run/build-p7w7dry-14e1c8b9/timing.tsv | 3 - .../dry-run/dry-p7w6-b-bsl/verdict.txt | 28 - .../dry-p7w6-c-cts-ssbo-dsa/verdict.txt | 18 - .../dry-run/dry-p7w6/apk-install.txt | 5 - .../dry-run/dry-p7w6/apk-on-device.sha256 | 1 - .../dry-run/dry-p7w6/cts-IDENTITY.txt | 8 - .../dry-run/dry-p7w6/cts-arm-proof.txt | 2 - .../dry-run/dry-p7w6/gate3-progress.tsv | 8 - .../dry-run/dry-p7w6/session-found.env | 5 - .../dry-run/dry-p7w6/session-restored.txt | 5 - .../dry-run/dry-p7w6/timing.tsv | 12 - .../dry-run/dry-p7w6/verdict.txt | 39 - .../dry-run/pre-14e1c8b9-cts/IDENTITY.txt | 8 - .../dry-run/pre-14e1c8b9-cts/arm-proof.txt | 2 - .../dry-run/pre-14e1c8b9-cts/attribution.txt | 16 - .../dry-run/pre-14e1c8b9-cts/report-dsa.txt | 17 - .../pre-14e1c8b9-cts/report-packed-pixels.txt | 11 - .../pre-14e1c8b9-cts/report-shader-image.txt | 17 - .../dry-run/pre-14e1c8b9-cts/report-ssbo.txt | 11 - .../pre-14e1c8b9-cts/report-texture.txt | 23 - .../pre-14e1c8b9-cts/runs-dsa-crashed.txt | 1 - .../runs-shader-image-crashed.txt | 1 - .../pre-14e1c8b9-cts/verdict-codex-ruling.txt | 70 - .../pre-14e1c8b9-cts/verdict-contract.txt | 59 - .../dry-run/pre-14e1c8b9-cts/verdict.txt | 42 - .../p7/device-window-2/final-p7w8/timing.tsv | 20 - .../device-window-2/final-p7w8/verdict.json | 3689 ------------- .../p7/device-window-2/final-p7w8/verdict.txt | 140 - .../p7/device-window-2/tools/10-build.sh | 127 - .../p7/device-window-2/tools/20-install.sh | 41 - .../p7/device-window-2/tools/21-preflight.sh | 112 - .../tools/30-gate3-selftest.sh | 175 - .../p7/device-window-2/tools/30-gate3.sh | 202 - .../p7/device-window-2/tools/40-bsl-stats.sh | 125 - .../p7/device-window-2/tools/50-cts-after.sh | 178 - .../tools/60-reduce-selftest-pre14e1c8b9.json | 70 - .../tools/60-reduce-selftest.py | 1279 ----- .../p7/device-window-2/tools/60-reduce.py | 1299 ----- .../p7/device-window-2/tools/90-restore.sh | 64 - .../notes/p7/device-window-2/tools/RUNBOOK.md | 254 - .../notes/p7/device-window-2/tools/detach.sh | 24 - .../p7/device-window-2/tools/dry-run-p7w6.sh | 22 - .../notes/p7/device-window-2/tools/lib.sh | 158 - .../notes/p7/device-window-2/tools/window.sh | 94 - .../device-window-2/window2-p7w7/timing.tsv | 20 - .../device-window-2/window2-p7w7/verdict.json | 2391 --------- .../device-window-2/window2-p7w7/verdict.txt | 130 - docs/archive/notes/p7/f1-caps-placeholder.md | 116 - docs/archive/notes/p7/g5-msrbo.md | 97 - docs/archive/notes/p7/iris-census-1135c664.md | 225 - docs/archive/notes/p7/link-ratchet.md | 230 - docs/archive/notes/p7/magma-a.md | 208 - docs/archive/notes/p7/magma-b.md | 410 -- docs/archive/notes/p7/magma-b2.md | 694 --- docs/archive/notes/p7/magma-b3.md | 747 --- docs/archive/notes/p7/magma-b4.md | 21 - docs/archive/notes/p7/magma-c.md | 423 -- docs/archive/notes/p7/magma-m2.md | 356 -- docs/archive/notes/p7/magma-m3.md | 19 - .../notes/p7/magma-two-process-first-run.md | 372 -- docs/archive/notes/p7/ph-f.md | 322 -- docs/archive/notes/p7/verify-split.md | 371 -- .../notes/p7/x1-persistent-map-segv.md | 169 - docs/archive/notes/p7/x2-caps-flake.md | 95 - docs/archive/notes/p8/A.md | 88 - docs/archive/notes/p8/B.md | 97 - docs/archive/notes/p8/C.md | 102 - docs/archive/notes/p8/D.md | 83 - docs/archive/notes/p8/E.md | 119 - docs/archive/notes/p8/F.md | 58 - .../notes/p8/INTEGRATOR-DECISIONS-P8.md | 2 - docs/archive/notes/p8/MF.md | 79 - docs/archive/notes/p8/PLAN-P8.md | 72 - docs/archive/notes/p8/README.md | 38 - docs/archive/notes/p8/S.md | 47 - docs/archive/notes/p8/SE.md | 131 - docs/archive/notes/p8/SV.md | 75 - docs/archive/notes/p9/HANDOFF-P9.md | 89 - .../notes/p9/INTEGRATOR-DECISIONS-P9.md | 18 - docs/archive/notes/p9/README.md | 27 - .../notes/p9/W1-PACK-BUFFER-READBACK.md | 46 - docs/archive/notes/p9/W2-REMINT.md | 101 - .../notes/perf-five-arm-20260928/README.md | 103 - docs/archive/notes/perf-p14/BENCH.md | 151 - docs/archive/notes/perf-p14/ESTIMATE.md | 79 - docs/archive/notes/perf-p14/HANDOFF.md | 100 - .../notes/perf-p14/NEXT-draw-packet-cache.md | 150 - docs/archive/notes/perf-p14/README.md | 111 - .../archive/notes/perf-p15/DIRTY-MASK-PLAN.md | 197 - docs/archive/notes/perf-p15/HANDOFF.md | 810 --- docs/archive/notes/perf-p15/MONOLITH-DIFF.md | 321 -- docs/archive/notes/perf-p15/PARITY-AUDIT.md | 56 - docs/archive/notes/perf-p15/PARITY-SEED.md | 617 --- docs/archive/notes/perf-p15/PLAN-P15.md | 813 --- docs/archive/notes/perf-p15/PRESENT-WAIT.md | 358 -- docs/archive/notes/perf-p15/SCOREBOARD.md | 287 - docs/archive/notes/perf-p15/WAIT-AUDIT.md | 101 - .../notes/recovered/wf1/final/part1.md | 406 -- .../notes/recovered/wf1/final/part2.md | 403 -- .../notes/recovered/wf1/final/part3.md | 231 - .../notes/recovered/wf1/final/part4.md | 241 - .../notes/recovered/wf2/final/part1.md | 374 -- .../notes/recovered/wf2/final/part2.md | 888 --- .../notes/recovered/wf2/final/part3.md | 320 -- .../notes/recovered/wf2/final/part4.md | 351 -- .../notes/recovered/wf2/final/synth-part1.md | 246 - .../notes/recovered/wf2/final/synth-part2a.md | 456 -- .../notes/recovered/wf2/final/synth-part2b.md | 308 -- .../notes/recovered/wf2/final/synth-part3.md | 249 - .../notes/recovered/wf2/final/synth-part4.md | 274 - .../p0-pipe-skeleton/citations-selftest.md | 7 - .../notes/recovered/wf2/p0-polish-findings.md | 27 - .../notes/recovered/wf3/scout-docs-spec.md | 276 - .../notes/recovered/wf3/scout-include-gate.md | 877 --- .../recovered/wf3/scout-program-artifacts.md | 842 --- .../notes/recovered/wf3/scout-value-types.md | 401 -- .../notes/recovered/wf4/BRIEF-P1.part1.md | 208 - docs/archive/notes/recovered/wf4/part1.md | 116 - docs/archive/notes/recovered/wf4/part2.md | 331 -- docs/archive/notes/recovered/wf4/part3.md | 214 - .../notes/recovered/wf4/scout-docs-spec.md | 428 -- .../wf4/scout-generated-and-config.md | 280 - .../notes/recovered/wf4/scout-test-infra.md | 1023 ---- docs/archive/notes/recovered/wf5/.partC.md | 257 - docs/archive/notes/recovered/wf5/.partD.md | 251 - .../notes/recovered/wf5/BRIEF-P2.full.md | 1215 ----- docs/archive/notes/recovered/wf5/BRIEF-P2.md | 462 -- .../notes/recovered/wf5/BRIEF-P2.replayed.md | 707 --- scripts/check_text_hygiene.py | 65 +- scripts/gen_pipe.py | 2 +- scripts/gen_pipe_field_ownership.py | 2 +- scripts/link_ratchet.py | 4 +- scripts/p4a_untouched_regions.sh | 2 +- .../anland-mobilegl-plasma/.gitattributes | 0 .../anland-mobilegl-plasma/SKILL.md | 12 +- .../reference/README.md | 15 + .../handoff-legacy-mobilegl-unified.md | 0 .../reference}/plan-ahb-dmabuf.md | 0 .../reference}/plan-x11-gpu.md | 0 .../reference}/runbook-plasma.md | 0 .../anland-mobilegl-plasma/reproduce.md | 0 .../scripts/build-android.sh | 8 + .../scripts/chrome-launch.sh | 8 + .../scripts/chrome-recover.sh | 8 + .../scripts/container/kwprep.sh | 8 + .../scripts/container/mgrun | 0 .../anland-mobilegl-plasma/scripts/ct.sh | 8 + .../anland-mobilegl-plasma/scripts/cyc.sh | 8 + .../scripts/desktop-verify.sh | 8 + .../scripts/device/bringup.sh | 8 + .../scripts/device/desktop-reset.sh | 8 + .../scripts/device/desktop-timeline.sh | 8 + .../scripts/device/measure.sh | 8 + .../scripts/device/restart-daemon.sh | 8 + .../scripts/device/run-plasma.sh | 8 + .../scripts/device/status.sh | 8 + .../scripts/device/swap.sh | 8 + .../scripts/device/switch.sh | 8 + .../scripts/device/unlock.sh | 8 + .../scripts/device/x11-measure.sh | 8 + .../anland-mobilegl-plasma/scripts/env.sh | 8 + .../scripts/kwin-recover.sh | 8 + .../scripts/kwin-stage.sh | 8 + .../scripts/probes/cdpmedia.py | 8 + .../scripts/probes/dmahash.c | 58 + .../scripts/probes/gpuprobe.c | 37 +- .../scripts/probes/hangclient.c | 179 +- .../scripts/probes/texfmt.c | 208 + .../scripts/probes/yuvprobe.c | 43 +- .../scripts/push-tools.sh | 8 + .../anland-mobilegl-plasma/scripts/rec.sh | 8 + .../anland-mobilegl-plasma/scripts/shot.sh | 8 + .../scripts/sync-src.sh | 8 + .../anland-mobilegl-plasma/scripts/wsl-all.sh | 8 + .../scripts/wsl-test.sh | 10 +- .../scripts/x11-verify.sh | 12 +- .../anland-mobilegl-plasma/scripts/xbuild.sh | 8 + .../anland-mobilegl-plasma/scripts/xdeploy.sh | 8 + .../scripts/xsysroot/aarch64-arch.cmake | 8 + .../scripts/xsysroot/refresh-sysroot.sh | 8 + ...ase-DirectVulkan-monolith-p7w1-9be62cbc.md | 23 - tools/device_bench/disagg/README.md | 6 +- tools/device_bench/p6/ab_session.py | 6 +- userguide/linux.md | 3 +- 1064 files changed, 1022 insertions(+), 200727 deletions(-) delete mode 100644 .claude/skills/anland-mobilegl-plasma/scripts/probes/dmahash.c delete mode 100644 .claude/skills/anland-mobilegl-plasma/scripts/probes/texfmt.c delete mode 100644 docs/Disaggregated/guide/pin-verification-2026-09-07.md delete mode 100644 docs/MobileVA/plan.md delete mode 100644 docs/Performance/glmark2-handoff.md delete mode 100644 docs/archive/README.md delete mode 100644 docs/archive/contracts/CONTRACT-MAGMA-RUNAHEAD.md delete mode 100644 docs/archive/contracts/CONTRACT-P10.md delete mode 100644 docs/archive/contracts/CONTRACT-P11.md delete mode 100644 docs/archive/contracts/CONTRACT-P12.md delete mode 100644 docs/archive/contracts/CONTRACT-P5.md delete mode 100644 docs/archive/contracts/CONTRACT-P5B.md delete mode 100644 docs/archive/contracts/CONTRACT-P5C.md delete mode 100644 docs/archive/contracts/CONTRACT-P5E.md delete mode 100644 docs/archive/contracts/CONTRACT-P6.md delete mode 100644 docs/archive/contracts/CONTRACT-P65.md delete mode 100644 docs/archive/contracts/CONTRACT-P7.md delete mode 100644 docs/archive/contracts/CONTRACT-P8.md delete mode 100644 docs/archive/contracts/CONTRACT-P9.md delete mode 100644 docs/archive/notes/README.md delete mode 100644 docs/archive/notes/anland/README.md delete mode 100644 docs/archive/notes/anland/brief-anland.md delete mode 100644 docs/archive/notes/anland/brief-mobilegl.md delete mode 100644 docs/archive/notes/anland/changes-for-d1100-mali.md delete mode 100644 docs/archive/notes/anland/kgsl-as-server.md delete mode 100644 docs/archive/notes/anland/report-anland.md delete mode 100644 docs/archive/notes/anland/report-mobilegl.md delete mode 100644 docs/archive/notes/handoff/review-b3r3-b2r4.md delete mode 100644 docs/archive/notes/handoff/review-b4.md delete mode 100644 docs/archive/notes/handoff/review-f-fix.md delete mode 100644 docs/archive/notes/handoff/review-f2.md delete mode 100644 docs/archive/notes/handoff/review-g5.md delete mode 100644 docs/archive/notes/handoff/review-m2-r2.md delete mode 100644 docs/archive/notes/handoff/review-m3.md delete mode 100644 docs/archive/notes/handoff/review-p7-closeout-codex.md delete mode 100644 docs/archive/notes/handoff/review-ratchet88.md delete mode 100644 docs/archive/notes/handoff/review-v1-fix-r2.md delete mode 100644 docs/archive/notes/p0/BRIEF-DOCS.md delete mode 100644 docs/archive/notes/p0/BRIEF-P0.md delete mode 100644 docs/archive/notes/p0/README.md delete mode 100644 docs/archive/notes/p0/p0-device-findings.md delete mode 100644 docs/archive/notes/p05/BRIEF-P05.md delete mode 100644 docs/archive/notes/p05/README.md delete mode 100644 docs/archive/notes/p05/p05-results/include-gate-review-v1.md delete mode 100644 docs/archive/notes/p05/p05-results/include-gate-v1.md delete mode 100644 docs/archive/notes/p05/p05-results/program-artifacts-review-v1.md delete mode 100644 docs/archive/notes/p05/p05-results/program-artifacts-v1.md delete mode 100644 docs/archive/notes/p05/p05-results/value-types-review-v1.md delete mode 100644 docs/archive/notes/p05/p05-results/value-types-v1.md delete mode 100644 docs/archive/notes/p1/BRIEF-P1.md delete mode 100644 docs/archive/notes/p1/P1-LANE-FINDINGS.md delete mode 100644 docs/archive/notes/p1/README.md delete mode 100644 docs/archive/notes/p1/p1-results/core-contract.md delete mode 100644 docs/archive/notes/p1/p1-results/core-review-v1.md delete mode 100644 docs/archive/notes/p1/p1-results/core-review-v2.md delete mode 100644 docs/archive/notes/p1/p1-results/core-review-v3.md delete mode 100644 docs/archive/notes/p1/p1-results/core-v1.md delete mode 100644 docs/archive/notes/p1/p1-results/core-v2.md delete mode 100644 docs/archive/notes/p1/p1-results/core-v3.md delete mode 100644 docs/archive/notes/p1/p1-results/espryt-review-v1.md delete mode 100644 docs/archive/notes/p1/p1-results/espryt-v1.md delete mode 100644 docs/archive/notes/p1/p1-results/fix-core-review-v1.md delete mode 100644 docs/archive/notes/p1/p1-results/fix-core-v1.md delete mode 100644 docs/archive/notes/p1/p1-results/fix-tests-review-v1.md delete mode 100644 docs/archive/notes/p1/p1-results/fix-tests-v1.md delete mode 100644 docs/archive/notes/p1/p1-results/magma-review-v1.md delete mode 100644 docs/archive/notes/p1/p1-results/magma-v1.md delete mode 100644 docs/archive/notes/p1/p1-results/verify-review-v1.md delete mode 100644 docs/archive/notes/p1/p1-results/verify-review-v2.md delete mode 100644 docs/archive/notes/p1/p1-results/verify-v1.md delete mode 100644 docs/archive/notes/p1/p1-results/verify-v2.md delete mode 100644 docs/archive/notes/p10/A-FENCE-POLL.md delete mode 100644 docs/archive/notes/p10/C-MEASUREMENTS.md delete mode 100644 docs/archive/notes/p10/INTEGRATOR-DECISIONS-P10.md delete mode 100644 docs/archive/notes/p10/PLAN-P10.md delete mode 100644 docs/archive/notes/p10/README.md delete mode 100644 docs/archive/notes/p11/A-DEVICE.md delete mode 100644 docs/archive/notes/p11/B0-CROSS-APP.md delete mode 100644 docs/archive/notes/p11/B2-DEVICE.md delete mode 100644 docs/archive/notes/p11/HSPIKE.md delete mode 100644 docs/archive/notes/p11/INTEGRATOR-DECISIONS-P11.md delete mode 100644 docs/archive/notes/p11/PLAN-P11.md delete mode 100644 docs/archive/notes/p11/README.md delete mode 100644 docs/archive/notes/p12/BRIEF-onscreen.md delete mode 100644 docs/archive/notes/p12/CREATE-WINDOW-MEASURED.md delete mode 100644 docs/archive/notes/p12/CROSSHOST-ACCEPTANCE.md delete mode 100644 docs/archive/notes/p12/DEVICELOST-AND-UPLOAD-WAITS.md delete mode 100644 docs/archive/notes/p12/FCL-ACCEPTANCE.md delete mode 100644 docs/archive/notes/p12/INTEGRATOR-DECISIONS-P12.md delete mode 100644 docs/archive/notes/p12/PLAN-P12.md delete mode 100644 docs/archive/notes/p12/README.md delete mode 100644 docs/archive/notes/p12/UNPUBLISH-GUARD-SIGNALS.md delete mode 100644 docs/archive/notes/p12/android/build.sh delete mode 100644 docs/archive/notes/p12/android/check1.sh delete mode 100644 docs/archive/notes/p12/android/check3.sh delete mode 100644 docs/archive/notes/p12/android/check4.sh delete mode 100644 docs/archive/notes/p12/android/check5.sh delete mode 100644 docs/archive/notes/p12/android/check7.sh delete mode 100644 docs/archive/notes/p12/android/cleanup.sh delete mode 100644 docs/archive/notes/p12/android/client-devicelost-probe.patch delete mode 100644 docs/archive/notes/p12/android/commit1.sh delete mode 100644 docs/archive/notes/p12/android/commit2.sh delete mode 100644 docs/archive/notes/p12/android/commit3.sh delete mode 100644 docs/archive/notes/p12/android/dev.sh delete mode 100644 docs/archive/notes/p12/android/final-run.sh delete mode 100644 docs/archive/notes/p12/android/g1.sh delete mode 100644 docs/archive/notes/p12/android/host-inproc-server.py delete mode 100644 docs/archive/notes/p12/android/hostkill.sh delete mode 100644 docs/archive/notes/p12/android/hostrepro.sh delete mode 100644 docs/archive/notes/p12/android/launch-build.sh delete mode 100644 docs/archive/notes/p12/android/pidlines.sh delete mode 100644 docs/archive/notes/p12/android/precheck.sh delete mode 100644 docs/archive/notes/p12/android/redonce-tools.sh delete mode 100644 docs/archive/notes/p12/android/redonce-twins.sh delete mode 100644 docs/archive/notes/p12/android/run-tool-tests.sh delete mode 100644 docs/archive/notes/p12/android/sanity-test-append.cpp delete mode 100644 docs/archive/notes/p12/android/show.sh delete mode 100644 docs/archive/notes/p12/android/thumbs.py delete mode 100644 docs/archive/notes/p12/android/verify-apk.sh delete mode 100644 docs/archive/notes/p12/device/00-found-state.txt delete mode 100644 docs/archive/notes/p12/device/1-onscreen-espryt/check.log delete mode 100644 docs/archive/notes/p12/device/1-onscreen-espryt/replay/evidence-during-replay-540p.png delete mode 100644 docs/archive/notes/p12/device/1-onscreen-espryt/replay/evidence-during-replay.png delete mode 100644 docs/archive/notes/p12/device/1-onscreen-espryt/replay/output/result.json delete mode 100644 docs/archive/notes/p12/device/1-onscreen-espryt/tds-start.txt delete mode 100644 docs/archive/notes/p12/device/2-onscreen-magma/check.log delete mode 100644 docs/archive/notes/p12/device/2-onscreen-magma/replay/evidence-during-replay-540p.png delete mode 100644 docs/archive/notes/p12/device/2-onscreen-magma/replay/evidence-during-replay.png delete mode 100644 docs/archive/notes/p12/device/2-onscreen-magma/replay/output/result.json delete mode 100644 docs/archive/notes/p12/device/2-onscreen-magma/second/evidence-during-replay-540p.png delete mode 100644 docs/archive/notes/p12/device/2-onscreen-magma/second/evidence-during-replay.png delete mode 100644 docs/archive/notes/p12/device/2-onscreen-magma/second/output/result.json delete mode 100644 docs/archive/notes/p12/device/2-onscreen-magma/tds-start.txt delete mode 100644 docs/archive/notes/p12/device/3-sequential-and-busy/check.log delete mode 100644 docs/archive/notes/p12/device/3-sequential-and-busy/long/evidence-during-replay-540p.png delete mode 100644 docs/archive/notes/p12/device/3-sequential-and-busy/long/evidence-during-replay.png delete mode 100644 docs/archive/notes/p12/device/3-sequential-and-busy/long/output/result.json delete mode 100644 docs/archive/notes/p12/device/3-sequential-and-busy/second/evidence-during-replay-540p.png delete mode 100644 docs/archive/notes/p12/device/3-sequential-and-busy/second/evidence-during-replay.png delete mode 100644 docs/archive/notes/p12/device/3-sequential-and-busy/second/output/result.json delete mode 100644 docs/archive/notes/p12/device/4-window-lost/after/evidence-during-replay-540p.png delete mode 100644 docs/archive/notes/p12/device/4-window-lost/after/evidence-during-replay.png delete mode 100644 docs/archive/notes/p12/device/4-window-lost/after/output/result.json delete mode 100644 docs/archive/notes/p12/device/4-window-lost/check.log delete mode 100644 docs/archive/notes/p12/device/4-window-lost/tds-restart.txt delete mode 100644 docs/archive/notes/p12/device/5-offscreen-service/check.log delete mode 100644 docs/archive/notes/p12/device/5-offscreen-service/offscreen/output/result.json delete mode 100644 docs/archive/notes/p12/device/5-offscreen-service/ps-after-start.txt delete mode 100644 docs/archive/notes/p12/device/5-offscreen-service/tds-start.txt delete mode 100644 docs/archive/notes/p12/device/6-negative-serverowned-vs-offscreen/check.log delete mode 100644 docs/archive/notes/p12/device/6-negative-serverowned-vs-offscreen/next/output/result.json delete mode 100644 docs/archive/notes/p12/device/6-negative-serverowned-vs-offscreen/ps-end.txt delete mode 100644 docs/archive/notes/p12/device/6-negative-serverowned-vs-offscreen/refused/output/result.json delete mode 100644 docs/archive/notes/p12/device/7-one-server/check.log delete mode 100644 docs/archive/notes/p12/device/7-one-server/ps-after-activity.txt delete mode 100644 docs/archive/notes/p12/device/7-one-server/ps-after-service.txt delete mode 100644 docs/archive/notes/p12/device/7-one-server/ps-before.txt delete mode 100644 docs/archive/notes/p12/device/7-one-server/tds-activity.txt delete mode 100644 docs/archive/notes/p12/device/7-one-server/tds-service2.txt delete mode 100644 docs/archive/notes/p12/device/99-cleanup/final-state.txt delete mode 100644 docs/archive/notes/p12/device/evidence-strip.png delete mode 100644 docs/archive/notes/p12/device/trial-984db455/1-onscreen-espryt/check.log delete mode 100644 docs/archive/notes/p12/device/trial-984db455/1-onscreen-espryt/replay/evidence-during-replay-540p.png delete mode 100644 docs/archive/notes/p12/device/trial-984db455/1-onscreen-espryt/replay/evidence-during-replay.png delete mode 100644 docs/archive/notes/p12/device/trial-984db455/1-onscreen-espryt/replay/output/result.json delete mode 100644 docs/archive/notes/p12/device/trial-984db455/1-onscreen-espryt/tds-start.txt delete mode 100644 docs/archive/notes/p12/device/trial-984db455/3-sequential-and-busy/check.log delete mode 100644 docs/archive/notes/p12/device/trial-984db455/3-sequential-and-busy/second/evidence-during-replay-540p.png delete mode 100644 docs/archive/notes/p12/device/trial-984db455/3-sequential-and-busy/second/evidence-during-replay.png delete mode 100644 docs/archive/notes/p12/device/trial-984db455/3-sequential-and-busy/second/output/result.json delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/1-onscreen-espryt/check.log delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/1-onscreen-espryt/replay/evidence-during-replay-540p.png delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/1-onscreen-espryt/replay/evidence-during-replay.png delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/1-onscreen-espryt/replay/output/result.json delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/1-onscreen-espryt/tds-start.txt delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/2-onscreen-magma/check.log delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/2-onscreen-magma/replay/evidence-during-replay-540p.png delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/2-onscreen-magma/replay/evidence-during-replay.png delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/2-onscreen-magma/replay/output/result.json delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/2-onscreen-magma/tds-start.txt delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/3-sequential-and-busy/check.log delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/3-sequential-and-busy/long/output/result.json delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/3-sequential-and-busy/second/evidence-during-replay-540p.png delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/3-sequential-and-busy/second/evidence-during-replay.png delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/3-sequential-and-busy/second/output/result.json delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/4-window-lost/after/evidence-during-replay-540p.png delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/4-window-lost/after/evidence-during-replay.png delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/4-window-lost/after/output/result.json delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/4-window-lost/check.log delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/4-window-lost/tds-restart.txt delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/5-offscreen-service/check.log delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/5-offscreen-service/offscreen/output/result.json delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/5-offscreen-service/ps-after-start.txt delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/5-offscreen-service/tds-start.txt delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/6-negative-serverowned-vs-offscreen/check.log delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/6-negative-serverowned-vs-offscreen/next/output/result.json delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/6-negative-serverowned-vs-offscreen/ps-end.txt delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/6-negative-serverowned-vs-offscreen/refused/output/result.json delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/7-one-server/check.log delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/7-one-server/ps-after-activity.txt delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/7-one-server/ps-after-service.txt delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/7-one-server/ps-before.txt delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/7-one-server/tds-activity.txt delete mode 100644 docs/archive/notes/p12/device/trial-a4a940db/7-one-server/tds-service2.txt delete mode 100644 docs/archive/notes/p12/fix-icd.sh delete mode 100644 docs/archive/notes/p12/g1-base-names.sh delete mode 100755 docs/archive/notes/p12/gate-container.sh delete mode 100644 docs/archive/notes/p12/gate.sh delete mode 100644 docs/archive/notes/p12/gate/build-29b7b284.log delete mode 100644 docs/archive/notes/p12/gate/build-984db455.log delete mode 100644 docs/archive/notes/p12/gate/build-a4a940db.log delete mode 100644 docs/archive/notes/p12/gate/gate-android1.log delete mode 100644 docs/archive/notes/p12/gate/gate-review-3c342c97.log delete mode 100644 docs/archive/notes/p12/gate/gate-review-d04ac7d1-cmake4.log delete mode 100644 docs/archive/notes/p12/map-apk-process.md delete mode 100644 docs/archive/notes/p12/map-client-surface.md delete mode 100644 docs/archive/notes/p12/map-docs-contract.md delete mode 100644 docs/archive/notes/p12/map-server-surface.md delete mode 100644 docs/archive/notes/p12/p203.sh delete mode 100644 docs/archive/notes/p12/setup-tree.sh delete mode 100644 docs/archive/notes/p13/HANDOFF-2026-10-06.md delete mode 100644 docs/archive/notes/p13/INTEGRATOR-DECISIONS-P13.md delete mode 100644 docs/archive/notes/p13/PLAN-P13.md delete mode 100644 docs/archive/notes/p13/README.md delete mode 100644 docs/archive/notes/p13/W5-DESIGN.md delete mode 100644 docs/archive/notes/p13/W5-INVENTORY.csv delete mode 100644 docs/archive/notes/p13/fcl-soak/README.md delete mode 100644 docs/archive/notes/p13/fcl-soak/run004-magma-ftrace-signal34.txt delete mode 100644 docs/archive/notes/p13/fcl-soak/run004-magma-logcat-excerpt.txt delete mode 100644 docs/archive/notes/p13/fcl-soak/run004-magma-sigcgt-transitions.txt delete mode 100644 docs/archive/notes/p13/fcl-soak/soak-ab-p12-p13-summary.txt delete mode 100644 docs/archive/notes/p13/fcl-soak/soak-p12-control-summary.txt delete mode 100644 docs/archive/notes/p13/fcl-soak/soak-p13-clean-summary.txt delete mode 100644 docs/archive/notes/p13/fcl-soak/soak2.sh delete mode 100644 docs/archive/notes/p13/fcl-soak/soak3.sh delete mode 100644 docs/archive/notes/p13/tools/s3-ops-1.txt delete mode 100644 docs/archive/notes/p13/tools/s3-ops-2.txt delete mode 100644 docs/archive/notes/p13/tools/s3-ops-3.txt delete mode 100644 docs/archive/notes/p13/tools/w5_classify.py delete mode 100644 docs/archive/notes/p13/tools/w5_regate.py delete mode 100644 docs/archive/notes/p13/tools/w5_rewrite.py delete mode 100644 docs/archive/notes/p2/BRIEF-P2.md delete mode 100644 docs/archive/notes/p2/INTEGRATOR-DECISIONS.md delete mode 100644 docs/archive/notes/p2/README.md delete mode 100644 docs/archive/notes/p2/ab/ab-summary-final.md delete mode 100644 docs/archive/notes/p2/ab/ab-summary-interim.md delete mode 100644 docs/archive/notes/p2/ab/ab-summary-xiaomi.md delete mode 100644 docs/archive/notes/p2/ab/ab-summary.md delete mode 100644 docs/archive/notes/p2/bench/driverbench.md delete mode 100644 docs/archive/notes/p2/devices/REPORT.md delete mode 100644 docs/archive/notes/p2/p2-results/contract.md delete mode 100644 docs/archive/notes/p2/p2-results/espryt-review-v1.md delete mode 100644 docs/archive/notes/p2/p2-results/espryt-review-v2.md delete mode 100644 docs/archive/notes/p2/p2-results/espryt-review-v3.md delete mode 100644 docs/archive/notes/p2/p2-results/espryt-review-v4.md delete mode 100644 docs/archive/notes/p2/p2-results/espryt-review-v5.md delete mode 100644 docs/archive/notes/p2/p2-results/espryt-v1.md delete mode 100644 docs/archive/notes/p2/p2-results/espryt-v2.md delete mode 100644 docs/archive/notes/p2/p2-results/espryt-v3.md delete mode 100644 docs/archive/notes/p2/p2-results/espryt-v4.md delete mode 100644 docs/archive/notes/p2/p2-results/espryt-v5.md delete mode 100644 docs/archive/notes/p2/p2-results/fix-aba-review-v1.md delete mode 100644 docs/archive/notes/p2/p2-results/fix-aba-v1.md delete mode 100644 docs/archive/notes/p2/p2-results/fix-aba-v2.md delete mode 100644 docs/archive/notes/p2/p2-results/gates-review-v1.md delete mode 100644 docs/archive/notes/p2/p2-results/gates-review-v2.md delete mode 100644 docs/archive/notes/p2/p2-results/gates-review-v3.md delete mode 100644 docs/archive/notes/p2/p2-results/gates-v1.md delete mode 100644 docs/archive/notes/p2/p2-results/gates-v2.md delete mode 100644 docs/archive/notes/p2/p2-results/gates-v3.md delete mode 100644 docs/archive/notes/p2/p2-results/magma-review-v1.md delete mode 100644 docs/archive/notes/p2/p2-results/magma-review-v2.md delete mode 100644 docs/archive/notes/p2/p2-results/magma-review-v3.md delete mode 100644 docs/archive/notes/p2/p2-results/magma-v1.md delete mode 100644 docs/archive/notes/p2/p2-results/magma-v2.md delete mode 100644 docs/archive/notes/p2/p2-results/magma-v3.md delete mode 100644 docs/archive/notes/p2/p2-results/spans-review-v1.md delete mode 100644 docs/archive/notes/p2/p2-results/spans-review-v2.md delete mode 100644 docs/archive/notes/p2/p2-results/spans-review-v3.md delete mode 100644 docs/archive/notes/p2/p2-results/spans-v1.md delete mode 100644 docs/archive/notes/p2/p2-results/spans-v2.md delete mode 100644 docs/archive/notes/p2/p2-results/spans-v3.md delete mode 100644 docs/archive/notes/p2/p2-results/tracker-review-v1.md delete mode 100644 docs/archive/notes/p2/p2-results/tracker-review-v2.md delete mode 100644 docs/archive/notes/p2/p2-results/tracker-review-v3.md delete mode 100644 docs/archive/notes/p2/p2-results/tracker-review-v4.md delete mode 100644 docs/archive/notes/p2/p2-results/tracker-review-v5.md delete mode 100644 docs/archive/notes/p2/p2-results/tracker-v1.md delete mode 100644 docs/archive/notes/p2/p2-results/tracker-v2.md delete mode 100644 docs/archive/notes/p2/p2-results/tracker-v3.md delete mode 100644 docs/archive/notes/p2/p2-results/tracker-v4.md delete mode 100644 docs/archive/notes/p2/p2-results/tracker-v5.md delete mode 100644 docs/archive/notes/p2/scout-docs-spec.md delete mode 100644 docs/archive/notes/p2/scout-measure-infra.md delete mode 100644 docs/archive/notes/p2/scout-render-state.md delete mode 100644 docs/archive/notes/p2/scout-track-h.md delete mode 100644 docs/archive/notes/p2/scout-tracker.md delete mode 100644 docs/archive/notes/p34b/README.md delete mode 100644 docs/archive/notes/p34b/espryt-d1.md delete mode 100644 docs/archive/notes/p34b/espryt-d2.md delete mode 100644 docs/archive/notes/p34b/espryt-d3.md delete mode 100644 docs/archive/notes/p34b/split-scenario-census.md delete mode 100644 docs/archive/notes/p3a/BRIEF-P3A.md delete mode 100644 docs/archive/notes/p3a/INTEGRATOR-DECISIONS.md delete mode 100644 docs/archive/notes/p3a/README.md delete mode 100644 docs/archive/notes/p3a/ab/ab-summary-oppo.md delete mode 100644 docs/archive/notes/p3a/ab/ab3-final.md delete mode 100644 docs/archive/notes/p3a/ab/ab3-interim.md delete mode 100644 docs/archive/notes/p3a/bench/driverbench.md delete mode 100644 docs/archive/notes/p3a/p3a-results/asan-doublefree-v1.md delete mode 100644 docs/archive/notes/p3a/p3a-results/client-review-v1.md delete mode 100644 docs/archive/notes/p3a/p3a-results/client-v1.md delete mode 100644 docs/archive/notes/p3a/p3a-results/client-v2.md delete mode 100644 docs/archive/notes/p3a/p3a-results/contract-review-v1.md delete mode 100644 docs/archive/notes/p3a/p3a-results/contract-v1.md delete mode 100644 docs/archive/notes/p3a/p3a-results/espryt-review-v1.md delete mode 100644 docs/archive/notes/p3a/p3a-results/espryt-v1.md delete mode 100644 docs/archive/notes/p3a/p3a-results/espryt-v2.md delete mode 100644 docs/archive/notes/p3a/p3a-results/espryt-v3.md delete mode 100644 docs/archive/notes/p3a/p3a-results/exit-order-v1.md delete mode 100644 docs/archive/notes/p3a/p3a-results/final-review-v1.md delete mode 100644 docs/archive/notes/p3a/p3a-results/final-v2.md delete mode 100644 docs/archive/notes/p3a/p3a-results/gates-review-v1.md delete mode 100644 docs/archive/notes/p3a/p3a-results/gates-v1.md delete mode 100644 docs/archive/notes/p3a/p3a-results/gates-v2.md delete mode 100644 docs/archive/notes/p3a/p3a-results/wire-review-v1.md delete mode 100644 docs/archive/notes/p3a/p3a-results/wire-v1.md delete mode 100644 docs/archive/notes/p3a/p3a-results/wire-v2.md delete mode 100644 docs/archive/notes/p3a/scout-docs-spec.md delete mode 100644 docs/archive/notes/p3a/scout-espryt-buffers.md delete mode 100644 docs/archive/notes/p3a/scout-espryt-vao.md delete mode 100644 docs/archive/notes/p3a/scout-pipe-and-tests.md delete mode 100644 docs/archive/notes/p4a/BRIEF-P4A.md delete mode 100644 docs/archive/notes/p4a/INTEGRATOR-DECISIONS.md delete mode 100644 docs/archive/notes/p4a/README.md delete mode 100644 docs/archive/notes/p4a/ab-redmi/three-arm.md delete mode 100644 docs/archive/notes/p4a/ab-redmi/two-arm.md delete mode 100644 docs/archive/notes/p4a/ab/main-two-arm.md delete mode 100644 docs/archive/notes/p4a/ab/prefix-a38bdab4/three-arm-prefix.md delete mode 100644 docs/archive/notes/p4a/ab/prefix-a38bdab4/three-arm-xiaomi.md delete mode 100644 docs/archive/notes/p4a/ab/three-arm-prefix.md delete mode 100644 docs/archive/notes/p4a/ab/three-arm.md delete mode 100644 docs/archive/notes/p4a/bench/driverbench.md delete mode 100644 docs/archive/notes/p4a/p4a-results/clientfb-review-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/clientfb-review-v2.md delete mode 100644 docs/archive/notes/p4a/p4a-results/clientfb-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/clientfb-v2.md delete mode 100644 docs/archive/notes/p4a/p4a-results/clientsp-review-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/clientsp-review-v2.md delete mode 100644 docs/archive/notes/p4a/p4a-results/clientsp-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/clientsp-v2.md delete mode 100644 docs/archive/notes/p4a/p4a-results/clientsp-v3.md delete mode 100644 docs/archive/notes/p4a/p4a-results/contract-review-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/contract-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/contract-v2.md delete mode 100644 docs/archive/notes/p4a/p4a-results/contract-v3.md delete mode 100644 docs/archive/notes/p4a/p4a-results/contract-v4.md delete mode 100644 docs/archive/notes/p4a/p4a-results/contract-v5.md delete mode 100644 docs/archive/notes/p4a/p4a-results/contract-v6.md delete mode 100644 docs/archive/notes/p4a/p4a-results/contract-v7.md delete mode 100644 docs/archive/notes/p4a/p4a-results/esprytdraw-review-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/esprytdraw-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/esprytdraw-v2.md delete mode 100644 docs/archive/notes/p4a/p4a-results/esprytdraw-v3.md delete mode 100644 docs/archive/notes/p4a/p4a-results/esprytobj-review-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/esprytobj-review-v2.md delete mode 100644 docs/archive/notes/p4a/p4a-results/esprytobj-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/esprytobj-v2.md delete mode 100644 docs/archive/notes/p4a/p4a-results/esprytobj-v3.md delete mode 100644 docs/archive/notes/p4a/p4a-results/fable-seam-audit.md delete mode 100644 docs/archive/notes/p4a/p4a-results/fablefix-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/final-review-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/finalfix-v1-logs/p4a-finalfix-gate-symbols.md delete mode 100644 docs/archive/notes/p4a/p4a-results/finalfix-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/gates-review-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/gates-review-v2.md delete mode 100644 docs/archive/notes/p4a/p4a-results/gates-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/gates-v2.md delete mode 100644 docs/archive/notes/p4a/p4a-results/gates-v3.md delete mode 100644 docs/archive/notes/p4a/p4a-results/wire-review-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/wire-review-v2.md delete mode 100644 docs/archive/notes/p4a/p4a-results/wire-v1.md delete mode 100644 docs/archive/notes/p4a/p4a-results/wire-v2.md delete mode 100644 docs/archive/notes/p4a/p4a-results/wire-v3.md delete mode 100644 docs/archive/notes/p4a/scout-docs-spec.md delete mode 100644 docs/archive/notes/p4a/scout-espryt-framebuffer.md delete mode 100644 docs/archive/notes/p4a/scout-espryt-sampler-program.md delete mode 100644 docs/archive/notes/p4a/scout-frontend-state.md delete mode 100644 docs/archive/notes/p4a/scout-pipe-and-client.md delete mode 100644 docs/archive/notes/p5/BRIEF-P5.md delete mode 100644 docs/archive/notes/p5/PACKAGE-PREAMBLE.md delete mode 100644 docs/archive/notes/p5/README.md delete mode 100644 docs/archive/notes/p5/p5-results/ab-v1-tables.md delete mode 100644 docs/archive/notes/p5/p5-results/ab-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/ap-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/apkci-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/b1-review-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/b1-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/b1-v2.md delete mode 100644 docs/archive/notes/p5/p5-results/c0-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/c1-codex-review-v2.md delete mode 100644 docs/archive/notes/p5/p5-results/c1-codex-verify-v2.md delete mode 100644 docs/archive/notes/p5/p5-results/c1-review-v2.md delete mode 100644 docs/archive/notes/p5/p5-results/c1-review-v3.md delete mode 100644 docs/archive/notes/p5/p5-results/c1-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/c1-v2.md delete mode 100644 docs/archive/notes/p5/p5-results/c1-v3.md delete mode 100644 docs/archive/notes/p5/p5-results/c1f-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/c1g-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/dp-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/j0-review-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/j0-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/j0-v2.md delete mode 100644 docs/archive/notes/p5/p5-results/j0-v3.md delete mode 100644 docs/archive/notes/p5/p5-results/joint-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/p1-review-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/p1-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/p1-v2.md delete mode 100644 docs/archive/notes/p5/p5-results/p5-close-codex-review.md delete mode 100644 docs/archive/notes/p5/p5-results/s1-review-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/s1-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/s1-v2.md delete mode 100644 docs/archive/notes/p5/p5-results/s1-v3.md delete mode 100644 docs/archive/notes/p5/p5-results/t1-review-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/t1-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/t1-v2.md delete mode 100644 docs/archive/notes/p5/p5-results/v1-codex-review.md delete mode 100644 docs/archive/notes/p5/p5-results/v1-codex-verify.md delete mode 100644 docs/archive/notes/p5/p5-results/v1-review-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/v1-review-v2.md delete mode 100644 docs/archive/notes/p5/p5-results/v1-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/v1-v2.md delete mode 100644 docs/archive/notes/p5/p5-results/v1-v3.md delete mode 100644 docs/archive/notes/p5/p5-results/w1-review-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/w1-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/w1-v2.md delete mode 100644 docs/archive/notes/p5/p5-results/wave1-codex-review.md delete mode 100644 docs/archive/notes/p5/p5-results/wave1-codex-verify.md delete mode 100644 docs/archive/notes/p5/p5-results/x2-v1.md delete mode 100644 docs/archive/notes/p5/p5-results/x2m-v1.md delete mode 100644 docs/archive/notes/p5/prompts/c1-round1.md delete mode 100644 docs/archive/notes/p5/prompts/v1-round1.md delete mode 100644 docs/archive/notes/p5/scout-backend-install-and-thread.md delete mode 100644 docs/archive/notes/p5/scout-caps-reply-reverse.md delete mode 100644 docs/archive/notes/p5/scout-gpu-writes-and-persistent-map-push.md delete mode 100644 docs/archive/notes/p5/scout-premortem.md delete mode 100644 docs/archive/notes/p5/scout-test-ci-plumbing.md delete mode 100644 docs/archive/notes/p5/scout-transport.md delete mode 100644 docs/archive/notes/p5/scout-unmigrated-census.md delete mode 100644 docs/archive/notes/p5/scout-wire-codec.md delete mode 100644 docs/archive/notes/p5/verb-census.md delete mode 100644 docs/archive/notes/p5b/BRIEF-P5B.md delete mode 100644 docs/archive/notes/p5b/PACKAGE-PREAMBLE.md delete mode 100644 docs/archive/notes/p5b/README.md delete mode 100644 docs/archive/notes/p5b/p5b-results/blit-codex-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/c0b-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/codex-apk-redmi-runner-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/d1-codex-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/docs-codex-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/docs-final-codex-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/f1-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/i1-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/indexspan-codex-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/joint-codex-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/mip-codex-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/p5b-close-codex-review.md delete mode 100644 docs/archive/notes/p5b/p5b-results/r1-codex-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/r2-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/sync-codex-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/t2-codex-v1.md delete mode 100644 docs/archive/notes/p5b/p5b-results/wait-codex-v1.md delete mode 100644 docs/archive/notes/p5c/BRIEF-p5c-audit.md delete mode 100644 docs/archive/notes/p5c/README.md delete mode 100644 docs/archive/notes/p5c/p5c-audit-v1.md delete mode 100644 docs/archive/notes/p5d/BRIEF-P5D-R3.md delete mode 100644 docs/archive/notes/p5d/P5D-INPROC-PERFORMANCE.md delete mode 100644 docs/archive/notes/p5d/README.md delete mode 100644 docs/archive/notes/p5d/RESULTS-P5D-R3.md delete mode 100644 docs/archive/notes/p5d/reports/B.md delete mode 100644 docs/archive/notes/p5d/reports/C.md delete mode 100644 docs/archive/notes/p5d/reports/D.md delete mode 100644 docs/archive/notes/p5d/reports/E-lockstep-feasibility.md delete mode 100644 docs/archive/notes/p5d/reports/T.md delete mode 100644 docs/archive/notes/p5e/BRIEF-P5E.md delete mode 100644 docs/archive/notes/p5e/CONTRACT-P5E-draft.md delete mode 100644 docs/archive/notes/p5e/FACTS-P5E.md delete mode 100644 docs/archive/notes/p5e/FLIP-CHECKLIST.md delete mode 100644 docs/archive/notes/p5e/INTEGRATOR-DECISIONS-P5E.md delete mode 100644 docs/archive/notes/p5e/KIMI-AUDIT-P5E.md delete mode 100644 docs/archive/notes/p5e/KIMI-DEVICE-VERIFY.md delete mode 100644 docs/archive/notes/p5e/P5E-RUNAHEAD.md delete mode 100644 docs/archive/notes/p5e/PACKAGE-PREAMBLE-P5E.md delete mode 100644 docs/archive/notes/p5e/PERF-BASELINE-7c6f6886.md delete mode 100644 docs/archive/notes/p5e/PERF-CORRECTION.md delete mode 100644 docs/archive/notes/p5e/PERF-NEXT-TARGETS.md delete mode 100644 docs/archive/notes/p5e/PERF-PROFILE-7c6f6886.md delete mode 100644 docs/archive/notes/p5e/PREAMBLE-ADDENDUM-WAVE3.md delete mode 100644 docs/archive/notes/p5e/README.md delete mode 100644 docs/archive/notes/p5e/SCOUT-P5E.md delete mode 100644 docs/archive/notes/p5e/STRICT-BASELINE-2fde7034.md delete mode 100644 docs/archive/notes/p5e/STRICT-WORKLIST.md delete mode 100644 docs/archive/notes/p5e/TASK-c0e.md delete mode 100644 docs/archive/notes/p5e/TASK-fb.md delete mode 100644 docs/archive/notes/p5e/TASK-gl.md delete mode 100644 docs/archive/notes/p5e/TASK-id.md delete mode 100644 docs/archive/notes/p5e/TASK-mv.md delete mode 100644 docs/archive/notes/p5e/TASK-pa.md delete mode 100644 docs/archive/notes/p5e/TASK-pg.md delete mode 100644 docs/archive/notes/p5e/TASK-ra.md delete mode 100644 docs/archive/notes/p5e/TASK-ra2.md delete mode 100644 docs/archive/notes/p5e/TASK-sb.md delete mode 100644 docs/archive/notes/p5e/TASK-tx2.md delete mode 100644 docs/archive/notes/p5e/TASK-vi.md delete mode 100644 docs/archive/notes/p5e/WAVE3-CENSUS.md delete mode 100644 docs/archive/notes/p5e/kimi-audit.md delete mode 100644 docs/archive/notes/p5e/reports/c0e-v1.md delete mode 100644 docs/archive/notes/p5e/reports/device-verify-3cc4e1ec.md delete mode 100644 docs/archive/notes/p5e/reports/fb-v1.md delete mode 100644 docs/archive/notes/p5e/reports/fix1-v1.md delete mode 100644 docs/archive/notes/p5e/reports/gl-v1.md delete mode 100644 docs/archive/notes/p5e/reports/id-v1.md delete mode 100644 docs/archive/notes/p5e/reports/mv-v1.md delete mode 100644 docs/archive/notes/p5e/reports/pa-v1.md delete mode 100644 docs/archive/notes/p5e/reports/pg-v1.md delete mode 100644 docs/archive/notes/p5e/reports/ra-v1.md delete mode 100644 docs/archive/notes/p5e/reports/ra2-v1.md delete mode 100644 docs/archive/notes/p5e/reports/sb-v1.md delete mode 100644 docs/archive/notes/p5e/reports/tx2-v1.md delete mode 100644 docs/archive/notes/p5e/reports/vi-v1.md delete mode 100644 docs/archive/notes/p5e/scout-S1.md delete mode 100644 docs/archive/notes/p5e/scout-S2.md delete mode 100644 docs/archive/notes/p5e/scout-S3.md delete mode 100644 docs/archive/notes/p5e/scout-S4.md delete mode 100644 docs/archive/notes/p5e/scout-S5.md delete mode 100644 docs/archive/notes/p5e/scout-S6.md delete mode 100644 docs/archive/notes/p5e/scout-S7.md delete mode 100644 docs/archive/notes/p5f/HANDOFF-CI-INPROC-20260920.md delete mode 100644 docs/archive/notes/p5f/HANDOFF-P5F.md delete mode 100644 docs/archive/notes/p5f/P5F-WIRE-COMPLETENESS.md delete mode 100644 docs/archive/notes/p5f/README.md delete mode 100644 docs/archive/notes/p5f/close-report.md delete mode 100644 docs/archive/notes/p5f/close-review.md delete mode 100644 docs/archive/notes/p5f/device-report.md delete mode 100644 docs/archive/notes/p5f/f0-dualblock-recon.md delete mode 100644 docs/archive/notes/p5f/f0-egl.md delete mode 100644 docs/archive/notes/p5f/f0-env.md delete mode 100644 docs/archive/notes/p5f/f0-fields.md delete mode 100644 docs/archive/notes/p5f/f0-magma.md delete mode 100644 docs/archive/notes/p5f/f0-registry.md delete mode 100644 docs/archive/notes/p5f/f0-reverse-channel.md delete mode 100644 docs/archive/notes/p5f/f0-statics.md delete mode 100644 docs/archive/notes/p5f/f1-report.md delete mode 100644 docs/archive/notes/p5f/fc-contract-draft.md delete mode 100644 docs/archive/notes/p5f/fc-report.md delete mode 100644 docs/archive/notes/p5f/fcl-e2e-report.md delete mode 100644 docs/archive/notes/p5f/fe-report.md delete mode 100644 docs/archive/notes/p5f/fm-report.md delete mode 100644 docs/archive/notes/p5f/fr-report.md delete mode 100644 docs/archive/notes/p5f/fs-report.md delete mode 100644 docs/archive/notes/p5f/fv-report.md delete mode 100644 docs/archive/notes/p5f/magma-inproc-fix.md delete mode 100644 docs/archive/notes/p5f/magma-rd32-performance-fix.json delete mode 100644 docs/archive/notes/p5f/magma-rd32-performance-fix.md delete mode 100644 docs/archive/notes/p5f/magma-runahead.md delete mode 100644 docs/archive/notes/p5f/rd32-fourway.json delete mode 100644 docs/archive/notes/p5f/rd32-fourway.md delete mode 100644 docs/archive/notes/p5f/wave2-report.md delete mode 100644 docs/archive/notes/p6/P6-CONTRACT-DRAFT.md delete mode 100644 docs/archive/notes/p6/P6-ENDSTATE-REVIEW.md delete mode 100644 docs/archive/notes/p6/P6-SPAWN-PLAN.md delete mode 100644 docs/archive/notes/p6/README.md delete mode 100644 docs/archive/notes/p6/a6-audit-rows.md delete mode 100644 docs/archive/notes/p6/a6-audit-v1.md delete mode 100644 docs/archive/notes/p6/a6-link-experiment-data.md delete mode 100644 docs/archive/notes/p6/a6-link-experiment.md delete mode 100644 docs/archive/notes/p6/census-classC.md delete mode 100644 docs/archive/notes/p6/docs-closeout-measurements.md delete mode 100644 docs/archive/notes/p6/docs-closeout-progress.md delete mode 100644 docs/archive/notes/p6/docs-closeout-roadmap.md delete mode 100644 docs/archive/notes/p6/gate7-device-ab.md delete mode 100644 docs/archive/notes/p6/gate8-doorbell-device.md delete mode 100644 docs/archive/notes/p6/gate8-wire-counters.md delete mode 100644 docs/archive/notes/p6/git-worktree-fix.md delete mode 100644 docs/archive/notes/p6/lk-itemisation.md delete mode 100644 docs/archive/notes/p65/README.md delete mode 100644 docs/archive/notes/p65/code-review-findings.md delete mode 100644 docs/archive/notes/p65/data-link-implementation.md delete mode 100644 docs/archive/notes/p65/evidence-index.md delete mode 100644 docs/archive/notes/p65/mainmenu-trace-difference.md delete mode 100644 docs/archive/notes/p65/peer-loss-probe.md delete mode 100644 docs/archive/notes/p65/performance.md delete mode 100644 docs/archive/notes/p65/validation-status.md delete mode 100644 docs/archive/notes/p65/window-1b-p7w5.md delete mode 100644 docs/archive/notes/p65/window-1b-p7w6.md delete mode 100644 docs/archive/notes/p65/wire-and-validation.md delete mode 100644 docs/archive/notes/p7/HANDOFF-2026-09-22.md delete mode 100644 docs/archive/notes/p7/HANDOFF-2026-09-23.md delete mode 100644 docs/archive/notes/p7/INTEGRATOR-DECISIONS-P7.md delete mode 100644 docs/archive/notes/p7/PLAN-PH-P34B-P7.md delete mode 100644 docs/archive/notes/p7/README.md delete mode 100644 docs/archive/notes/p7/device-window-1-runbook.md delete mode 100755 docs/archive/notes/p7/device-window-1/00-session/README.md delete mode 100755 docs/archive/notes/p7/device-window-1/00-session/apk-install.txt delete mode 100755 docs/archive/notes/p7/device-window-1/00-session/apk-p7w2-install.txt delete mode 100755 docs/archive/notes/p7/device-window-1/00-session/apk-p7w2.sha256 delete mode 100755 docs/archive/notes/p7/device-window-1/00-session/apk.sha256 delete mode 100755 docs/archive/notes/p7/device-window-1/00-session/boot-id-after.txt delete mode 100755 docs/archive/notes/p7/device-window-1/00-session/boot-id-before.txt delete mode 100755 docs/archive/notes/p7/device-window-1/00-session/deviceidle-before.txt delete mode 100755 docs/archive/notes/p7/device-window-1/00-session/deviceidle-whitelist-before.txt delete mode 100755 docs/archive/notes/p7/device-window-1/00-session/packages.txt delete mode 100755 docs/archive/notes/p7/device-window-1/00-session/pin-check-00.txt delete mode 100755 docs/archive/notes/p7/device-window-1/00-session/pin-session-start.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/README.md delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/pin-after-dsa.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/pin-after-packed-pixels.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/pin-after-shader-image.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/pin-after-ssbo.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/pin-after-texture.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/pin-before-dsa.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/pin-before-packed-pixels.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/pin-before-shader-image.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/pin-before-ssbo.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/pin-before-texture.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/preflight.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/probe-gl46.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/report-dsa.json delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/report-dsa.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/report-packed-pixels.json delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/report-packed-pixels.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/report-shader-image.json delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/report-shader-image.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/report-ssbo.json delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/report-ssbo.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/report-texture.json delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/report-texture.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/run-base.log delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/dsa/crashed.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/dsa/hung.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/dsa/unrun.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/packed-pixels/crashed.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/packed-pixels/hung.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/packed-pixels/unrun.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/shader-image/crashed.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/shader-image/hung.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/shader-image/unrun.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/ssbo/crashed.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/ssbo/hung.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/ssbo/unrun.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/texture/crashed.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/texture/hung.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/texture/skipped.txt delete mode 100644 docs/archive/notes/p7/device-window-1/CTS-base/runs/texture/unrun.txt delete mode 100755 docs/archive/notes/p7/device-window-1/E0-attribution/E0a-inproc-summary.json delete mode 100755 docs/archive/notes/p7/device-window-1/E0-attribution/E0a-inproc-summary.txt delete mode 100755 docs/archive/notes/p7/device-window-1/E0-attribution/E0a-inproc.log delete mode 100755 docs/archive/notes/p7/device-window-1/E0-attribution/E0a-monolith-summary.json delete mode 100755 docs/archive/notes/p7/device-window-1/E0-attribution/E0a-monolith-summary.txt delete mode 100755 docs/archive/notes/p7/device-window-1/E0-attribution/E0a-monolith.log delete mode 100755 docs/archive/notes/p7/device-window-1/E0-attribution/divergent-cases.md delete mode 100755 docs/archive/notes/p7/device-window-1/E0-attribution/exclusions.md delete mode 100755 docs/archive/notes/p7/device-window-1/E0-attribution/pin-after-inproc.txt delete mode 100755 docs/archive/notes/p7/device-window-1/E0-attribution/pin-after-monolith.txt delete mode 100755 docs/archive/notes/p7/device-window-1/E0-attribution/pin-before-inproc.txt delete mode 100755 docs/archive/notes/p7/device-window-1/E0-attribution/pin-before-monolith.txt delete mode 100755 docs/archive/notes/p7/device-window-1/E1-lockstep/E1-summary.json delete mode 100755 docs/archive/notes/p7/device-window-1/E1-lockstep/E1-summary.txt delete mode 100755 docs/archive/notes/p7/device-window-1/E1-lockstep/E1.log delete mode 100755 docs/archive/notes/p7/device-window-1/E1-lockstep/README.md delete mode 100755 docs/archive/notes/p7/device-window-1/E1-lockstep/arm-proof.txt delete mode 100755 docs/archive/notes/p7/device-window-1/E1-lockstep/pin-after.txt delete mode 100755 docs/archive/notes/p7/device-window-1/E1-lockstep/pin-before.txt delete mode 100755 docs/archive/notes/p7/device-window-1/E4-segv/E4a-gles-inproc.log delete mode 100755 docs/archive/notes/p7/device-window-1/E4-segv/E4b-gles-inproc-noblock.log delete mode 100755 docs/archive/notes/p7/device-window-1/E4-segv/README.md delete mode 100755 docs/archive/notes/p7/device-window-1/E7-coldcache/E7-cold-monolith.log delete mode 100755 docs/archive/notes/p7/device-window-1/E7-coldcache/E7-cold-ra1-1.log delete mode 100755 docs/archive/notes/p7/device-window-1/E7-coldcache/E7-cold-ra1-2.log delete mode 100755 docs/archive/notes/p7/device-window-1/E7-coldcache/E7-cold-ra1-3.log delete mode 100755 docs/archive/notes/p7/device-window-1/E7-coldcache/E8-cold-fif1-1.log delete mode 100755 docs/archive/notes/p7/device-window-1/E7-coldcache/E8-cold-fif1-2.log delete mode 100755 docs/archive/notes/p7/device-window-1/F1-verify/F1-openra-ra0-summary.json delete mode 100755 docs/archive/notes/p7/device-window-1/F1-verify/F1-openra-ra1-summary.json delete mode 100755 docs/archive/notes/p7/device-window-1/F1-verify/F1-ra0.log delete mode 100755 docs/archive/notes/p7/device-window-1/F1-verify/F1-ra1.log delete mode 100755 docs/archive/notes/p7/device-window-1/F1-verify/README.md delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/README.md delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/apk-p7w4-install.txt delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/apk-p7w4.sha256 delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/audit-cold-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/audit-cold-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/audit-warm-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/bsl-mem-inproc.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/bsl-mem-monolith.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/bsl-mem-spawn.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/bsl-monolith.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/bsl-spawn.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/dump-inproc-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/dump-inproc-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/dump-inproc-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/dump-inproc-4.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/dump-monolith-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/dump2-inproc-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/dump2-inproc-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/dump2-inproc-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/dump2-spawn-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/dump2-spawn-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/fif1-cold-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/fif1-cold-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/fif4-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/fif4-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/fif4-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/fif8-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/fif8-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/fif8-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/iterationt.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/matrix-inproc-summary.json delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/matrix-inproc-summary.txt delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/matrix-inproc.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/openra-cold-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/openra-cold-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/openra-cold-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/plain-cold-4.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/plain-cold-5.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/plain-warm-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/spawn-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/spawn-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/spawn-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/stats-audit-warm-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/stats-cold-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/stats-cold-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/stats-lockstep-cold-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W4-verify/stats-warm-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/README.md delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/apk-p7w5-install.txt delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/apk-p7w5.sha256 delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/dump-inproc-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/dump-inproc-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/dump-inproc-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/fif8-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/fif8-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/fif8-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/inproc-cold-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/inproc-cold-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/inproc-cold-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/inproc-lock-cold-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/inproc-lock-cold-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/inproc-lock-cold-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/inproc-lock-warm-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/inproc-lock-warm-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/inproc-lock-warm-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/inproc-warm-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/inproc-warm-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/inproc-warm-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/regress.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/spawn-cold-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/spawn-cold-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/spawn-cold-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/spawn-lock-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/spawn-lock-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/spawn-lock-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/spawn-warm-1.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/spawn-warm-2.log delete mode 100644 docs/archive/notes/p7/device-window-1/W5-verify/spawn-warm-3.log delete mode 100644 docs/archive/notes/p7/device-window-1/W6-verify/README.md delete mode 100644 docs/archive/notes/p7/device-window-1/W6-verify/apk-install.txt delete mode 100644 docs/archive/notes/p7/device-window-1/W6-verify/apk-p7w6.sha256 delete mode 100644 docs/archive/notes/p7/device-window-1/W6-verify/bsl-actual.sha256 delete mode 100644 docs/archive/notes/p7/device-window-1/W6-verify/bsl-inproc-summary.txt delete mode 100644 docs/archive/notes/p7/device-window-1/W6-verify/bsl-spawn-summary.txt delete mode 100755 docs/archive/notes/p7/device-window-1/X1-verify/README.md delete mode 100755 docs/archive/notes/p7/device-window-1/X1-verify/X1-dv-inproc.log delete mode 100755 docs/archive/notes/p7/device-window-1/X1-verify/X1-gles-inproc.log delete mode 100755 docs/archive/notes/p7/device-window-2/README.md delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/build-p7w7dry-14e1c8b9/apk.sha256 delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/build-p7w7dry-14e1c8b9/host.sha256 delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/build-p7w7dry-14e1c8b9/lib.sha256 delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/build-p7w7dry-14e1c8b9/timing.tsv delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/dry-p7w6-b-bsl/verdict.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/dry-p7w6-c-cts-ssbo-dsa/verdict.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/dry-p7w6/apk-install.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/dry-p7w6/apk-on-device.sha256 delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/dry-p7w6/cts-IDENTITY.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/dry-p7w6/cts-arm-proof.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/dry-p7w6/gate3-progress.tsv delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/dry-p7w6/session-found.env delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/dry-p7w6/session-restored.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/dry-p7w6/timing.tsv delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/dry-p7w6/verdict.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/pre-14e1c8b9-cts/IDENTITY.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/pre-14e1c8b9-cts/arm-proof.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/pre-14e1c8b9-cts/attribution.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/pre-14e1c8b9-cts/report-dsa.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/pre-14e1c8b9-cts/report-packed-pixels.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/pre-14e1c8b9-cts/report-shader-image.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/pre-14e1c8b9-cts/report-ssbo.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/pre-14e1c8b9-cts/report-texture.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/pre-14e1c8b9-cts/runs-dsa-crashed.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/pre-14e1c8b9-cts/runs-shader-image-crashed.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/pre-14e1c8b9-cts/verdict-codex-ruling.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/pre-14e1c8b9-cts/verdict-contract.txt delete mode 100644 docs/archive/notes/p7/device-window-2/dry-run/pre-14e1c8b9-cts/verdict.txt delete mode 100644 docs/archive/notes/p7/device-window-2/final-p7w8/timing.tsv delete mode 100644 docs/archive/notes/p7/device-window-2/final-p7w8/verdict.json delete mode 100644 docs/archive/notes/p7/device-window-2/final-p7w8/verdict.txt delete mode 100755 docs/archive/notes/p7/device-window-2/tools/10-build.sh delete mode 100755 docs/archive/notes/p7/device-window-2/tools/20-install.sh delete mode 100755 docs/archive/notes/p7/device-window-2/tools/21-preflight.sh delete mode 100755 docs/archive/notes/p7/device-window-2/tools/30-gate3-selftest.sh delete mode 100755 docs/archive/notes/p7/device-window-2/tools/30-gate3.sh delete mode 100755 docs/archive/notes/p7/device-window-2/tools/40-bsl-stats.sh delete mode 100755 docs/archive/notes/p7/device-window-2/tools/50-cts-after.sh delete mode 100644 docs/archive/notes/p7/device-window-2/tools/60-reduce-selftest-pre14e1c8b9.json delete mode 100644 docs/archive/notes/p7/device-window-2/tools/60-reduce-selftest.py delete mode 100644 docs/archive/notes/p7/device-window-2/tools/60-reduce.py delete mode 100755 docs/archive/notes/p7/device-window-2/tools/90-restore.sh delete mode 100644 docs/archive/notes/p7/device-window-2/tools/RUNBOOK.md delete mode 100755 docs/archive/notes/p7/device-window-2/tools/detach.sh delete mode 100755 docs/archive/notes/p7/device-window-2/tools/dry-run-p7w6.sh delete mode 100755 docs/archive/notes/p7/device-window-2/tools/lib.sh delete mode 100755 docs/archive/notes/p7/device-window-2/tools/window.sh delete mode 100644 docs/archive/notes/p7/device-window-2/window2-p7w7/timing.tsv delete mode 100644 docs/archive/notes/p7/device-window-2/window2-p7w7/verdict.json delete mode 100644 docs/archive/notes/p7/device-window-2/window2-p7w7/verdict.txt delete mode 100644 docs/archive/notes/p7/f1-caps-placeholder.md delete mode 100644 docs/archive/notes/p7/g5-msrbo.md delete mode 100644 docs/archive/notes/p7/iris-census-1135c664.md delete mode 100644 docs/archive/notes/p7/link-ratchet.md delete mode 100644 docs/archive/notes/p7/magma-a.md delete mode 100644 docs/archive/notes/p7/magma-b.md delete mode 100644 docs/archive/notes/p7/magma-b2.md delete mode 100644 docs/archive/notes/p7/magma-b3.md delete mode 100644 docs/archive/notes/p7/magma-b4.md delete mode 100644 docs/archive/notes/p7/magma-c.md delete mode 100755 docs/archive/notes/p7/magma-m2.md delete mode 100644 docs/archive/notes/p7/magma-m3.md delete mode 100644 docs/archive/notes/p7/magma-two-process-first-run.md delete mode 100644 docs/archive/notes/p7/ph-f.md delete mode 100644 docs/archive/notes/p7/verify-split.md delete mode 100644 docs/archive/notes/p7/x1-persistent-map-segv.md delete mode 100755 docs/archive/notes/p7/x2-caps-flake.md delete mode 100644 docs/archive/notes/p8/A.md delete mode 100644 docs/archive/notes/p8/B.md delete mode 100644 docs/archive/notes/p8/C.md delete mode 100644 docs/archive/notes/p8/D.md delete mode 100644 docs/archive/notes/p8/E.md delete mode 100644 docs/archive/notes/p8/F.md delete mode 100644 docs/archive/notes/p8/INTEGRATOR-DECISIONS-P8.md delete mode 100644 docs/archive/notes/p8/MF.md delete mode 100644 docs/archive/notes/p8/PLAN-P8.md delete mode 100644 docs/archive/notes/p8/README.md delete mode 100644 docs/archive/notes/p8/S.md delete mode 100644 docs/archive/notes/p8/SE.md delete mode 100644 docs/archive/notes/p8/SV.md delete mode 100644 docs/archive/notes/p9/HANDOFF-P9.md delete mode 100644 docs/archive/notes/p9/INTEGRATOR-DECISIONS-P9.md delete mode 100644 docs/archive/notes/p9/README.md delete mode 100644 docs/archive/notes/p9/W1-PACK-BUFFER-READBACK.md delete mode 100644 docs/archive/notes/p9/W2-REMINT.md delete mode 100644 docs/archive/notes/perf-five-arm-20260928/README.md delete mode 100644 docs/archive/notes/perf-p14/BENCH.md delete mode 100644 docs/archive/notes/perf-p14/ESTIMATE.md delete mode 100644 docs/archive/notes/perf-p14/HANDOFF.md delete mode 100644 docs/archive/notes/perf-p14/NEXT-draw-packet-cache.md delete mode 100644 docs/archive/notes/perf-p14/README.md delete mode 100644 docs/archive/notes/perf-p15/DIRTY-MASK-PLAN.md delete mode 100644 docs/archive/notes/perf-p15/HANDOFF.md delete mode 100644 docs/archive/notes/perf-p15/MONOLITH-DIFF.md delete mode 100644 docs/archive/notes/perf-p15/PARITY-AUDIT.md delete mode 100644 docs/archive/notes/perf-p15/PARITY-SEED.md delete mode 100644 docs/archive/notes/perf-p15/PLAN-P15.md delete mode 100644 docs/archive/notes/perf-p15/PRESENT-WAIT.md delete mode 100644 docs/archive/notes/perf-p15/SCOREBOARD.md delete mode 100644 docs/archive/notes/perf-p15/WAIT-AUDIT.md delete mode 100644 docs/archive/notes/recovered/wf1/final/part1.md delete mode 100644 docs/archive/notes/recovered/wf1/final/part2.md delete mode 100644 docs/archive/notes/recovered/wf1/final/part3.md delete mode 100644 docs/archive/notes/recovered/wf1/final/part4.md delete mode 100644 docs/archive/notes/recovered/wf2/final/part1.md delete mode 100644 docs/archive/notes/recovered/wf2/final/part2.md delete mode 100644 docs/archive/notes/recovered/wf2/final/part3.md delete mode 100644 docs/archive/notes/recovered/wf2/final/part4.md delete mode 100644 docs/archive/notes/recovered/wf2/final/synth-part1.md delete mode 100644 docs/archive/notes/recovered/wf2/final/synth-part2a.md delete mode 100644 docs/archive/notes/recovered/wf2/final/synth-part2b.md delete mode 100644 docs/archive/notes/recovered/wf2/final/synth-part3.md delete mode 100644 docs/archive/notes/recovered/wf2/final/synth-part4.md delete mode 100644 docs/archive/notes/recovered/wf2/p0-pipe-skeleton/citations-selftest.md delete mode 100644 docs/archive/notes/recovered/wf2/p0-polish-findings.md delete mode 100644 docs/archive/notes/recovered/wf3/scout-docs-spec.md delete mode 100644 docs/archive/notes/recovered/wf3/scout-include-gate.md delete mode 100644 docs/archive/notes/recovered/wf3/scout-program-artifacts.md delete mode 100644 docs/archive/notes/recovered/wf3/scout-value-types.md delete mode 100644 docs/archive/notes/recovered/wf4/BRIEF-P1.part1.md delete mode 100644 docs/archive/notes/recovered/wf4/part1.md delete mode 100644 docs/archive/notes/recovered/wf4/part2.md delete mode 100644 docs/archive/notes/recovered/wf4/part3.md delete mode 100644 docs/archive/notes/recovered/wf4/scout-docs-spec.md delete mode 100644 docs/archive/notes/recovered/wf4/scout-generated-and-config.md delete mode 100644 docs/archive/notes/recovered/wf4/scout-test-infra.md delete mode 100644 docs/archive/notes/recovered/wf5/.partC.md delete mode 100644 docs/archive/notes/recovered/wf5/.partD.md delete mode 100644 docs/archive/notes/recovered/wf5/BRIEF-P2.full.md delete mode 100644 docs/archive/notes/recovered/wf5/BRIEF-P2.md delete mode 100644 docs/archive/notes/recovered/wf5/BRIEF-P2.replayed.md rename {.claude/skills => tools}/anland-mobilegl-plasma/.gitattributes (100%) rename {.claude/skills => tools}/anland-mobilegl-plasma/SKILL.md (95%) create mode 100644 tools/anland-mobilegl-plasma/reference/README.md rename {docs/archive/notes/anland => tools/anland-mobilegl-plasma/reference}/handoff-legacy-mobilegl-unified.md (100%) rename {docs/archive/notes/anland => tools/anland-mobilegl-plasma/reference}/plan-ahb-dmabuf.md (100%) rename {docs/archive/notes/anland => tools/anland-mobilegl-plasma/reference}/plan-x11-gpu.md (100%) rename {docs/archive/notes/anland => tools/anland-mobilegl-plasma/reference}/runbook-plasma.md (100%) rename {.claude/skills => tools}/anland-mobilegl-plasma/reproduce.md (100%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/build-android.sh (82%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/chrome-launch.sh (85%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/chrome-recover.sh (95%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/container/kwprep.sh (85%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/container/mgrun (100%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/ct.sh (83%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/cyc.sh (82%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/desktop-verify.sh (92%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/device/bringup.sh (59%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/device/desktop-reset.sh (70%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/device/desktop-timeline.sh (86%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/device/measure.sh (86%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/device/restart-daemon.sh (76%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/device/run-plasma.sh (80%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/device/status.sh (79%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/device/swap.sh (75%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/device/switch.sh (79%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/device/unlock.sh (64%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/device/x11-measure.sh (86%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/env.sh (89%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/kwin-recover.sh (96%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/kwin-stage.sh (90%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/probes/cdpmedia.py (92%) create mode 100644 tools/anland-mobilegl-plasma/scripts/probes/dmahash.c rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/probes/gpuprobe.c (67%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/probes/hangclient.c (54%) create mode 100644 tools/anland-mobilegl-plasma/scripts/probes/texfmt.c rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/probes/yuvprobe.c (92%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/push-tools.sh (78%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/rec.sh (84%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/shot.sh (69%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/sync-src.sh (79%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/wsl-all.sh (65%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/wsl-test.sh (63%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/x11-verify.sh (94%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/xbuild.sh (87%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/xdeploy.sh (93%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/xsysroot/aarch64-arch.cmake (84%) rename {.claude/skills => tools}/anland-mobilegl-plasma/scripts/xsysroot/refresh-sysroot.sh (85%) delete mode 100644 tools/cts/baselines/base-DirectVulkan-monolith-p7w1-9be62cbc.md diff --git a/.claude/skills/anland-mobilegl-plasma/scripts/probes/dmahash.c b/.claude/skills/anland-mobilegl-plasma/scripts/probes/dmahash.c deleted file mode 100644 index 9db8b552..00000000 --- a/.claude/skills/anland-mobilegl-plasma/scripts/probes/dmahash.c +++ /dev/null @@ -1,34 +0,0 @@ -// dmahash : for each dma-buf fd of at least 1 MB, print inode, size and a sampled checksum. -#include -#include -#include -#include -#include -#include -#include -#include - -int main(int argc, char** argv) { - char dir[64]; - snprintf(dir, sizeof dir, "/proc/%s/fd", argv[1]); - DIR* d = opendir(dir); - if (!d) { perror("opendir"); return 1; } - struct dirent* e; - while ((e = readdir(d))) { - char p[128], l[128] = {0}; - snprintf(p, sizeof p, "%s/%s", dir, e->d_name); - if (readlink(p, l, sizeof l - 1) <= 0 || strncmp(l, "/dmabuf", 7) != 0) continue; - int fd = open(p, O_RDONLY); - if (fd < 0) continue; - struct stat st; fstat(fd, &st); - if (st.st_size < (1 << 20)) { close(fd); continue; } - const uint8_t* m = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); - if (m == MAP_FAILED) { printf("fd %s ino %lu mmap failed\n", e->d_name, (unsigned long)st.st_ino); close(fd); continue; } - uint64_t h = 1469598103934665603ull; unsigned nz = 0; - for (off_t i = 0; i < st.st_size; i += 64) { h = (h ^ m[i]) * 1099511628211ull; nz += m[i] != 0; } - printf("fd %s ino %lu size %ld hash %016llx nz %u\n", e->d_name, (unsigned long)st.st_ino, (long)st.st_size, - (unsigned long long)h, nz); - munmap((void*)m, st.st_size); close(fd); - } - return 0; -} diff --git a/.claude/skills/anland-mobilegl-plasma/scripts/probes/texfmt.c b/.claude/skills/anland-mobilegl-plasma/scripts/probes/texfmt.c deleted file mode 100644 index f8ad2152..00000000 --- a/.claude/skills/anland-mobilegl-plasma/scripts/probes/texfmt.c +++ /dev/null @@ -1,95 +0,0 @@ -/* texfmt: does a texture keep its alpha? One opaque red texel and one transparent texel per - * format, sampled across a 64x64 ES3 pbuffer cleared white with SRC_ALPHA blending. Expect the - * left half red and the right half WHITE; a black right half means the alpha was lost. */ -#include -#include -#include -#include -#include -#include -#define P(T, n) T n = (T)eglGetProcAddress(#n) -static const char* vs = "#version 300 es\nlayout(location=0) in vec2 p; out vec2 uv; void main(){uv=p*0.5+0.5; gl_Position=vec4(p,0,1);}"; -static const char* fs = "#version 300 es\nprecision mediump float; uniform sampler2D t; uniform int mode; in vec2 uv; out vec4 o;" - "void main(){vec4 c=texture(t,uv); o = mode==1 ? vec4(1.0,0.0,0.0,c.a) : (mode==2 ? vec4(c.r,0.0,0.0,c.r) : c);}"; -int main(void) { - EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY); eglInitialize(d, 0, 0); eglBindAPI(EGL_OPENGL_ES_API); - EGLint ca[] = {EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_NONE}; - EGLConfig c; EGLint n; eglChooseConfig(d, ca, &c, 1, &n); - EGLint xa[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE}; - EGLContext x = eglCreateContext(d, c, EGL_NO_CONTEXT, xa); - EGLint pa[] = {EGL_WIDTH, 64, EGL_HEIGHT, 64, EGL_NONE}; - EGLSurface s = eglCreatePbufferSurface(d, c, pa); eglMakeCurrent(d, s, s, x); - P(PFNGLCREATESHADERPROC, glCreateShader); P(PFNGLSHADERSOURCEPROC, glShaderSource); P(PFNGLCOMPILESHADERPROC, glCompileShader); - P(PFNGLCREATEPROGRAMPROC, glCreateProgram); P(PFNGLATTACHSHADERPROC, glAttachShader); P(PFNGLLINKPROGRAMPROC, glLinkProgram); - P(PFNGLUSEPROGRAMPROC, glUseProgram); P(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation); P(PFNGLUNIFORM1IPROC, glUniform1i); - P(PFNGLGENBUFFERSPROC, glGenBuffers); P(PFNGLBINDBUFFERPROC, glBindBuffer); P(PFNGLBUFFERDATAPROC, glBufferData); - P(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer); P(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray); - P(PFNGLDRAWARRAYSPROC, glDrawArrays); P(PFNGLCLEARCOLORPROC, glClearColor); P(PFNGLCLEARPROC, glClear); - P(PFNGLREADPIXELSPROC, glReadPixels); P(PFNGLVIEWPORTPROC, glViewport); P(PFNGLGENTEXTURESPROC, glGenTextures); - P(PFNGLBINDTEXTUREPROC, glBindTexture); P(PFNGLTEXIMAGE2DPROC, glTexImage2D); P(PFNGLTEXPARAMETERIPROC, glTexParameteri); - P(PFNGLENABLEPROC, glEnable); P(PFNGLBLENDFUNCPROC, glBlendFunc); P(PFNGLGETERRORPROC, glGetError); - P(PFNGLTEXSTORAGE2DPROC, glTexStorage2D); P(PFNGLTEXSUBIMAGE2DPROC, glTexSubImage2D); P(PFNGLGETSTRINGPROC, glGetString); - printf("GL_VERSION %s\n", glGetString(GL_VERSION)); - printf("BGRA ext: %s\n", strstr((const char*)glGetString(GL_EXTENSIONS), "GL_EXT_texture_format_BGRA8888") ? "yes" : "no"); - GLuint v = glCreateShader(GL_VERTEX_SHADER), f = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(v, 1, &vs, 0); glCompileShader(v); glShaderSource(f, 1, &fs, 0); glCompileShader(f); - GLuint pr = glCreateProgram(); glAttachShader(pr, v); glAttachShader(pr, f); glLinkProgram(pr); glUseProgram(pr); - float q[] = {-1,-1, 1,-1, -1,1, 1,1}; - GLuint vbo; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); - glBufferData(GL_ARRAY_BUFFER, sizeof q, q, GL_STATIC_DRAW); glVertexAttribPointer(0, 2, GL_FLOAT, 0, 0, 0); glEnableVertexAttribArray(0); - GLint lm = glGetUniformLocation(pr, "mode"); - glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - struct { const char* name; GLint ifmt; GLenum fmt; int bpp; int mode; int storage; GLenum sized; unsigned char px[8]; } cases[] = { - {"RGBA/TexImage", GL_RGBA, GL_RGBA, 4, 0, 0, 0, {255,0,0,255, 0,0,0,0}}, - {"BGRA_EXT/TexImage", GL_BGRA_EXT, GL_BGRA_EXT, 4, 0, 0, 0, {0,0,255,255, 0,0,0,0}}, - {"BGRA8_EXT/TexStorage+Sub", 0, GL_BGRA_EXT, 4, 0, 1, GL_BGRA8_EXT, {0,0,255,255, 0,0,0,0}}, - {"RGBA8/TexStorage+Sub", 0, GL_RGBA, 4, 0, 1, GL_RGBA8, {255,0,0,255, 0,0,0,0}}, - {"ALPHA", GL_ALPHA, GL_ALPHA, 1, 1, 0, 0, {255, 0}}, - {"LUMINANCE_ALPHA", GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, 2, 1, 0, 0, {255,255, 0,0}}, - {"R8/TexStorage+Sub", 0, GL_RED, 1, 2, 1, GL_R8, {255, 0}}, - }; - for (unsigned i = 0; i < sizeof cases / sizeof cases[0]; ++i) { - GLuint t; glGenTextures(1, &t); glBindTexture(GL_TEXTURE_2D, t); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - while (glGetError()) {} - if (cases[i].storage) { - glTexStorage2D(GL_TEXTURE_2D, 1, cases[i].sized, 2, 1); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 1, cases[i].fmt, GL_UNSIGNED_BYTE, cases[i].px); - } else { - glTexImage2D(GL_TEXTURE_2D, 0, cases[i].ifmt, 2, 1, 0, cases[i].fmt, GL_UNSIGNED_BYTE, cases[i].px); - } - GLenum err = glGetError(); - glUniform1i(lm, cases[i].mode); - glViewport(0, 0, 64, 64); glClearColor(1, 1, 1, 1); glClear(GL_COLOR_BUFFER_BIT); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - unsigned char l[4], r[4]; - glReadPixels(16, 32, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, l); glReadPixels(48, 32, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, r); - const int ok = l[0] > 200 && l[1] < 60 && l[2] < 60 && r[0] > 200 && r[1] > 200 && r[2] > 200; - printf("%-26s err=0x%04x left=%3d,%3d,%3d right=%3d,%3d,%3d %s\n", cases[i].name, err, l[0], l[1], l[2], r[0], r[1], r[2], ok ? "ok" : "BAD"); - } - /* ANGLE's emulation of ALPHA8 / LUMINANCE_ALPHA8 on a desktop-GL driver: R8 / RG8 + swizzle. */ - P(PFNGLTEXPARAMETERIPROC, glTexParameteri2); - struct { const char* name; GLenum sized, fmt; int bpp; GLint sw[4]; unsigned char px[4]; unsigned char wantL[3], wantR[3]; } sz[] = { - {"R8 swizzled as ALPHA8", GL_R8, GL_RED, 1, {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED}, {255, 0}, {0,0,0}, {255,255,255}}, - {"RG8 swizzled as LUM_ALPHA", GL_RG8, GL_RG, 2, {GL_RED, GL_RED, GL_RED, GL_GREEN}, {255,255, 0,0}, {255,255,255}, {255,255,255}}, - {"RG8 as LUM_ALPHA (lum 0)", GL_RG8, GL_RG, 2, {GL_RED, GL_RED, GL_RED, GL_GREEN}, {0,255, 0,0}, {0,0,0}, {255,255,255}}, - }; - glUniform1i(lm, 0); - for (unsigned i = 0; i < sizeof sz / sizeof sz[0]; ++i) { - GLuint t; glGenTextures(1, &t); glBindTexture(GL_TEXTURE_2D, t); - glTexParameteri2(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri2(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexStorage2D(GL_TEXTURE_2D, 1, sz[i].sized, 2, 1); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 1, sz[i].fmt, GL_UNSIGNED_BYTE, sz[i].px); - glTexParameteri2(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, sz[i].sw[0]); glTexParameteri2(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, sz[i].sw[1]); - glTexParameteri2(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, sz[i].sw[2]); glTexParameteri2(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, sz[i].sw[3]); - GLenum err = glGetError(); - glClearColor(1, 1, 1, 1); glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - unsigned char l[4], r[4]; - glReadPixels(16, 32, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, l); glReadPixels(48, 32, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, r); - int ok = 1; - for (int k = 0; k < 3; ++k) ok = ok && abs(l[k] - sz[i].wantL[k]) < 40 && abs(r[k] - sz[i].wantR[k]) < 40; - printf("%-26s err=0x%04x left=%3d,%3d,%3d right=%3d,%3d,%3d %s\n", sz[i].name, err, l[0], l[1], l[2], r[0], r[1], r[2], ok ? "ok" : "BAD"); - } - return 0; -} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eb3eb6ca..e2deea82 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -78,7 +78,6 @@ Example: - Generated code, only together with a CI step that regenerates it and fails on any difference. - Binary test fixtures. - Not raw logs, and not working papers such as agent briefs, review rounds and drafts. Keep those outside the repository and commit the conclusion: a design-document change, a `DEBTS.md` entry, a measurement under `docs/Performance`. -- `docs/archive/` keeps the planning notes and agent contracts of the disaggregation work as they were. It is frozen: no file there is added, edited or removed. ## Checks @@ -88,7 +87,6 @@ These fail on any violation: - commit messages, as described above; - a new file under `docs/Disaggregated/notes/` or a new `.log` file (moving a file is not adding it); -- any change under `docs/archive/`; - a missing or wrong license header; - a text file that is not UTF-8; - an external project name in a comment; diff --git a/MobileGL/Config.h b/MobileGL/Config.h index 7fb93ae4..01a87bb3 100644 --- a/MobileGL/Config.h +++ b/MobileGL/Config.h @@ -643,7 +643,7 @@ namespace MobileGL::MG_Config { // (WireTables.cpp), half of the stream link's 24-entry answer store. // Measurements: docs/Performance/ipc-create-window.md. Uint32 CreateWindow = 10; - // MOBILEGL_IPC_PBO_READBACK_SYNC (P9 W1, docs/archive/contracts/CONTRACT-P9.md §1): 1 = a glReadPixels + // MOBILEGL_IPC_PBO_READBACK_SYNC (P9 W1 §1): 1 = a glReadPixels // or glGetTexImage into a bound GL_PIXEL_PACK_BUFFER takes the reply-slot form again - // the client waits for the pixels and uploads them into the buffer itself, as before P9. // 0 (default) sends read_pixels_to_buffer / get_texture_image_to_buffer, waits for @@ -651,7 +651,7 @@ namespace MobileGL::MG_Config { // red-once of the wait-count gate (PackBufferReadbackScenario): it must show a reply // wait per read. Uint32 PboReadbackSync = 0; - // MOBILEGL_IPC_POLL_ESCALATE (P10, docs/archive/contracts/CONTRACT-P10.md §1): a glClientWaitSync with a + // MOBILEGL_IPC_POLL_ESCALATE (P10 §1): a glClientWaitSync with a // zero timeout or a glGetSynciv(GL_SYNC_STATUS) is answered by the client from what the // server reported (kEventFenceSignaled) - "signaled" when it has been, "not yet" otherwise // - and only the Nth "not yet" in a row on one fence crosses as a real round trip, so a @@ -677,7 +677,7 @@ namespace MobileGL::MG_Config { // platform and the backend's POST self-test allow it; 0 = never grant it (the session // runs T2 and says so). Read by the server role only; kept through ServerSpawn. Uint32 AllowAdoptT0 = 1; - // MOBILEGL_IPC_RUN_AHEAD (P5e, docs/archive/contracts/CONTRACT-P5E.md §1): 1 = after publishing an + // MOBILEGL_IPC_RUN_AHEAD (P5e §1): 1 = after publishing an // UNBARRIERED record the client returns immediately instead of waiting for its apply. // It is one half of a conjunction and never a switch on its own - the client arms // run-ahead only when the server also publishes kCapRunAheadApply, so on Magma, and on diff --git a/MobileGL/ConfigLoader.cpp b/MobileGL/ConfigLoader.cpp index 6b42d86e..e10c3b91 100644 --- a/MobileGL/ConfigLoader.cpp +++ b/MobileGL/ConfigLoader.cpp @@ -609,7 +609,7 @@ namespace MobileGL::MG_ConfigLoader { ipc.AdoptTier = QueryEnvUint32("MOBILEGL_IPC_ADOPT_TIER", MG_Config::kAdoptTierUnset, 0, 2); // P11 B2: the server's own T0 allow switch (Config.h). ipc.AllowAdoptT0 = QueryEnvUint32("MOBILEGL_IPC_ALLOW_ADOPT_T0", 1, 0, 1); - // P5e (docs/archive/contracts/CONTRACT-P5E.md §1). The wait rule's A/B, parsed here like every + // P5e (§1). The wait rule's A/B, parsed here like every // other IPC knob and armed only where the server publishes kCapRunAheadApply. ipc.RunAhead = QueryEnvUint32("MOBILEGL_IPC_RUN_AHEAD", 1, 0, 1); // ... and forced OFF by the verify harness for BatchWaits' reason, one step further: diff --git a/MobileGL/MG_Backend/BackendRoles.h b/MobileGL/MG_Backend/BackendRoles.h index 3941e753..0a7ddc5e 100644 --- a/MobileGL/MG_Backend/BackendRoles.h +++ b/MobileGL/MG_Backend/BackendRoles.h @@ -61,7 +61,7 @@ namespace MobileGL::MG_Backend { (void)region; return true; } - // IMPLICIT SYNC BY FLUSH (docs/archive/notes/anland/plan-x11-gpu.md): the session + // IMPLICIT SYNC BY FLUSH: the session // on this (the apply) thread ends a frame at a glFlush. Every shared image it used since // its last boundary is published as written and read by one fence of everything it // submitted (SharedImages::ReadTracker::PublishFrameAsWrite), and from now on its first diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLES.h b/MobileGL/MG_Backend/DirectGLES/DirectGLES.h index 74af6ddd..c4f42c5d 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLES.h +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLES.h @@ -516,7 +516,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } // namespace RenderStateImpl #if MOBILEGL_BUILD_DISAGGREGATED - // ---- SHARED IMAGES (docs/archive/notes/anland/plan-ahb-dmabuf.md) ---- + // ---- SHARED IMAGES ---- // // A shared image reaches the driver only through the Android import path: its AHardwareBuffer // becomes an EGLImage (EGL_ANDROID_get_native_client_buffer + EGL_ANDROID_image_native_buffer) diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLESContext.cpp b/MobileGL/MG_Backend/DirectGLES/DirectGLESContext.cpp index deb804cb..59f54515 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLESContext.cpp +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLESContext.cpp @@ -358,7 +358,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // server process has no frontend at all, so pDefaultFramebufferInfo is null there. Gating on // it returned before the post, the client kept Init.cpp's GL_DEPTH32F_STENCIL8 guess for a // D24S8 pbuffer, and a blit into a buffer allocated from that guess lost depth and stencil - // (docs/archive/notes/p8/SE.md). Inproc only passed because client and server share the process. + // Inproc only passed because client and server share the process. if (!g_GLESFuncs.glGetFramebufferAttachmentParameteriv) return; if (!defaultFBOInfo && MG_Pipe::gMGPipeCallbacks.OnSurfaceChanged == nullptr) return; diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLESCopy.cpp b/MobileGL/MG_Backend/DirectGLES/DirectGLESCopy.cpp index a4201d15..9a4171a2 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLESCopy.cpp +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLESCopy.cpp @@ -1458,7 +1458,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // format, not only the redundant-encoding ones this mirror serves, and marks the store // driver-written where it cannot. The store is what answers a split glGetTexImage the // driver refuses to read back (DirectGLESReadback.cpp's store route); every other split - // read of the destination reads the GPU level itself (docs/archive/notes/p8/E.md). + // read of the destination reads the GPU level itself. // // BEHIND #if MOBILEGL_BUILD_DISAGGREGATED so the pull build's code does not move (G1), // and the arm is the TRANSPORT and not the build - build-split runs its unit and @@ -1491,7 +1491,7 @@ namespace MobileGL::MG_Backend::DirectGLES { MGLOG_E_ONCE("%s: source or destination image failed to sync; declining the copy", __func__); return; } - // P8-E (docs/archive/notes/p8/E.md): THE SERVER'S STAGED STORE FOLLOWS THE COPY. Both endpoints are synced, + // P8-E: THE SERVER'S STAGED STORE FOLLOWS THE COPY. Both endpoints are synced, // so every byte the store holds for them is on the driver, and the copy below is a raw // texel-block move - the store makes the same move, which keeps the destination level // answerable from here when the driver will not read it back (ReadTextureImageWire's store diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLESReadback.cpp b/MobileGL/MG_Backend/DirectGLES/DirectGLESReadback.cpp index 4e7b6390..0ab17f7b 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLESReadback.cpp +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLESReadback.cpp @@ -1795,7 +1795,7 @@ namespace MobileGL::MG_Backend::DirectGLES { return width == extent.x() && height == extent.y() && (!layered || depth == extent.z()); } - // P8-E (docs/archive/notes/p8/E.md). MGITEST_ESPRYT_REFUSE_TEXTURE_READBACK_EXTENT=x, READ BY THE SERVER: + // P8-E. MGITEST_ESPRYT_REFUSE_TEXTURE_READBACK_EXTENT=x, READ BY THE SERVER: // a colour level of exactly that extent is treated as one the driver refused to attach - what an // Adreno does for RGB16 and the 16-bit SNORM formats, and what no host driver can be made to do. // Scoped by the extent so the tcp lane's shared supervisor can carry it for the whole lane: only diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLESSharedImage.cpp b/MobileGL/MG_Backend/DirectGLES/DirectGLESSharedImage.cpp index 6b926818..078eaf0d 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLESSharedImage.cpp +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLESSharedImage.cpp @@ -10,7 +10,7 @@ namespace MobileGL::MG_Backend::DirectGLES { #if MOBILEGL_BUILD_DISAGGREGATED - // ---- SHARED IMAGES (DirectGLES.h; docs/archive/notes/anland/plan-ahb-dmabuf.md) ------ + // ---- SHARED IMAGES (DirectGLES.h) ------ namespace SharedImageImpl { #if defined(__ANDROID__) diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.h b/MobileGL/MG_Backend/DirectGLES/Managers.h index bf41a88c..80728968 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.h +++ b/MobileGL/MG_Backend/DirectGLES/Managers.h @@ -1553,7 +1553,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // applier stored, so the answer is the same whichever side resolved it first. Bool BackendUsesNativeBaseInstance(); - // ---- P5e SEAM (docs/archive/contracts/CONTRACT-P5E.md §4.2; declared by c0e, bodied by id/vi) ---- + // ---- P5e SEAM (§4.2; declared by c0e, bodied by id/vi) ---- // // THE VAO TWIN, RESOLVED FROM THE HANDLE THE RECORD CARRIED - MGPipeApplierState:: // BoundVertexElements - instead of from the frontend VertexArrayObject the draw's @@ -1728,7 +1728,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // flag, allocator or pixel-store object participates. P9 W2: a level // the driver does not hold (defined after the last sync) is never read // back, and a readback the driver refuses falls back to the staged - // level when the store covers it (docs/archive/notes/p9/W2-REMINT.md). + // level when the store covers it. void RequireImageBindableStorageByHandle(MG_Pipe::MGPipeHandle res, const MG_Pipe::MGPipeResourceRecord& record); #if MOBILEGL_BUILD_DISAGGREGATED @@ -2051,7 +2051,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // table's answer is an array element and only a GetOrCreate that GROWS the table moves // it, which this function has already done by the time it returns. BackendTextureObject* ResolveTextureTwin(MG_Pipe::MGPipeHandle res); - // ---- P5e SEAM (docs/archive/contracts/CONTRACT-P5E.md §4.2, §5.2; declared by c0e, bodied by + // ---- P5e SEAM (the contract §4.2, §5.2; declared by c0e, bodied by // id/tx2) -------------------------------------------------------------------------- // // EVERY DRAW-PATH TEXTURE ENTRY, BY HANDLE. The caller holds a Texture handle - a @@ -2078,7 +2078,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // glCopyImageSubData passes: it tries FollowCopyImageInStagedStore first and marks the store // itself when that fails. void NoteDriverSideTextureWriteByHandle(MG_Pipe::MGPipeHandle texture, Bool storeFollowsTheWrite = false); - // P8-E (docs/archive/notes/p8/E.md): make glCopyImageSubData's texel-block move in the server's staged + // P8-E: make glCopyImageSubData's texel-block move in the server's staged // store too (StagedTextureStore::FollowCopy), so the destination level's bytes stay its // content. Box in each image's own texel grid. False when the store cannot follow: a cube // map or 1D array endpoint (copy-image puts faces / layers on z, the store does not), a view, @@ -2137,7 +2137,7 @@ namespace MobileGL::MG_Backend::DirectGLES { ~BackendFramebufferObject(); BackendFramebufferObject(const BackendFramebufferObject&) = delete; BackendFramebufferObject& operator=(const BackendFramebufferObject&) = delete; - // P5e SEAM (docs/archive/contracts/CONTRACT-P5E.md §5.4; declared by c0e, bodied by fb): the same + // P5e SEAM (§5.4; declared by c0e, bodied by fb): the same // sync keyed on the framebuffer HANDLE. The record's eleven surfaces ARE the point // set - the emitter refuses a point at or above the wire width - so the attachment // walk needs no frontend FramebufferObject and no m_pushedSyncHandle handshake: the @@ -3126,7 +3126,7 @@ namespace MobileGL::MG_Backend::DirectGLES { }; ImageFormatBakeInputs CollectImageFormatBakeInputs(const ProgramBuildSource& src); - // ---- P5e SEAM (docs/archive/contracts/CONTRACT-P5E.md §4.2, §5.5; declared by c0e, bodied by + // ---- P5e SEAM (the contract §4.2, §5.5; declared by c0e, bodied by // id/pg) --------------------------------------------------------------------------- // // THE PROGRAM TWIN, RESOLVED FROM MGPipeApplierState::DrawProgram / DispatchProgram / diff --git a/MobileGL/MG_Backend/DirectGLES/ManagersBuffers.cpp b/MobileGL/MG_Backend/DirectGLES/ManagersBuffers.cpp index b7b84d44..ff84c27e 100644 --- a/MobileGL/MG_Backend/DirectGLES/ManagersBuffers.cpp +++ b/MobileGL/MG_Backend/DirectGLES/ManagersBuffers.cpp @@ -1727,7 +1727,7 @@ namespace MobileGL::MG_Backend::DirectGLES { const Uint16 uploadTarget = MG_Pipe::MGPipeSubDataUploadTargetOf(record.Target); const IntVec3 extent = MG_Record::StagedTextureUploadExtent(stored->Desc, record); const SizeT runBytes = static_cast(record.Blob.Size); - // P8-E (docs/archive/notes/p8/E.md): THE LEVEL HOLDS A COPY THE CLIENT NEVER SAW + // P8-E: THE LEVEL HOLDS A COPY THE CLIENT NEVER SAW // (FollowCopyImageInStagedStore). The run is the client's shadow, stale everywhere it // did not write, so only the texels it names land - its regions, or its union box // when it carries none (D-D3's "the box is the whole story"). A run the store cannot diff --git a/MobileGL/MG_Backend/DirectGLES/ManagersTextures.cpp b/MobileGL/MG_Backend/DirectGLES/ManagersTextures.cpp index ae1f8b8e..04d531d9 100644 --- a/MobileGL/MG_Backend/DirectGLES/ManagersTextures.cpp +++ b/MobileGL/MG_Backend/DirectGLES/ManagersTextures.cpp @@ -124,7 +124,7 @@ namespace MobileGL::MG_Backend::DirectGLES { m_forceTextureParamsResync = true; return; } - // P9 W2 (docs/archive/notes/p9/W2-REMINT.md): EVERY BYTE THIS RE-MINT REPLAYS IS ALREADY ON THE + // P9 W2: EVERY BYTE THIS RE-MINT REPLAYS IS ALREADY ON THE // SERVER. The GPU image holds what the GPU wrote (render targets, clears, copies, // generated mips, image stores) and the staged store holds what the client uploaded; // the client is never asked, so no pull protocol exists. Reading only the store would @@ -650,7 +650,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } #if MOBILEGL_BUILD_DISAGGREGATED - // SHARED IMAGES (docs/archive/notes/anland/plan-ahb-dmabuf.md). The client defined + // SHARED IMAGES. The client defined // level 0 as WxH RGBA8 with no data and then attached the image; the record's descriptor // still says so, but the texels are the image's, so nothing below may allocate or upload. Bool BackendTextureObject::SyncSharedImageStorage(const MG_Pipe::MGPipeResourceRecord& record) { @@ -1438,7 +1438,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // ===================================================================================== // P5e SEAMS: DECLARED AND REFUSED HERE, BODIED BY THE FAMILY PACKAGES - // (docs/archive/contracts/CONTRACT-P5E.md §4.2; BRIEF-P5E §1's "each such seam is a declared signature + // (the contract §4.2; BRIEF-P5E §1's "each such seam is a declared signature // in c0e so both sides compile from day one") // ===================================================================================== // diff --git a/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp b/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp index b4f6f8e2..2887105a 100644 --- a/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp @@ -73,7 +73,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // (MG_Remote::Client::EmitObjectDeathRecord, CONTRACT-P5C §5.2). // // WHY THAT MATTERS, measured rather than argued (package L's probe, - // docs/archive/notes/p7/magma-two-process-first-run.md §6): under SPAWN the client process has no + // the phase notes §6): under SPAWN the client process has no // DirectVulkan backend at all, so InstallClientWireTables' own emitter already // answered the notice and CtWireScenario's two death cases PASSED. Under INPROC the // server role's backend is a thread of this process, Transport is Split rather than @@ -247,7 +247,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // SPIRV-Reflect rebuild and `ClearProgramResourceCaches`, verbatim; only this build drops // them - and with them the rehash hazard the ordering comment below the block-binding // setter documents. Retiring the pull half is the day the member stops needing its guard, - // which is a G1/P13 decision and not a wave-2 one; recorded in docs/archive/notes/p7/magma-c.md. + // which is a G1/P13 decision and not a wave-2 one; recorded in the phase notes. void ClearProgramResourceCaches() { // Nothing to clear: there is no cache in this build. Kept as an entry point so // BackendObject_DirectVulkan's two EGL-teardown call sites stay statement for diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/UniformManager.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/UniformManager.cpp index 555aef39..96f9ce29 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/UniformManager.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/UniformManager.cpp @@ -844,7 +844,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // is not the answer either: the transient arena carries no // {UNIFORM,STORAGE}_TEXEL_BUFFER usage (VkBufferManager::InitializeTransientArenas), // so no VkBufferView can be made over it, and widening a shared per-frame - // allocation to buy an unreachable path is the wrong trade. See docs/archive/notes/p7/magma-a.md. + // allocation to buy an unreachable path is the wrong trade. See the phase notes. return writable ? false : placeholder(); } VkBufferViewCreateInfo viewInfo{VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO}; @@ -973,7 +973,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // record that is the draw/dispatch tail in VulkanRenderer.cpp / WireDraw.cpp, // which belong to wave-2 packages B and C, not to this file. Losing the // dispatch with a named line in the role log beats returning stale counters - // with no error at all. docs/archive/notes/p7/magma-a.md carries the recipe. + // with no error at all. The phase notes carry the recipe. MGLOG_E_ONCE("ResolveStorageBufferDescriptor: block '%s' is bound at offset %llu, which is not a " "multiple of this device's minStorageBufferOffsetAlignment (%llu); %s ranges cannot be " "expressed as a descriptor and the shader's writes would be dropped by a read-only " @@ -1146,7 +1146,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, and that is a multiple of four on every // device - but GL 4.6 core 6.1.1 puts no such rule on the SIZE, so `copied` is free // to end mid-word and the Redmi Minecraft run lands there - // (docs/archive/notes/p5f/magma-inproc-fix.md #5). An unaligned start is not reachable through + // An unaligned start is not reachable through // the public API and only a protocol-level offset can produce one; the sub-word arm // handles it anyway rather than leaving a second shape to trip over later. Both arms // copy the same bytes to the same place: the sub-word one pays one extra transient diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VertexInputStateFactory.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VertexInputStateFactory.cpp index 158394c6..e2062130 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VertexInputStateFactory.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VertexInputStateFactory.cpp @@ -116,7 +116,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // attribute whose base offsets cannot be added is one Vulkan cannot fetch, the // monolith arm never computes that sum at all, and masking is strictly safer than // a Fatal for a number no application can reach on purpose. Recorded in - // docs/archive/notes/p7/magma-c.md rather than silently reconciled. + // the phase notes rather than silently reconciled. const auto describe = [&](const char* reason, VkFormat format) { MGLOG_E_ONCE("Magma wire vertex layout: %s location=%u type=%u size=%u normalized=%u integer=%u " "long=%u bgra=%u stride=%d offset=%llu format=%d bufferWindow=%u+%u activeMask=0x%x", diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.h index cda4b33d..4f546a09 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.h @@ -585,7 +585,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { void MarkWireTextureGpuWritten(MG_Pipe::MGPipeHandle handle, Uint32 mipLevel, Uint32 baseArrayLayer = 0, Uint32 layerCount = 1); - // SHARED IMAGES (docs/archive/notes/anland/plan-ahb-dmabuf.md): a server shared image's + // SHARED IMAGES: a server shared image's // AHardwareBuffer bound as a single-level 2D colour image on THIS session's device, on dedicated // memory imported from the buffer. Android only (false with `why` elsewhere, or when the device // did not take the AHardwareBuffer extension). The image is born UNDEFINED; whoever uses it diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h index d374047f..d5ca5bd5 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h @@ -651,7 +651,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // and the default draw framebuffer alike. The CAPABILITY decline inside // ResolveWireDepthStencil (a stencil-only resolve without VK_EXT_shader_stencil_export // on a device without VK_KHR_depth_stencil_resolve) is still decided per aspect, after - // colour ran; rule I (a) accepts that (docs/archive/notes/p7/magma-b2.md §2.10). + // colour ran; rule I (a) accepts that (§2.10). Bool DeclineWireDepthStencilResolveShape(const WireImage& source, const WireImage& destination, GLint sx0, GLint sy0, GLint sx1, GLint sy1, GLint dx0, GLint dy0, GLint dx1, GLint dy1); diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/WireFramebuffer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/WireFramebuffer.cpp index 92cf2bb4..81ab7da9 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/WireFramebuffer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/WireFramebuffer.cpp @@ -1439,7 +1439,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // (BlitDepthAcrossFormats, shared with the monolith arm) has no flip either. Both // decline by name, each under its OWN once-site (review round 2: one site covered both, // so after the first X decline a cross-format Y decline logged nothing); §6 in - // docs/archive/notes/p7/magma-b2.md carries them. These are declines of a LEGAL blit - GL would + // the phase notes carries them. These are declines of a LEGAL blit - GL would // raise no error here - so the INVALID_OPERATION is rule I (a)'s named refusal, not // GL's answer. const Bool mirrorX = (spanX < 0) != (dstSpanX < 0); @@ -1715,7 +1715,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // so a shader decline (a stencil aspect without VK_EXT_shader_stencil_export, a format // that is not SAMPLED_IMAGE + DEPTH_STENCIL_ATTACHMENT, a failed pipeline create - // WireMultisampleResolve.cpp) that lands on the render pass is the resolve most likely - // to read back as zeroes with no GL error. A recorded debt (docs/archive/notes/p7/g5-msrbo.md §4). + // to read back as zeroes with no GL error. A recorded debt (§4). if (resolvedByShader) { MGLOG_I_ONCE("DirectVulkan::ResolveWireDepthStencil: resolved by the shader pass " "(prefer-shader=%d, render-pass arm available=%d)", diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/WireSharedImage.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/WireSharedImage.cpp index b2fa4115..e3bf68a7 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/WireSharedImage.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/WireSharedImage.cpp @@ -9,7 +9,7 @@ #include "VulkanRendererInternal.h" namespace MobileGL::MG_Backend::DirectVulkan { - // SHARED IMAGES (docs/archive/notes/anland/plan-ahb-dmabuf.md). The present side's copy is + // SHARED IMAGES. The present side's copy is // WireFramebuffer.cpp's readback, into an image: the same flush, the same write-visibility // barrier, the same transition of the default framebuffer's image. // diff --git a/MobileGL/MG_Backend/Init.cpp b/MobileGL/MG_Backend/Init.cpp index 14e27053..8a66de6a 100644 --- a/MobileGL/MG_Backend/Init.cpp +++ b/MobileGL/MG_Backend/Init.cpp @@ -85,7 +85,7 @@ namespace MobileGL::MG_Backend { // (VkBufferManager::RegisterWireResourceOps, VkBufferManager.cpp): under a transport it // owns buffer stores and claims bit 7 (the P4a mask, see ConsumedSubsystemsFor below); // under monolith it registers none and its buffers keep the legacy BufferBackendOps path. - // P5e (docs/archive/contracts/CONTRACT-P5E.md §6.2). THE ONE CONSTANT THE WHOLE PHASE HANGS ON. + // P5e (§6.2). THE ONE CONSTANT THE WHOLE PHASE HANGS ON. // // kCapRunAheadApply says "this server applies an unbarriered record without reading // client memory". That is only true once EVERY per-draw family reads records instead diff --git a/MobileGL/MG_Backend/Record/RecordVerbSink.cpp b/MobileGL/MG_Backend/Record/RecordVerbSink.cpp index e9d1e28c..5caee8ec 100644 --- a/MobileGL/MG_Backend/Record/RecordVerbSink.cpp +++ b/MobileGL/MG_Backend/Record/RecordVerbSink.cpp @@ -301,7 +301,7 @@ namespace MobileGL::MG_Record { return false; } - // ---- P9 (W1, docs/archive/contracts/CONTRACT-P9.md §1): the pack-buffer readbacks ------------------------ + // ---- P9 (W1 §1): the pack-buffer readbacks ------------------------ // // WHY THE ROWS GO THROUGH THE APPLIER'S BUFFER-WRITE GATE AND NOT THROUGH THE DRIVER'S OWN // PBO READ. Monolith binds the driver buffer as GL_PIXEL_PACK_BUFFER and lets glReadPixels @@ -504,7 +504,7 @@ namespace MobileGL::MG_Record { slot); } - // P5b d1 (docs/archive/contracts/CONTRACT-P5B.md §2 d1): draw_vbo's whole cross product. The record + // P5b d1 (§2 d1): draw_vbo's whole cross product. The record // carries the GL call verbatim (rule D) and this body reproduces the backend call the // monolith makes for that shape, reading only the record and the backend's own // barrier-pulled state; the twenty GL entry points collapse onto the arms below: @@ -815,7 +815,7 @@ namespace MobileGL::MG_Record { } // ----------------------------------------------------------------------------------- - // P5b: the stubs the four migration packages replace (docs/archive/contracts/CONTRACT-P5B.md). + // P5b: the stubs the four migration packages replace. // // Each dies by the GL slot's own name. The record has crossed and been validated by the // codec by the time one of these runs, so the only thing missing is the backend call, and @@ -824,7 +824,7 @@ namespace MobileGL::MG_Record { // in the same words), the call, and a tally the lane can assert moved. // ----------------------------------------------------------------------------------- - // ---- i1 ---- (docs/archive/contracts/CONTRACT-P5B.md §2 i1; landed by package p5b/i1) + // ---- i1 ---- (§2 i1; landed by package p5b/i1) // // RULE D IN FIVE BODIES. Each reproduces the backend call the monolith makes, from the // record and from server state, and NOTHING ELSE: the backend goes on reading the frontend @@ -974,7 +974,7 @@ namespace MobileGL::MG_Record { return true; } - // ---- t2 ---- (docs/archive/contracts/CONTRACT-P5B.md §2 t2) + // ---- t2 ---- (§2 t2) // // SIX BODIES, SIX BACKEND CALLS, NO STATE OF THEIR OWN. Rule D: the record IS the call, and // everything the backend reads around it - the capture program, the capture-buffer diff --git a/MobileGL/MG_Backend/Record/RecordVerbSink.h b/MobileGL/MG_Backend/Record/RecordVerbSink.h index 5df83e43..df201eb8 100644 --- a/MobileGL/MG_Backend/Record/RecordVerbSink.h +++ b/MobileGL/MG_Backend/Record/RecordVerbSink.h @@ -43,7 +43,7 @@ namespace MobileGL::MG_Record { Bool OnDrawVbo(const MG_Pipe::MGPDrawInfo& info, const MG_Pipe::MGPDrawRange* ranges, const MG_Pipe::MGHostSpan* userIndices, const MG_Pipe::MGPDrawIndirect* indirect) override; - // ---- P5b (docs/archive/contracts/CONTRACT-P5B.md): one override per row a migration package owns. + // ---- P5b: one override per row a migration package owns. // At the contract commit EVERY BODY BELOW IS A STUB that dies // Fatal{UnmigratedVerb, ""} by the slot's own name - the same line the client's // class-C table raises and the census greps - so a client flipped ahead of its server diff --git a/MobileGL/MG_Backend/Record/StagedTextureStore.h b/MobileGL/MG_Backend/Record/StagedTextureStore.h index 92578ff7..d71325c6 100644 --- a/MobileGL/MG_Backend/Record/StagedTextureStore.h +++ b/MobileGL/MG_Backend/Record/StagedTextureStore.h @@ -519,7 +519,7 @@ namespace MobileGL::MG_Record { EraseSession(m_driverWritten, session); } - // ---- P8-E (docs/archive/notes/p8/E.md): WHEN THESE BYTES ARE THE LEVEL'S CONTENT ---- + // ---- P8-E: WHEN THESE BYTES ARE THE LEVEL'S CONTENT ---- // // The store holds what the client uploaded. It is also the only CPU copy of a level the // server has, so a readback the driver refuses (a format the ES driver will not attach - diff --git a/MobileGL/MG_Backend/SharedImageTypes.h b/MobileGL/MG_Backend/SharedImageTypes.h index 7dcee460..f0d9babe 100644 --- a/MobileGL/MG_Backend/SharedImageTypes.h +++ b/MobileGL/MG_Backend/SharedImageTypes.h @@ -10,7 +10,7 @@ #include namespace MobileGL::MG_Backend { - // SHARED IMAGES (docs/archive/notes/anland/plan-ahb-dmabuf.md): server-allocated colour + // SHARED IMAGES: server-allocated colour // buffers exported to clients as dma-buf descriptors. // // The server-side view of one image, as a backend sees it: `NativeBuffer` is the image's diff --git a/MobileGL/MG_Gbm/MobileGLGbm.cpp b/MobileGL/MG_Gbm/MobileGLGbm.cpp index 4185175a..c6529be7 100644 --- a/MobileGL/MG_Gbm/MobileGLGbm.cpp +++ b/MobileGL/MG_Gbm/MobileGLGbm.cpp @@ -8,7 +8,7 @@ // mobilegl_gbm.so: a GBM backend (the loader's backend ABI, gbm_backend_abi.h) whose buffer // objects are MobileGL shared images - colour buffers the MobileGL server allocates and exports -// as dma-bufs (docs/archive/notes/anland/plan-ahb-dmabuf.md). Selected with +// as dma-bufs. Selected with // GBM_BACKEND=mobilegl; the loader then finds /mobilegl_gbm.so on its backend path. // // THE DEVICE DESCRIPTOR IS OPAQUE. The fd a gbm_device is created on is only the identity the diff --git a/MobileGL/MG_Impl/EGLImpl/SharedImageFlushPolicy.h b/MobileGL/MG_Impl/EGLImpl/SharedImageFlushPolicy.h index 5aca21da..45dd57d0 100644 --- a/MobileGL/MG_Impl/EGLImpl/SharedImageFlushPolicy.h +++ b/MobileGL/MG_Impl/EGLImpl/SharedImageFlushPolicy.h @@ -8,7 +8,7 @@ #pragma once -// WHEN glFlush IS A SHARED-IMAGE BOUNDARY (docs/archive/notes/anland/plan-x11-gpu.md). +// WHEN glFlush IS A SHARED-IMAGE BOUNDARY. // // A dma-buf producer that renders into its buffers and hands them on after a glFlush (an X // server's glamor committing a window pixmap) relies on implicit sync: whoever samples the buffer diff --git a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp index c1684086..7e3de191 100644 --- a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp +++ b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp @@ -46,7 +46,7 @@ // call sites below are declarations only, exactly as the frontend's mutators are. #include -// P9 (W1, docs/archive/contracts/CONTRACT-P9.md §1): AN UNPACK SOURCE IS READ FROM THE BUFFER'S CLIENT SHADOW, +// P9 (W1 §1): AN UNPACK SOURCE IS READ FROM THE BUFFER'S CLIENT SHADOW, // and under a transport a GPU write into that buffer - a read_pixels_to_buffer, which is how a // glReadPixels into a pack buffer now crosses, or a shader store - reaches the shadow only through // SyncGpuWrites, exactly as glMapBufferRange and glGetBufferSubData already do. Monolith keeps its diff --git a/MobileGL/MG_Impl/GLXImpl/X11Present.h b/MobileGL/MG_Impl/GLXImpl/X11Present.h index 9241237e..fabd939c 100644 --- a/MobileGL/MG_Impl/GLXImpl/X11Present.h +++ b/MobileGL/MG_Impl/GLXImpl/X11Present.h @@ -8,7 +8,7 @@ #pragma once -// GLX WINDOWS PRESENTED THROUGH DRI3 + PRESENT (docs/archive/notes/anland/plan-x11-gpu.md). +// GLX WINDOWS PRESENTED THROUGH DRI3 + PRESENT. // // A GLX window's frames are drawn by the server into a pbuffer. Instead of reading each frame back // and putting it on the window, the frame is copied GPU-side into one of a few server-allocated diff --git a/MobileGL/MG_Impl/Pipe/PipeFill.cpp b/MobileGL/MG_Impl/Pipe/PipeFill.cpp index d3917968..aba11f02 100644 --- a/MobileGL/MG_Impl/Pipe/PipeFill.cpp +++ b/MobileGL/MG_Impl/Pipe/PipeFill.cpp @@ -2113,13 +2113,13 @@ namespace MobileGL::MG_Pipe { // emission gate is the subsystem bit plus the whole-record hash and nothing else. case MGPipeFieldEmitter::SetContextValues: return kMGPipeSubsystemResidualValues; - // P5e's one emitted row (docs/archive/contracts/CONTRACT-P5E.md §5.6): the indexed buffer - // binding points. Written HERE at the contract commit, with the Coverage.def row - // and EmittedCallSuppliesTheWholeField's arm beside it, for the reason - // kMGPipeWiredSubsystems' block states one paragraph down - this file belongs to - // the contract package for the whole phase, and an emitter enumerator whose - // dispatch arm lived in the family's own worktree is the merge trap that block - // exists to close. It is inert until that family's wired constant leaves 0. + // P5e's one emitted row (§5.6): the indexed buffer + // binding points. Written HERE at the contract commit, with the Coverage.def row + // and EmittedCallSuppliesTheWholeField's arm beside it, for the reason + // kMGPipeWiredSubsystems' block states one paragraph down - this file belongs to + // the contract package for the whole phase, and an emitter enumerator whose + // dispatch arm lived in the family's own worktree is the merge trap that block + // exists to close. It is inert until that family's wired constant leaves 0. case MGPipeFieldEmitter::SetShaderBuffers: return kMGPipeSubsystemBufferBindings; case MGPipeFieldEmitter::kNone: @@ -2175,7 +2175,7 @@ namespace MobileGL::MG_Pipe { static_assert(kMGPipeMaxVertexAttribs == MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS, "the MGPipe vertex-attribute capacity and the frontend's have drifted"); - // P5e (docs/archive/contracts/CONTRACT-P5E.md §1, ruling 10), pinned here for the same reason and in + // P5e (§1, ruling 10), pinned here for the same reason and in // the same place: this translation unit sees the frontend constant and the MG_Pipe one, // and nothing else does. 84 is what the emitter may describe and what the wire carries; // the BACKEND clamps to the device's real GL_MAX_UNIFORM_BUFFER_BINDINGS, as it does diff --git a/MobileGL/MG_Impl/Pipe/ProgramEmit.h b/MobileGL/MG_Impl/Pipe/ProgramEmit.h index ac987ed3..68f91c20 100644 --- a/MobileGL/MG_Impl/Pipe/ProgramEmit.h +++ b/MobileGL/MG_Impl/Pipe/ProgramEmit.h @@ -106,7 +106,7 @@ namespace MobileGL::MG_Pipe { // published ahead of it are wiped by the create that follows. What the draft was // protecting - "a rebuild inside the verb must already see the bindings" - is // satisfied by both records going out at the SAME validate point, ahead of the verb, - // which is what this ordering does. See docs/archive/contracts/CONTRACT-P5E.md §5.5 and the + // which is what this ordering does. See the contract §5.5 and the // record's own comment in PipeApply.h. if (drawProgram) bytes += EmitProgramBindings(*drawProgram, drawCso); // THE COMPOSITE'S SECOND RELEASE PATH is spoken here, not in a destructor: when the diff --git a/MobileGL/MG_Impl/Pipe/SetHashSuppressor.h b/MobileGL/MG_Impl/Pipe/SetHashSuppressor.h index 7f4709ee..7d7b8236 100644 --- a/MobileGL/MG_Impl/Pipe/SetHashSuppressor.h +++ b/MobileGL/MG_Impl/Pipe/SetHashSuppressor.h @@ -40,7 +40,7 @@ namespace MobileGL::MG_Pipe { SetSamplerViews, // P4a - wired (backend debounce deletion: P3b/P4b) BindSamplerStates, // P4a - wired (backend debounce deletion: P3b/P4b) SetShaderImages, // P4a - wired (backend debounce deletion: P3b/P4b) - // P5e (docs/archive/contracts/CONTRACT-P5E.md §1, ruling 11): THREE SLOTS, ONE PER CLASS, not one + // P5e (§1, ruling 11): THREE SLOTS, ONE PER CLASS, not one // for the call. set_shader_buffers is emitted per Class (Uniform / ShaderStorage / // AtomicCounter) because the record's own Class field says which binding-point array // it describes - so a single slot would make every emission of one class cancel the diff --git a/MobileGL/MG_Impl/Pipe/Tracker.h b/MobileGL/MG_Impl/Pipe/Tracker.h index a8554f21..1ed1fb3e 100644 --- a/MobileGL/MG_Impl/Pipe/Tracker.h +++ b/MobileGL/MG_Impl/Pipe/Tracker.h @@ -156,18 +156,18 @@ namespace MobileGL::MG_Pipe { case MGPipeDirty::NewSamplers: case MGPipeDirty::NewShaderImages: return kMGPipeSubsystemSamplers; - // P5e's three, one subsystem (docs/archive/contracts/CONTRACT-P5E.md §1): the indexed buffer - // binding points. Bits 15/16/17 have been computed and counted since P2 and have named - // no subsystem since - "the remaining bits have no call of their own until P4b", which - // the default arm below used to say for them. set_shader_buffers is the call, and - // set_stream_output_targets stays unemitted while riding the same A/B bit, for the - // reason kMGPipeDirtyEmittedAtP5e states. - // - // NAMING THE SUBSYSTEM IS NOT THE SAME AS EMITTING. The emission gate is five - // conjuncts (PipeFill.cpp's `wants()`), one of which is kMGPipeWiredSubsystems - and - // the buffer-binding family's wired constant is 0 until the package that gives the - // emitter its body sets it, exactly as P4a's four families were. So this map moves - // here, inert, and nothing is emitted and no field is skipped on its account yet. + // P5e's three, one subsystem (§1): the indexed buffer + // binding points. Bits 15/16/17 have been computed and counted since P2 and have named + // no subsystem since - "the remaining bits have no call of their own until P4b", which + // the default arm below used to say for them. set_shader_buffers is the call, and + // set_stream_output_targets stays unemitted while riding the same A/B bit, for the + // reason kMGPipeDirtyEmittedAtP5e states. + // + // NAMING THE SUBSYSTEM IS NOT THE SAME AS EMITTING. The emission gate is five + // conjuncts (PipeFill.cpp's `wants()`), one of which is kMGPipeWiredSubsystems - and + // the buffer-binding family's wired constant is 0 until the package that gives the + // emitter its body sets it, exactly as P4a's four families were. So this map moves + // here, inert, and nothing is emitted and no field is skipped on its account yet. case MGPipeDirty::NewConstBuffers: case MGPipeDirty::NewShaderBuffers: case MGPipeDirty::NewSoTargets: diff --git a/MobileGL/MG_Impl/Pipe/Verb/VerbPort.h b/MobileGL/MG_Impl/Pipe/Verb/VerbPort.h index c349f23d..32523e29 100644 --- a/MobileGL/MG_Impl/Pipe/Verb/VerbPort.h +++ b/MobileGL/MG_Impl/Pipe/Verb/VerbPort.h @@ -152,7 +152,7 @@ namespace MobileGL::MG_Record { Bool ReadbackReplyIsComplete(Int32 status, Uint64 replySize, Uint64 expected); // ============================================================================= - // P5b d1 - the draw family's record plan (docs/archive/contracts/CONTRACT-P5B.md §2 d1) + // P5b d1 - the draw family's record plan (§2 d1) // ============================================================================= // // The nineteen indexed / instanced / multi-draw / indirect entry points all ride draw_vbo diff --git a/MobileGL/MG_Impl/SharedImageApi.h b/MobileGL/MG_Impl/SharedImageApi.h index 08d2cda6..58683afd 100644 --- a/MobileGL/MG_Impl/SharedImageApi.h +++ b/MobileGL/MG_Impl/SharedImageApi.h @@ -6,7 +6,7 @@ * SPDX-License-Identifier: LGPL-3.0-only * End of Source File Header */ -/* SHARED IMAGES, AS A C ABI (docs/archive/notes/anland/plan-ahb-dmabuf.md). +/* SHARED IMAGES, AS A C ABI. * * libMobileGL.so exports these on Linux (not Android) in split builds, so a component that is not * a GL entry point - the GBM backend (MG_Gbm), above all - can ask the server for an image and diff --git a/MobileGL/MG_IntegrationTest/P8Coverage.cmake b/MobileGL/MG_IntegrationTest/P8Coverage.cmake index 733f9220..31c862a7 100644 --- a/MobileGL/MG_IntegrationTest/P8Coverage.cmake +++ b/MobileGL/MG_IntegrationTest/P8Coverage.cmake @@ -19,7 +19,7 @@ # monolith DirectGLES. / DirectVulkan. case is on a gated split arm or is named, with a reason # class, in scripts/data/split_coverage_exemptions.txt. Deleting a line below reds it BY NAME. # The per-case census this list was cut from (inproc / spawn / tcp, junit per arm) is -# docs/archive/notes/p8/A.md. +# recorded in the phase notes. # ---- (a) THE AMBIENT CASES ----------------------------------------------------------------- # @@ -191,7 +191,7 @@ set(MGL_P8A_KNOB_FILTER_WidenedPacked16 "CopyImagePacked16Scenario.*") set(MGL_P8A_KNOB_ENV_WidenedPacked16 "MOBILEGL_ESPRYT_WIDEN_PACKED16_STORAGE=1") # ForcedDs keeps the spelling the existing Split/Spawn DepthStencilReadbackMatrix block uses. The # default-framebuffer case was left out here while it was red on spawn and tcp; P8-SE fixed it -# (docs/archive/notes/p8/SE.md) and it runs under the knob on every arm like the rest. +# and it runs under the knob on every arm like the rest. set(MGL_P8A_KNOB_FILTER_ForcedDs "DepthStencilReadbackScenario.*:DepthStencilReadbackAttachmentShapeScenario.*") set(MGL_P8A_KNOB_ENV_ForcedDs "MOBILEGL_ESPRYT_FORCE_DS_READBACK_EMULATION=1") diff --git a/MobileGL/MG_IntegrationTest/Scenarios/CopyImageStoreReadbackScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/CopyImageStoreReadbackScenario.cpp index 8017b4c5..df02b7ed 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/CopyImageStoreReadbackScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/CopyImageStoreReadbackScenario.cpp @@ -7,7 +7,7 @@ // End of Source File Header // // Scenario - glCopyImageSubData INTO A LEVEL THE DRIVER WILL NOT READ BACK (P8-E, -// docs/archive/notes/p8/E.md). +// the phase notes). // // The formats are the ones an ES driver keeps as texture-only storage: GL_RGB16 (EXT_texture_norm16 // makes the three-channel spelling sampleable, never colour-renderable) and the 16-bit SNORM family diff --git a/MobileGL/MG_IntegrationTest/Scenarios/CtWireScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/CtWireScenario.cpp index 6f569265..1c4c0e81 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/CtWireScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/CtWireScenario.cpp @@ -6,7 +6,7 @@ // SPDX-License-Identifier: LGPL-3.0-only // End of Source File Header -// P5c ct (docs/archive/contracts/CONTRACT-P5C.md §5): the two control records, end to end over inproc. +// P5c ct (§5): the two control records, end to end over inproc. // // applier_reset (§5.1): this process's first validate primes the pipe tracker, and the // FreshlyPrimed edge is the record's producer (MG_Impl/Pipe/PipeFill.cpp). What the scenario @@ -167,7 +167,7 @@ namespace MGITest { // (DirectVulkan.cpp, CONTRACT-P7 §5.5) and emits the same `object_death`. Package L // measured that the SPAWN arm already passed once the WireTables install condition // went backend-agnostic and that the INPROC arm failed here with `deaths` 0 vs 0 - // (docs/archive/notes/p7/magma-two-process-first-run.md §6); the table is what closes the inproc + // (§6); the table is what closes the inproc // half, and this case is the gate on it. It is also the RED-ONCE for that table: with // the install site short-circuited, both cases red on their `od` assertions below. const GLubyte red[4] = {255, 0, 0, 255}; @@ -242,7 +242,7 @@ namespace MGITest { // "A SPLIT BUILD RUNS AT TIER T2 AND DECLINES EVERY ACQUISITION, ALWAYS"; T0/T1 are // unimplemented, refused by name at the handshake since P11 A1). So the capability is wired // AHEAD of its consumer on purpose, and `rsd=` on the PipeStats line is the counter that - // will show the records the day P11 lands a tier that adopts. See docs/archive/notes/p7/magma-c.md. + // will show the records the day P11 lands a tier that adopts. See the phase notes. TEST_F(CtWireScenario, TheServerPublishesTheResidentSubDataCapabilityFromItsOwnTable) { if (!Ready()) return; // A REAL WORKLOAD FIRST, and it is not decoration: ScenarioFixture's arming rule diff --git a/MobileGL/MG_IntegrationTest/Scenarios/DepthStencilReadbackMatrixScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/DepthStencilReadbackMatrixScenario.cpp index ff34bab8..91c3c0ea 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/DepthStencilReadbackMatrixScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/DepthStencilReadbackMatrixScenario.cpp @@ -544,7 +544,7 @@ namespace MGITest { // THE CASE IS ARMED ON THE MAGMA WIRE ARM ONLY, and the two gates below say which of the // other arms that discover it (the suite is registered whole on the monolith DirectVulkan // arm and on every DirectGLES arm) owe this picture and do not yet produce it. Both are - // recorded debts (docs/archive/notes/p7/magma-b2.md §6), not agreements with the wrong answer: + // recorded debts (§6), not agreements with the wrong answer: // - Espryt (DirectGLES, monolith and split alike): the flipped resolve writes nothing and // raises no error, and the scaled one raises no error either. P3b/P4b. // - the monolith DirectVulkan arm: `VulkanRenderer.cpp` refuses a depth blit with a @@ -573,16 +573,15 @@ namespace MGITest { GTEST_SKIP() << "Espryt (" << Gl().BackendName() << ") does not produce this picture yet: a " "flipped multisample depth resolve writes nothing with no error and a scaled " - "one raises no INVALID_OPERATION - a P3b/P4b debt (docs/archive/notes/p7/magma-b2.md §6)"; + "one raises no INVALID_OPERATION - a P3b/P4b debt (§6)"; } if (!PeekSplitRuntime().transportResolved) { - GTEST_SKIP() - << "the monolith DirectVulkan transport (this process resolved no split " - "transport, so BlitFramebuffer takes the monolith arm) refuses a flipped " - "depth blit (\"depth blits with flipped rectangles are not supported yet\", " - "destination untouched, no error) and scales a multisample depth blit GL " - "calls INVALID_OPERATION - a wire-vs-monolith divergence where the wire arm " - "is the correct one; the monolith fix is P13/G1-bound (docs/archive/notes/p7/magma-b2.md §6)"; + GTEST_SKIP() << "the monolith DirectVulkan transport (this process resolved no split " + "transport, so BlitFramebuffer takes the monolith arm) refuses a flipped " + "depth blit (\"depth blits with flipped rectangles are not supported yet\", " + "destination untouched, no error) and scales a multisample depth blit GL " + "calls INVALID_OPERATION - a wire-vs-monolith divergence where the wire arm " + "is the correct one; the monolith fix is P13/G1-bound (§6)"; } DepthSource multisampled = MakeRenderbufferSource(GL_DEPTH24_STENCIL8, 4); if (!SourceIsUsable()) { diff --git a/MobileGL/MG_IntegrationTest/Scenarios/F1WireScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/F1WireScenario.cpp index 7e95b8c9..1857d129 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/F1WireScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/F1WireScenario.cpp @@ -1255,7 +1255,7 @@ void main() { color = value + tail; } // The sibling of ShortUniformBufferRangePadsMissingBytes whose bound range does NOT // end on a four-byte boundary. That window is what `uniform-buffer-byte-tail` // used to refuse (a named Fatal that took the whole session with it), and it is the - // live boundary the Redmi Minecraft run reported (docs/archive/notes/p5f/magma-inproc-fix.md #5). + // live boundary the Redmi Minecraft run reported. // // Only the SIZE can land off a word here. glBindBufferRange constrains the offset to // GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT and records GL_INVALID_VALUE otherwise diff --git a/MobileGL/MG_IntegrationTest/Scenarios/FencePollScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/FencePollScenario.cpp index cc66f1e7..f80b80fd 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/FencePollScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/FencePollScenario.cpp @@ -6,7 +6,7 @@ // SPDX-License-Identifier: LGPL-3.0-only // End of Source File Header // -// P10 (A, docs/archive/contracts/CONTRACT-P10.md §1): FENCE POLLS ANSWERED FROM THE REVERSE CHANNEL. +// P10 (A §1): FENCE POLLS ANSWERED FROM THE REVERSE CHANNEL. // // A glClientWaitSync / glGetSynciv(GL_SYNC_STATUS) used to be a kWaitReply record: its answer // came back only after the server had applied every record before it, so a poll was a full diff --git a/MobileGL/MG_IntegrationTest/Scenarios/GenerateMipmapServerScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/GenerateMipmapServerScenario.cpp index f63314cf..15a7657b 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/GenerateMipmapServerScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/GenerateMipmapServerScenario.cpp @@ -7,7 +7,7 @@ // End of Source File Header // // Scenario - glGenerateMipmap ON THE FORMATS ESPRYT DOES NOT HAND STRAIGHT TO THE DRIVER -// (P8-B, docs/archive/notes/p8/B.md). +// (P8-B). // // Espryt generates R11F_G11F_B10F and depth chains with per-level blits, and RGB16F / RGB32F // chains outside glGenerateMipmap because ES refuses a three-channel float format there. Until diff --git a/MobileGL/MG_IntegrationTest/Scenarios/IndexedDrawFamilyScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/IndexedDrawFamilyScenario.cpp index 3afa00f2..db222237 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/IndexedDrawFamilyScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/IndexedDrawFamilyScenario.cpp @@ -6,7 +6,7 @@ // SPDX-License-Identifier: LGPL-3.0-only // End of Source File Header // -// Scenario - THE DRAW FAMILY P5b's d1 PUTS ON THE WIRE (docs/archive/contracts/CONTRACT-P5B.md §2 d1): one +// Scenario - THE DRAW FAMILY P5b's d1 PUTS ON THE WIRE (§2 d1): one // VBO, one EBO, one program, one VAO, and one picture per draw entry point whose correctness // DEPENDS on the fields that entry point adds to draw_vbo. Two quads live in the vertex buffer, // a left one and a right one, and every case draws exactly one of them or both through a diff --git a/MobileGL/MG_IntegrationTest/Scenarios/LargeArenaAdoptionScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/LargeArenaAdoptionScenario.cpp index e75284ea..2f6e21eb 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/LargeArenaAdoptionScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/LargeArenaAdoptionScenario.cpp @@ -611,7 +611,7 @@ void main() { word = 0xC0FFEEu; } << window.line; } - // P11 A2 (docs/archive/contracts/CONTRACT-P11.md §2): WHICH TIER THE ARENA REALLY LANDED IN. The cases above + // P11 A2 (§2): WHICH TIER THE ARENA REALLY LANDED IN. The cases above // are green whether the arena adopted or stayed emulated, so the lane declares the arm // (MGITEST_PERSISTENT_MAP_ARM) and this case asserts it, the way // PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares does for a sub-16-MiB map. @@ -666,7 +666,7 @@ void main() { word = 0xC0FFEEu; } ExpectDeclaredArm(declared, "after a frame of draws, an SSBO binding and a dispatch"); } - // P11 A1 (docs/archive/contracts/CONTRACT-P11.md §1): THE TCP LANE WITH MOBILEGL_IPC_ADOPT_TIER=0. A stream + // P11 A1 (§1): THE TCP LANE WITH MOBILEGL_IPC_ADOPT_TIER=0. A stream // data plane has no memory the two sides share, so the client refuses the knob by name at its // handshake - exactly one `Refuse{AdoptTierOnStream, "T0"}` line in its log - and the session // runs T2: the other cases in the same `.AdoptTier0.` lane are green and the arena is emulated. @@ -703,7 +703,7 @@ void main() { word = 0xC0FFEEu; } EXPECT_EQ(log.find("Fatal{UnimplementedAdoptTier"), std::string::npos) << log; } - // P11 B2 (docs/archive/contracts/CONTRACT-P11.md B2): A SHARED-SEGMENT SESSION THAT ASKS T0 AND CANNOT RUN IT. + // P11 B2 (B2): A SHARED-SEGMENT SESSION THAT ASKS T0 AND CANNOT RUN IT. // MOBILEGL_IPC_ADOPT_TIER=0 over shared segments asks T0 in the Hello (A1 made it die at the // handshake; ruling ID-P11-14 made it this). The lane's server cannot grant it - a host has no // AHardwareBuffer, or `.AdoptT0Disallowed.` turned its allow switch off - so it refuses by name diff --git a/MobileGL/MG_IntegrationTest/Scenarios/PackBufferReadbackScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/PackBufferReadbackScenario.cpp index 2c180761..f9bb7b99 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/PackBufferReadbackScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/PackBufferReadbackScenario.cpp @@ -6,7 +6,7 @@ // SPDX-License-Identifier: LGPL-3.0-only // End of Source File Header // -// P9 (W1, docs/archive/contracts/CONTRACT-P9.md §1): READS INTO A PIXEL PACK BUFFER ARE ANSWERED BY NOTHING. +// P9 (W1 §1): READS INTO A PIXEL PACK BUFFER ARE ANSWERED BY NOTHING. // // Under a transport a glReadPixels / glGetTexImage whose destination is a bound // GL_PIXEL_PACK_BUFFER no longer waits for its pixels: it crosses as read_pixels_to_buffer / diff --git a/MobileGL/MG_IntegrationTest/Scenarios/TextureRemintPullScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/TextureRemintPullScenario.cpp index b7aa46c3..a7d0b03b 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/TextureRemintPullScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/TextureRemintPullScenario.cpp @@ -6,7 +6,7 @@ // SPDX-License-Identifier: LGPL-3.0-only // End of Source File Header // -// Scenario - A TEXTURE RE-MINT NEEDS NO BYTE FROM THE CLIENT (P9 W2, docs/archive/notes/p9/W2-REMINT.md). +// Scenario - A TEXTURE RE-MINT NEEDS NO BYTE FROM THE CLIENT (P9 W2). // // The name is the ROADMAP's: P4a named `texture-remint-pull` the one new stall class of the // split - a texture first bound to an image unit AFTER the backend allocated it has to be diff --git a/MobileGL/MG_IntegrationTest/Scenarios/TextureUploadShapeScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/TextureUploadShapeScenario.cpp index b291c98f..cf7d6ee8 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/TextureUploadShapeScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/TextureUploadShapeScenario.cpp @@ -33,7 +33,7 @@ // table below. // // THE CLIENT EMITTER LANDED TOO, and three places in the tree said otherwise until this commit: -// this header, the CMake probe's comment, and docs/archive/notes/p4a/p4a-results/gates-v1.md's re-run table. +// this header, the CMake probe's comment, and the phase notes' re-run table. // MG_Impl/Pipe/TextureEmit.h's EmitOneLevel increments CallClass::ClientTextureUploadEmissions on // every piece it emits, so `ctu=` is a live reading and `ctu == emit` is a live assertion. The // CMake probe's `else()` arm is kept - it is what makes the arming decision falsifiable - but it diff --git a/MobileGL/MG_IntegrationTest/Scenarios/TextureViewAliasScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/TextureViewAliasScenario.cpp index 19d116bb..33c3a6e7 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/TextureViewAliasScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/TextureViewAliasScenario.cpp @@ -30,7 +30,7 @@ // That is exactly the shape SSIM and every ordinary pixel case go green over. // // SO THE CLAIM IS ASSERTED ON BOTH CHANNELS AT ONCE, and neither alone is the gate -// (docs/archive/notes/recovered/wf2/final/part3.md 7.3, "门:新增场景,通过 view 上传、经属主采样(以及反 +// (7.3, "门:新增场景,通过 view 上传、经属主采样(以及反 // 向),跨 draw 边界各一次"): // // PIXELS an upload through one name must be visible through the other name, in the SAME @@ -51,7 +51,7 @@ // MarkStorageDirtyRegion call PipeNoteLevelDirty on ITSELF instead of forwarding to the owner - // i.e. build the two-cursor shape the design rejects. Case (a) then goes red on stale OWNER // texels AND on a SubDataCount that did not move, which is the pair this file exists to make -// simultaneous. Recorded in docs/archive/notes/p34b/espryt-d2.md. +// simultaneous. Recorded in the phase notes. // // VIEWS ARE OPT-IN ON ESPRYT. DirectGLES withholds GL_ARB_texture_view unless // MOBILEGL_ESPRYT_ENABLE_TEXTURE_VIEW=1 (ConfigLoader.cpp:213, Config.h:72), so every lane that diff --git a/MobileGL/MG_IntegrationTest/Scenarios/TriangleScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/TriangleScenario.cpp index 32efe847..367e0b69 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/TriangleScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/TriangleScenario.cpp @@ -13,7 +13,7 @@ // in every lane; the DirectGLES.Split. entries run the same two cases with // MOBILEGL_TRANSPORT=inproc, where the same body is the smallest workload that crosses a real // ring. Four things about its shape are decisions rather than defaults, and all four come from -// the measured verb census (docs/archive/notes/p5/verb-census.md): +// the measured verb census: // // 1. THE DRAW IS VBO-BACKED AND HAS NO CLIENT-ARRAY INDICES. glDrawArrays against a buffer // bound to GL_ARRAY_BUFFER, never glDrawElements with a client pointer. That keeps diff --git a/MobileGL/MG_IntegrationTest/Scenarios/WireIndirectDispatchScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/WireIndirectDispatchScenario.cpp index 7c11b2b9..70a803c1 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/WireIndirectDispatchScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/WireIndirectDispatchScenario.cpp @@ -7,7 +7,7 @@ // End of Source File Header // // P8-SV: THE MAGMA WIRE ARM ISSUES glDispatchComputeIndirect FROM THE WIRE STORE, AS THE MONOLITH -// ARM DOES (docs/archive/notes/p8/SV.md). +// ARM DOES. // // Before P8-SV the wire arm read the three group counts through ReadWireBuffer and dispatched them // from the CPU, so a dispatch buffer a shader had written cost a whole-GPU wait per call - the diff --git a/MobileGL/MG_IntegrationTest/Scenarios/WireMipShapeScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/WireMipShapeScenario.cpp index e09b5e25..8bd8e2dd 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/WireMipShapeScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/WireMipShapeScenario.cpp @@ -6,7 +6,7 @@ // SPDX-License-Identifier: LGPL-3.0-only // End of Source File Header // -// P8-SV: TWO glGenerateMipmap SHAPES THE MAGMA WIRE ARM GOT WRONG (docs/archive/notes/p8/SV.md). +// P8-SV: TWO glGenerateMipmap SHAPES THE MAGMA WIRE ARM GOT WRONG. // // * A 3D chain through the NATIVE blit. The wire arm passed the level's depth as the blit's // subresource layerCount on an image with one array layer (VUID-vkCmdBlitImage-srcImage-00240, diff --git a/MobileGL/MG_Pipe/MGPipe.h b/MobileGL/MG_Pipe/MGPipe.h index 840bcb8f..8207c8a3 100644 --- a/MobileGL/MG_Pipe/MGPipe.h +++ b/MobileGL/MG_Pipe/MGPipe.h @@ -108,7 +108,7 @@ namespace MobileGL::MG_Pipe { // the three unit sets inline constexpr Uint64 kMGPipeSubsystemPrograms = 1ull << 12; // shader CSO, draw/dispatch // program, global constants - // P5e's one (docs/archive/contracts/CONTRACT-P5E.md §1). The INDEXED BUFFER BINDING POINTS: the three + // P5e's one (§1). The INDEXED BUFFER BINDING POINTS: the three // dirty bits NewConstBuffers / NewShaderBuffers / NewSoTargets, the set_shader_buffers // emitter, and the backend's four binding-point walks. It is its own bit and not part of // bit 7's resource family for the reason every other split here has: a UBO/SSBO binding diff --git a/MobileGL/MG_Pipe/MGPipeTypes.h b/MobileGL/MG_Pipe/MGPipeTypes.h index 2192031c..24723017 100644 --- a/MobileGL/MG_Pipe/MGPipeTypes.h +++ b/MobileGL/MG_Pipe/MGPipeTypes.h @@ -130,7 +130,7 @@ namespace MobileGL::MG_Pipe { // caps adoption after Start; a later snapshot may only disarm it, because records already // published without a wait cannot be taken back. kCapRunAheadApply = 1ull << 10, - // P11 B2 (docs/archive/contracts/CONTRACT-P11.md B2). THIS SESSION MAY RUN T0: the client asked for + // P11 B2 (B2). THIS SESSION MAY RUN T0: the client asked for // it in its Hello (LinkTerms.adoptTier = 0) on a shared-segment plane, the server's // allow switch is on, this platform has AHardwareBuffer, and the backend's POST // self-test of the sustained-lock pattern passed on its live context. Never set in the @@ -906,7 +906,7 @@ namespace MobileGL::MG_Pipe { // 0, or Count for the Uniform class under kCapNeedsHostUboBytes (RESERVED, P8-F: 0 today; // a range with nothing to ship carries an empty span, so the two arrays stay aligned). // MGPShaderBuffers::Class's three values, and the ONLY spelling of them (P5e, - // docs/archive/contracts/CONTRACT-P5E.md §1). The payload's comment has named them since P4a and + // the contract §1). The payload's comment has named them since P4a and // nothing numbered them, so the emitter and the applier were one literal each away from // disagreeing. Uniform is 0 so a zeroed record describes the uniform binding points, which // is the class every workload has. @@ -1520,8 +1520,8 @@ namespace MobileGL::MG_Pipe { }; MGP_ASSERT_POD(MGPFlush, 8); - // DAMAGE ON THE WIRE (eglSwapBuffersWithDamage, docs/archive/notes/anland/plan-ahb-dmabuf.md - // item 5). At most kMGPMaxDamageRects rectangles, each x, y, width, height in GL window + // DAMAGE ON THE WIRE (eglSwapBuffersWithDamage, item 5). At most kMGPMaxDamageRects + // rectangles, each x, y, width, height in GL window // coordinates - origin at the bottom-left, as EGL hands them over. A count of 0 means the whole // surface, which is also what every record from a client that sends no damage says. inline constexpr Uint32 kMGPMaxDamageRects = 16; @@ -1642,7 +1642,7 @@ namespace MobileGL::MG_Pipe { MGP_ASSERT_POD(MGPCopyFromFramebuffer, 48); // --------------------------------------------------------------------------------- - // P5c: the three appended rows (docs/archive/contracts/CONTRACT-P5C.md §5). APPENDED, never inserted: + // P5c: the three appended rows (§5). APPENDED, never inserted: // applier_reset is opcode 77, object_death opcode 78, and set_context_values (rv, §5.3) // opcode 79 - and no earlier opcode moved. // diff --git a/MobileGL/MG_Pipe/PipeApply.cpp b/MobileGL/MG_Pipe/PipeApply.cpp index 416219e2..f50f956e 100644 --- a/MobileGL/MG_Pipe/PipeApply.cpp +++ b/MobileGL/MG_Pipe/PipeApply.cpp @@ -3270,7 +3270,7 @@ namespace MobileGL::MG_Pipe { } // --------------------------------------------------------------------------------- - // P5e's two entry points, DECLARED BY c0e (docs/archive/contracts/CONTRACT-P5E.md §1) + // P5e's two entry points, DECLARED BY c0e (§1) // --------------------------------------------------------------------------------- // // set_shader_buffers HAS ITS BODY (package sb); set_program_bindings still refuses by name diff --git a/MobileGL/MG_Pipe/PipeApply.h b/MobileGL/MG_Pipe/PipeApply.h index de3553ba..5285b65c 100644 --- a/MobileGL/MG_Pipe/PipeApply.h +++ b/MobileGL/MG_Pipe/PipeApply.h @@ -11,7 +11,7 @@ #include "MGPipeRenderStateSpans.h" #include "MGPipeTypes.h" -// P5e (docs/archive/contracts/CONTRACT-P5E.md §2.1): MGPipeBarriered takes an MGPWireOp and reads the +// P5e (§2.1): MGPipeBarriered takes an MGPWireOp and reads the // generated wait-class and call-class tables, all of which live in MGPipe.h. It is a sibling // header in the same layer - MG_Pipe includes MG_Pipe - so the closure does not move. #include "MGPipe.h" @@ -90,7 +90,7 @@ namespace MobileGL::MG_Pipe { const MGPSubRegion* regions); void (*TextureRespecify)(MGPipeHandle res, const MGPResourceDesc& desc, const MGPRespecifiedLevel* level); void (*TextureDestroy)(MGPipeHandle res); - // P11 B2 (T0, docs/archive/contracts/CONTRACT-P11.md B2): the two members a backend that can take a + // P11 B2 (T0, B2): the two members a backend that can take a // client's AHardwareBuffer as a store registers. Both null = this backend has no T0 and // every session it serves runs T2. Appended after the texture trio for the same reason. // @@ -246,7 +246,7 @@ namespace MobileGL::MG_Pipe { // DirectGLESBufferDrawProbe pair now pins from both sides. Bool HasLiveHostWrites = false; - // SHARED IMAGES (docs/archive/notes/anland/plan-ahb-dmabuf.md). Nonzero: this + // SHARED IMAGES. Nonzero: this // texture's level-0 storage IS the server's shared image of this id (an EGLImage target), // set by shared_image's Attach and cleared by the next respecify that redefines storage. // The backend resolves the id at its texture sync (MG_Remote::Server::SharedImages::Find) diff --git a/MobileGL/MG_Pipe/PipeVerbSink.h b/MobileGL/MG_Pipe/PipeVerbSink.h index d1e79070..f74adacd 100644 --- a/MobileGL/MG_Pipe/PipeVerbSink.h +++ b/MobileGL/MG_Pipe/PipeVerbSink.h @@ -186,7 +186,7 @@ namespace MobileGL::MG_Pipe { return false; } - // ---- P5c (docs/archive/contracts/CONTRACT-P5C.md §5): the two control records, opcodes 77..78. + // ---- P5c (§5): the two control records, opcodes 77..78. // // Same hand-over shape as the P5b rows: the codec validates the record (a fixed-size // POD, no blob, no tail) and the SERVER'S sink does the work - OnApplierReset runs the @@ -218,7 +218,7 @@ namespace MobileGL::MG_Pipe { return false; } - // ---- shared images, opcode 85 (docs/archive/notes/anland/plan-ahb-dmabuf.md). + // ---- shared images, opcode 85. // `seq` is the record's reply-slot id, which an Import's descriptor names on the aux // socket. True fills `reply`; false is a DECLINED answer. virtual Bool OnSharedImage(const MGPSharedImageOp& op, Uint64 seq, MGPSharedImageReply& reply) { diff --git a/MobileGL/MG_Pipe/generated/PipeWire.inc b/MobileGL/MG_Pipe/generated/PipeWire.inc index 0d5163c7..b191eb2b 100644 --- a/MobileGL/MG_Pipe/generated/PipeWire.inc +++ b/MobileGL/MG_Pipe/generated/PipeWire.inc @@ -379,7 +379,7 @@ inline constexpr MGPipeCallClass MGPipeCallClassFor(MGPWireOp op) { : kCallClassCount; } -// P5e (docs/archive/contracts/CONTRACT-P5E.md 2.2): THE WAIT CLASS OF EVERY OPCODE, indexed the same way. +// P5e (2.2): THE WAIT CLASS OF EVERY OPCODE, indexed the same way. // Index 0 is kWaitClassCount - never a real class - for the flags table's reason: the one // caller that can pass an opcode this catalogue never produced is a decoder holding bytes off // a stream, and it must reach its own Fatal{ProtocolCorruption} rather than a wait decision. diff --git a/MobileGL/MG_Remote/Client/BackendObject_Remote.h b/MobileGL/MG_Remote/Client/BackendObject_Remote.h index af43ac50..c5b4d545 100644 --- a/MobileGL/MG_Remote/Client/BackendObject_Remote.h +++ b/MobileGL/MG_Remote/Client/BackendObject_Remote.h @@ -57,7 +57,7 @@ namespace MobileGL::MG_Remote::Client { void ReleaseEGLSurface(EGLSurface surface) override; void ReleaseEGLResources() override; - // ---- shared images (docs/archive/notes/anland/plan-ahb-dmabuf.md) ------------- + // ---- shared images ------------- Bool AllocateSharedImage(Uint32 width, Uint32 height, Uint32 fourcc, MG_Backend::SharedImageExport* out) override; Bool ImportSharedImage(int fd, Uint32 width, Uint32 height, Uint32 fourcc, Uint64* outId) override; diff --git a/MobileGL/MG_Remote/Client/ClientSession.cpp b/MobileGL/MG_Remote/Client/ClientSession.cpp index fc4cad66..61a14a98 100644 --- a/MobileGL/MG_Remote/Client/ClientSession.cpp +++ b/MobileGL/MG_Remote/Client/ClientSession.cpp @@ -2916,7 +2916,7 @@ namespace MobileGL::MG_Remote::Client { return m_transport; } - // ---- P11 B2: T0 (docs/archive/contracts/CONTRACT-P11.md B2) -------------------------------------------- + // ---- P11 B2: T0 (B2) -------------------------------------------- namespace { Uint64 T0Key(MG_Pipe::MGPipeHandle handle) { diff --git a/MobileGL/MG_Remote/Client/ClientSession.h b/MobileGL/MG_Remote/Client/ClientSession.h index a8747100..b081da18 100644 --- a/MobileGL/MG_Remote/Client/ClientSession.h +++ b/MobileGL/MG_Remote/Client/ClientSession.h @@ -228,7 +228,7 @@ namespace MobileGL::MG_Remote::Client { Int32* statusOut, Uint64* replySizeOut = nullptr, Bool wantReply = true, Bool willReadReply = true); - // ---- P11 B2: T0 (docs/archive/contracts/CONTRACT-P11.md B2) ------------------------------------ + // ---- P11 B2: T0 (B2) ------------------------------------ // // Does this session adopt persistent stores through T0? Decided ONCE, lazily, at the first // map_persistent - the first moment it matters, and one at which the server's first native @@ -244,7 +244,7 @@ namespace MobileGL::MG_Remote::Client { // adopts it as the store's mapping - or null on DECLINED (the store stays T2). void* AdoptPersistentT0(const MG_Pipe::MGPHandleOnly& handle, Uint64 size, const void* seed); void* AdoptPersistentInProcess(const MG_Pipe::MGPHandleOnly& handle, Uint64 size, const void* seed); - // shared_image (docs/archive/notes/anland/plan-ahb-dmabuf.md): emits `op` and waits + // shared_image: emits `op` and waits // for its answer. `sendFd` >= 0 (an Import) is queued on the aux socket for the record's // seq BEFORE the record is published; `receivedFd` non-null (an Allocate) takes the // descriptor the server queued before its answer. False = DECLINED (the server's log says diff --git a/MobileGL/MG_Remote/Client/WireTables.cpp b/MobileGL/MG_Remote/Client/WireTables.cpp index 5f4a69a8..4ad4010d 100644 --- a/MobileGL/MG_Remote/Client/WireTables.cpp +++ b/MobileGL/MG_Remote/Client/WireTables.cpp @@ -584,7 +584,7 @@ namespace MobileGL::MG_Remote::Client { // willReadReply IS TRUE AND THAT IS THE WHOLE POINT OF THE WINDOW: this record does // not wait for its answer, and the drain above reads it later. A P12 no-reply bit // keyed on wantReply would tell the server to skip the very answer this row comes - // back for (docs/.../p12/CREATE-WINDOW-MEASURED.md section 7). + // back for. const Uint64 seq = session.EmitAndWaitTails(MGPWireOp::ResourceCreate, payload, sizeof(*payload), nullptr, 0, nullptr, 0, &status, nullptr, /*wantReply=*/false, /*willReadReply=*/true); diff --git a/MobileGL/MG_Remote/Server/PipeApplier.cpp b/MobileGL/MG_Remote/Server/PipeApplier.cpp index b962055f..1d889e4b 100644 --- a/MobileGL/MG_Remote/Server/PipeApplier.cpp +++ b/MobileGL/MG_Remote/Server/PipeApplier.cpp @@ -320,7 +320,7 @@ namespace MobileGL::MG_Remote::Server { return true; } - // ---- P5c ct (docs/archive/contracts/CONTRACT-P5C.md §5) ------------------------------------------ + // ---- P5c ct (§5) ------------------------------------------ // // TWO CONTROL RECORDS, NO BACKEND TABLE AND NO DECLINE ARM. Neither body consults // Table(): the reset belongs to the applier this process owns, and the death release diff --git a/MobileGL/MG_Remote/Server/PipeApplier.h b/MobileGL/MG_Remote/Server/PipeApplier.h index 01838dfa..a6053e14 100644 --- a/MobileGL/MG_Remote/Server/PipeApplier.h +++ b/MobileGL/MG_Remote/Server/PipeApplier.h @@ -151,7 +151,7 @@ namespace MobileGL::MG_Remote::Server { void ReleaseQueries(); Bool OnPresent(const MG_Pipe::MGPPresent& present) override; - // ---- P5c ct (docs/archive/contracts/CONTRACT-P5C.md §5): the two control records ---------------- + // ---- P5c ct (§5): the two control records ---------------- // // REAL BODIES FROM THE DAY THE ROWS EXIST, not the P5b stub shape: the rows were // appended by the same package that lands these bodies, so there is no window in @@ -177,7 +177,7 @@ namespace MobileGL::MG_Remote::Server { // rather than a silent bind. Token 0 (the release) is always legal. Bool OnBindContext(const MG_Pipe::MGPBindContext& bind) override; - // shared_image, opcode 85 (docs/archive/notes/anland/plan-ahb-dmabuf.md): the + // shared_image, opcode 85: the // session's image table (allocate / import / release) and the two GL-ordered operations // (present the default framebuffer into an image, attach an image to a texture). Bool OnSharedImage(const MG_Pipe::MGPSharedImageOp& op, Uint64 seq, diff --git a/MobileGL/MG_Remote/Server/ServerMain.cpp b/MobileGL/MG_Remote/Server/ServerMain.cpp index 04ac76b2..ac4eeb61 100644 --- a/MobileGL/MG_Remote/Server/ServerMain.cpp +++ b/MobileGL/MG_Remote/Server/ServerMain.cpp @@ -331,7 +331,7 @@ namespace { // P12 (D8). A FORKED SESSION CHILD DIES WITH ITS SUPERVISOR. The child used to outlive a supervisor // that was killed (MobileGLServerService.onDestroy destroys only the supervisor), holding its client - // and its GPU context until that client went away (docs/archive/notes/p65/code-review-findings.md:9). With the + // and its GPU context until that client went away. With the // parent-death signal the kernel SIGKILLs it the moment the supervisor goes - and the getppid() // check closes the race of a supervisor that died between fork() and the prctl. Linux (and Android) // only; the signal fires when the THREAD that forked exits, and both fork sites run on the diff --git a/MobileGL/MG_Remote/Server/ServerSession.cpp b/MobileGL/MG_Remote/Server/ServerSession.cpp index 5906bd07..3856d990 100644 --- a/MobileGL/MG_Remote/Server/ServerSession.cpp +++ b/MobileGL/MG_Remote/Server/ServerSession.cpp @@ -1105,7 +1105,7 @@ namespace MobileGL::MG_Remote::Server { std::memory_order_relaxed); } - // ---- P11 B2: T0 (docs/archive/contracts/CONTRACT-P11.md B2) ------------------------------------------ + // ---- P11 B2: T0 (B2) ------------------------------------------ namespace { // THE POST VERDICT IS THE PROCESS'S, like DriverPost's: the driver and the device do not diff --git a/MobileGL/MG_Remote/Server/ServerSession.h b/MobileGL/MG_Remote/Server/ServerSession.h index e3291057..0dfa8758 100644 --- a/MobileGL/MG_Remote/Server/ServerSession.h +++ b/MobileGL/MG_Remote/Server/ServerSession.h @@ -246,7 +246,7 @@ namespace MobileGL::MG_Remote::Server { Transport::RoleMemorySample SampleMemory() const; void LogMemory(const char* phase) const; - // ---- P11 B2: T0 (docs/archive/contracts/CONTRACT-P11.md B2) -------------------------------------- + // ---- P11 B2: T0 (B2) -------------------------------------- // // The client's Hello asked T0 (LinkTerms.adoptTier = 0 over shared segments). Bool AdoptT0Asked() const { return m_adoptT0Asked; } @@ -281,7 +281,7 @@ namespace MobileGL::MG_Remote::Server { Bool AdoptT0Quiet() const { return m_adoptT0Quiet; } AdoptInbox& T0Inbox() { return m_adoptInbox; } - // ---- shared images (docs/archive/notes/anland/plan-ahb-dmabuf.md) ------------- + // ---- shared images ------------- // The images this session allocated or imported and has not released; emptied when the // session closes. The control transport is where an allocation's descriptor goes out. SharedImages::SessionHolder& SharedImageHolder() { return m_sharedImages; } diff --git a/MobileGL/MG_Remote/Server/SharedImageRegistry.h b/MobileGL/MG_Remote/Server/SharedImageRegistry.h index 87d21ab6..049ff8f2 100644 --- a/MobileGL/MG_Remote/Server/SharedImageRegistry.h +++ b/MobileGL/MG_Remote/Server/SharedImageRegistry.h @@ -8,7 +8,7 @@ // SHARED IMAGES: colour buffers the server allocates and hands to clients as dma-buf descriptors, // so a frame one client renders can be sampled by another (a Wayland window by its compositor) -// without leaving GPU memory (docs/archive/notes/anland/plan-ahb-dmabuf.md). +// without leaving GPU memory. // // THE SERVER IS THE ALLOCATOR AND THE ONLY IMPORTER. An image is an AHardwareBuffer; what leaves // the process is a duplicate of its first native-handle descriptor, which on every Android kernel @@ -174,7 +174,7 @@ namespace MobileGL::MG_Remote::Server::SharedImages { // Live images, for tests and diagnostics. SizeT LiveCount(); - // ---- synchronisation (docs/archive/notes/anland/plan-ahb-dmabuf.md) --------------- + // ---- synchronisation --------------- // // THE SERVER ORDERS THE IMAGE BETWEEN ITS SESSIONS, the way a kernel's implicit sync would: // a writer publishes the fence of its write and moves on; a reader that finds the generation diff --git a/MobileGL/MG_Remote/Wire/PipeWireCodec.cpp b/MobileGL/MG_Remote/Wire/PipeWireCodec.cpp index 85d85fdc..9bea99ce 100644 --- a/MobileGL/MG_Remote/Wire/PipeWireCodec.cpp +++ b/MobileGL/MG_Remote/Wire/PipeWireCodec.cpp @@ -722,7 +722,7 @@ namespace MobileGL::MG_Remote::Wire { } case MGPWireOp::SetProgramBindings: { // THREE TAILS, THREE COUNTS, THREE INDEX SPACES (P5e, - // docs/archive/contracts/CONTRACT-P5E.md §1): Int32[BlockBindingCount] in GL uniform-block index + // the contract §1): Int32[BlockBindingCount] in GL uniform-block index // order, MGPProgramSamplerUnit[SamplerUnitCount] ascending by Location, and // MGPProgramStorageOverride[StorageOverrideCount] whose Name is a host span staged // whole - the override map is name-keyed by design. @@ -2071,7 +2071,7 @@ namespace MobileGL::MG_Remote::Wire { return true; case MGPWireOp::SetShaderBuffers: { - // P5e (sb, docs/archive/contracts/CONTRACT-P5E.md §5.6): THE APPLIER ENTRY POINT EXISTS NOW and + // P5e (sb §5.6): THE APPLIER ENTRY POINT EXISTS NOW and // this is the row's sink. The paragraph that stood here said "no applier entry // point exists, and P5 does not invent one: the call is on BRIEF §4's exclusion // list" - true for the whole of P5 through P5d, and withdrawn by the phase whose @@ -2108,7 +2108,7 @@ namespace MobileGL::MG_Remote::Wire { return false; case MGPWireOp::SetProgramBindings: { - // P5e, opcode 80 (docs/archive/contracts/CONTRACT-P5E.md §1). c0e wrote the shape check and left + // P5e, opcode 80 (§1). c0e wrote the shape check and left // the arm declining; PACKAGE pg COMPLETES IT. What the record needs before its // consumer sees it is its shape - the three declared counts against their bounds // and the three-tail arithmetic, both of which MGPipeWireRecordLayout above has @@ -2268,7 +2268,7 @@ namespace MobileGL::MG_Remote::Wire { case MGPWireOp::ResourceSubDataComplete: // RETIRED (P9 W2). It was to be the forward terminator of a SERVER-initiated texture // pull (section 7.1), and no such pull exists: a re-mint reads the GPU level and the - // server's own staged store (docs/archive/notes/p9/W2-REMINT.md). The row stays because opcodes + // server's own staged store. The row stays because opcodes // only ever grow; no client emits it and a record that claims it is declined. return false; @@ -2436,12 +2436,12 @@ namespace MobileGL::MG_Remote::Wire { return m_verbs != nullptr && m_verbs->OnCopyFramebufferToTexture(*static_cast(payload)); - // ---- P5c's two control records, opcodes 77..78 (docs/archive/contracts/CONTRACT-P5C.md §5) -------- - // - // Fixed-size PODs the bounds gate has already proved; neither carries a blob, a tail - // or a reply, so each arm hands over and stops. ObjectDeath's null-handle refusal is - // the sink's, not the codec's: the codec proves SHAPES, and "the client emits nothing - // for an object that never crossed" (§5.2) is a contract fact about the peer. + // ---- P5c's two control records, opcodes 77..78 (§5) -------- + // + // Fixed-size PODs the bounds gate has already proved; neither carries a blob, a tail + // or a reply, so each arm hands over and stops. ObjectDeath's null-handle refusal is + // the sink's, not the codec's: the codec proves SHAPES, and "the client emits nothing + // for an object that never crossed" (§5.2) is a contract fact about the peer. case MGPWireOp::ApplierReset: return m_verbs != nullptr && m_verbs->OnApplierReset(*static_cast(payload)); @@ -2457,7 +2457,7 @@ namespace MobileGL::MG_Remote::Wire { case MGPWireOp::BindContext: return m_verbs != nullptr && m_verbs->OnBindContext(*static_cast(payload)); - // ---- shared images (docs/archive/notes/anland/plan-ahb-dmabuf.md), opcode 85. + // ---- shared images, opcode 85. // // A fixed-size POD; every operation is answered, and a refusal is an answer (DECLINED, // the sink logs why) rather than a fault: an import of a descriptor this server never diff --git a/MobileGL/MG_State/GLState/BufferState/BufferState.h b/MobileGL/MG_State/GLState/BufferState/BufferState.h index 5a286076..ab750fff 100644 --- a/MobileGL/MG_State/GLState/BufferState/BufferState.h +++ b/MobileGL/MG_State/GLState/BufferState/BufferState.h @@ -75,7 +75,7 @@ namespace MobileGL::MG_State::GLState { void NoteBufferChanged() { ++m_anyBufferChangeGeneration; } Uint64 GetAnyBufferChangeGeneration() const { return m_anyBufferChangeGeneration; } - // P5e (sb, docs/archive/contracts/CONTRACT-P5E.md §1, §5.6). "DID ANY INDEXED BINDING POINT OF THIS + // P5e (sb §1, §5.6). "DID ANY INDEXED BINDING POINT OF THIS // TARGET MOVE" - one counter per BufferBindPointTargets entry, and it is the P4b hole // closed rather than a new convenience. // diff --git a/MobileGL/MG_Test/Pipe/FieldOwnershipTest.cpp b/MobileGL/MG_Test/Pipe/FieldOwnershipTest.cpp index 4f7889a9..5fb142dd 100644 --- a/MobileGL/MG_Test/Pipe/FieldOwnershipTest.cpp +++ b/MobileGL/MG_Test/Pipe/FieldOwnershipTest.cpp @@ -300,7 +300,7 @@ TEST_F(FieldOwnershipTest, VerbBoundaryOpsCoverEveryVerbShapedCall) { EXPECT_EQ(MGPipeVerbForWireOp(MGPWireOp::ResumeStreamOutput), MGPipeVerb::ResumeTransformFeedback); EXPECT_EQ(MGPipeVerbForWireOp(MGPWireOp::GenerateMipmap), MGPipeVerb::GenerateMipmap); EXPECT_EQ(MGPipeVerbForWireOp(MGPWireOp::GetTextureImage), MGPipeVerb::GetTextureImage); - // P5b (docs/archive/contracts/CONTRACT-P5B.md): the renamed boundary the file left to "the phase that + // P5b: the renamed boundary the file left to "the phase that // emits it" - resource_copy_region is glCopyImageSubData only - and the five appended verbs, // each stamped as the GLFunctionsTable verb it reproduces. copy_framebuffer_to_texture also // carries glCopyTexSubImage2D and stamps CopyTexImage2D for both: one kBlitOrCopy mask. diff --git a/MobileGL/MG_Test/Pipe/PipeCatalogueTest.cpp b/MobileGL/MG_Test/Pipe/PipeCatalogueTest.cpp index a9f8ab90..58017af4 100644 --- a/MobileGL/MG_Test/Pipe/PipeCatalogueTest.cpp +++ b/MobileGL/MG_Test/Pipe/PipeCatalogueTest.cpp @@ -137,10 +137,10 @@ TEST(PipeCatalogue, GeneratedTablesHoldTheWholeCatalogue) { EXPECT_EQ(kMGPipeContextCallCount, kMGPipeCallCount - ClassCount()); // The per-class counts PipeCalls.def documents in its header. - // kScreen is 11 + P5c's applier_reset (docs/archive/contracts/CONTRACT-P5C.md §5.1); kCtxObject is + // kScreen is 11 + P5c's applier_reset (§5.1); kCtxObject is // 9 + P5c's object_death (§5.2), the framebuffer family's first wire delete opcode. // kCtxState is 17 + P5c rv's set_context_values (§5.3), the residual-value record, + P5e's - // set_program_bindings (docs/archive/contracts/CONTRACT-P5E.md §1), the post-link binding record. + // set_program_bindings (§1), the post-link binding record. // + P14 S1's bind_context (docs/Disaggregated/design/11-state-ownership.md), the in-band // context binding - a kScreen row for applier_reset's reason: a context switch is a // whole-session edge, not a context-family verb. @@ -148,9 +148,9 @@ TEST(PipeCatalogue, GeneratedTablesHoldTheWholeCatalogue) { EXPECT_EQ(ClassCount(), 8u); EXPECT_EQ(ClassCount(), 13u); EXPECT_EQ(ClassCount(), 19u); - // + P9's get_texture_image_to_buffer (docs/archive/contracts/CONTRACT-P9.md §1), beside get_texture_image. + // + P9's get_texture_image_to_buffer (§1), beside get_texture_image. EXPECT_EQ(ClassCount(), 11u); - // 13 + the five P5b-appended verbs (docs/archive/contracts/CONTRACT-P5B.md): bind_shader_image, + // 13 + the five P5b-appended verbs: bind_shader_image, // patch_parameter, bind_stream_output, set_storage_block_binding, // copy_framebuffer_to_texture; + delete_stream_output; + P9's read_pixels_to_buffer. EXPECT_EQ(ClassCount(), 20u); @@ -588,7 +588,7 @@ TEST(PipeCatalogue, LateArrivalsAreAppendedWithoutRenumbering) { EXPECT_EQ(static_cast(MGPWireOp::QueryTimestamp), 69); EXPECT_EQ(static_cast(MGPWireOp::QueryCounter), 70); EXPECT_EQ(static_cast(MGPWireOp::FenceWaitServer), 71); - // P5b (docs/archive/contracts/CONTRACT-P5B.md) appended five verbs AFTER P0's three late arrivals, by + // P5b appended five verbs AFTER P0's three late arrivals, by // the same rule: opcodes 72..76, and nothing before them moved. The five are pinned by // VALUE, because the pin is the protocol - a row inserted ahead of one would silently // re-point every record a P5b package emits at the wrong arm. @@ -597,7 +597,7 @@ TEST(PipeCatalogue, LateArrivalsAreAppendedWithoutRenumbering) { EXPECT_EQ(static_cast(MGPWireOp::BindStreamOutput), 74); EXPECT_EQ(static_cast(MGPWireOp::SetStorageBlockBinding), 75); EXPECT_EQ(static_cast(MGPWireOp::CopyFramebufferToTexture), 76); - // P5c (docs/archive/contracts/CONTRACT-P5C.md §5) appended the two control records AFTER P5b's five, by + // P5c (§5) appended the two control records AFTER P5b's five, by // the same rule: opcodes 77..78, and nothing before them moved. applier_reset is a kScreen // row (a make-current is a whole-server edge, exactly as FenceWaitServer is a screen call) // and object_death a kCtxObject one; both carry no blob, no reply and no tail. @@ -608,13 +608,13 @@ TEST(PipeCatalogue, LateArrivalsAreAppendedWithoutRenumbering) { // - fixed POD, no blob, no tail, no reply - with an MGPipeApply* entry point, which the two // control records deliberately do not have. EXPECT_EQ(static_cast(MGPWireOp::SetContextValues), 79); - // P5e (docs/archive/contracts/CONTRACT-P5E.md §1) appended ONE more, by the same rule: opcode 80, and + // P5e (§1) appended ONE more, by the same rule: opcode 80, and // nothing before it moved. set_program_bindings is a kCtxState row with THREE tails and a // host span in the third; it lands with a null route and a sink that refuses it by name, // exactly as set_shader_buffers has sat catalogued-and-dead since P4a. EXPECT_EQ(static_cast(MGPWireOp::SetProgramBindings), 80); EXPECT_EQ(static_cast(MGPWireOp::DeleteStreamOutput), 81); - // P9 (docs/archive/contracts/CONTRACT-P9.md §1) appended the two pack-buffer readbacks, by the same rule: + // P9 (§1) appended the two pack-buffer readbacks, by the same rule: // opcodes 82..83, one payload, no flag at all - no reply slot, no blob, no tail. EXPECT_EQ(static_cast(MGPWireOp::ReadPixelsToBuffer), 82); EXPECT_EQ(static_cast(MGPWireOp::GetTextureImageToBuffer), 83); @@ -623,7 +623,7 @@ TEST(PipeCatalogue, LateArrivalsAreAppendedWithoutRenumbering) { // kScreen control record with the applier_reset shape - one POD, no blob, no tail, no reply // and no MGPipeApply* entry point - so the row beside it is pinned the same way. EXPECT_EQ(static_cast(MGPWireOp::BindContext), 84); - // Shared images (docs/archive/notes/anland/plan-ahb-dmabuf.md) appended opcode 85 by the + // Shared images appended opcode 85 by the // same rule: a kScreen row with a reply slot - every operation is answered. EXPECT_EQ(static_cast(MGPWireOp::SharedImage), 85); EXPECT_EQ(static_cast(MGPWireOp::kOpCount), 86); @@ -729,7 +729,7 @@ TEST(PipeCatalogue, LateArrivalsAreAppendedWithoutRenumbering) { EXPECT_EQ(kMGPipeClearValueClassUint + 1, kMGPipeClearValueClassCount); } -// ---- P5e: the wait-class column (docs/archive/contracts/CONTRACT-P5E.md §2.2) -------------------------- +// ---- P5e: the wait-class column (§2.2) -------------------------- // // THE POINT OF THIS CASE IS THAT IT DOES NOT READ PipeCalls.def. Every other statement about // the column - the generated table, the two gates in gen_pipe.py, the static_asserts in @@ -1044,14 +1044,14 @@ TEST(PipeCatalogue, FloatVectorsCompareBitwise) { // a cache that read the padding would mint a fresh CSO per call and the verify lane would // abort at random. TEST(PipeCatalogue, SixValueStructsHaveFieldLists) { - // 72 through P5; P5b appended five call payloads (docs/archive/contracts/CONTRACT-P5B.md: MGPImageBind, + // 72 through P5; P5b appended five call payloads (the contract: MGPImageBind, // MGPPatchParameter, MGPStreamOutputBind, MGPStorageBlockBinding, MGPCopyFromFramebuffer), // each with its own field list, so the comparator sees every one of them: 77. P5c appended // applier_reset's MGPApplierReset (CONTRACT-P5C.md §5.1) - object_death reuses // MGPHandleOnly, which has had a list since P0 - and rv added set_context_values' // MGPContextValues (§5.3): 79. P5e appended set_program_bindings' MGPProgramBindings AND // the two TAIL ELEMENT types beside it, MGPProgramSamplerUnit and MGPProgramStorageOverride - // (docs/archive/contracts/CONTRACT-P5E.md §1) - the tails are listed for the same reason MGPBufferRange + // (§1) - the tails are listed for the same reason MGPBufferRange // and MGPVertexAttribWire are: the comparator has to see INTO an element whose members // include an MGHostSpan and a pad word, or it would memcmp the padding: 82. P9 appended the // pack-buffer readbacks' one payload, MGPReadbackToBuffer (CONTRACT-P9.md §1): 83. P14 S1 @@ -1138,7 +1138,7 @@ TEST(PipeCatalogue, PipelineSubsetMembersArePinned) { // than a claim, since the static_assert beside kMGPipeCallbackCount only proves the two agree. // P9 took two more, neither of which ever had a producer: W2 deleted OnTexturePullRequest (a // texture re-mint never needs the client's texels - the server reads the GPU level and its own -// staged store, docs/archive/notes/p9/W2-REMINT.md), and W3 deleted OnLog (the server's log lines are LogLine +// staged store), and W3 deleted OnLog (the server's log lines are LogLine // frames on the control plane, MG_Remote/Transport/LogForward.h, not reverse records). // // THE CASE NAME STAYS "…HasTenCallbacks" DELIBERATELY. G2/G14 say the ctest name set only ever @@ -1457,18 +1457,18 @@ TEST(PipeCatalogue, EveryUnmigratedEmulationIsNamedOnce) { // new stall class the design admitted. It went because the stall class did: under a transport // the re-mint is the server's own (RequireImageBindableStorageByHandle reads the GPU level and // replays the staged store), the frontend arm that carried the marker is monolith-only, and no - // pull protocol or ResourceSubDataComplete terminator exists (docs/archive/notes/p9/W2-REMINT.md). + // pull protocol or ResourceSubDataComplete terminator exists. // // AND THE LIST HAD DRIFTED BY ONE UNTIL P8-B. The tree carried a sixth name this list never // had: "generate-mipmap-cpu-filter", the split arm's RGB16F/RGB32F refusal in // GenerateMipmapByRecord. P8-B2 retired it (the server filters its own level, // GenerateThreeChannelFloatMipmapOnServer), and P8-B1 retired the split arm's two // "generate-mipmap-storage" sites (the record's plan is the window). Every name left is on a - // MONOLITH arm - the split arms no longer reach an unmigrated emulation (docs/archive/notes/p8/B.md). + // MONOLITH arm - the split arms no longer reach an unmigrated emulation. // // THREE, NOT FOUR (P8-SE). "copy-image-shadow-mirror" sat after the mirror's own // `Transport != Monolith` return, so no transport ever reached it and on monolith it was a - // no-op; the call and the name went together (docs/archive/notes/p8/SE.md). + // no-op; the call and the name went together. // // NONE (P13 W6). "get-tex-image-shadow" sat in GetTexImageViaShadowConversion, the monolith // frontend arm's shadow readback, and the two mipmap names in that arm's storage grow and CPU diff --git a/MobileGL/MG_Test/Pipe/ShaderBufferEmitTest.cpp b/MobileGL/MG_Test/Pipe/ShaderBufferEmitTest.cpp index 2ae6eee0..0bd53adb 100644 --- a/MobileGL/MG_Test/Pipe/ShaderBufferEmitTest.cpp +++ b/MobileGL/MG_Test/Pipe/ShaderBufferEmitTest.cpp @@ -7,7 +7,7 @@ // End of Source File Header // P5e's set_shader_buffers - the INDEXED BUFFER BINDING POINTS - on both sides of the call -// (docs/archive/contracts/CONTRACT-P5E.md §5.6, rulings 10 and 11; package sb). +// (§5.6, rulings 10 and 11; package sb). // // WHAT THIS SUITE IS FOR. Three properties of this family are invisible in a picture and are // exactly what an optimisation or a merge deletes: diff --git a/MobileGL/MG_Test/Pipe/TrackerTest.cpp b/MobileGL/MG_Test/Pipe/TrackerTest.cpp index c86ea556..0d6c9402 100644 --- a/MobileGL/MG_Test/Pipe/TrackerTest.cpp +++ b/MobileGL/MG_Test/Pipe/TrackerTest.cpp @@ -352,7 +352,7 @@ namespace { // the loop above, because "these three, together" is the phase's own scope statement. // // set_stream_output_targets stays UNEMITTED for the whole of P5e (XFB is lockstep by - // escalation, docs/archive/contracts/CONTRACT-P5E.md §5.7) and still names the subsystem, for the + // escalation, the contract §5.7) and still names the subsystem, for the // same reason: the bit answers "which A/B switch owns this family's legacy arm", not // "is there a record on the wire for me today". EXPECT_EQ(MGPipeSubsystemForDirty(MGPipeDirty::NewConstBuffers), kMGPipeSubsystemBufferBindings); diff --git a/MobileGL/MG_Test/Util/PipeStatsTest.cpp b/MobileGL/MG_Test/Util/PipeStatsTest.cpp index 01139fbc..ad2b4830 100644 --- a/MobileGL/MG_Test/Util/PipeStatsTest.cpp +++ b/MobileGL/MG_Test/Util/PipeStatsTest.cpp @@ -568,7 +568,7 @@ namespace { } // P8-D: the Magma wire arm's indirect-draw bracket. Its short names are what the create - // fixtures' measurement (docs/archive/notes/p8/D.md) reads off the server's line, and its long names are + // fixtures' measurement reads off the server's line, and its long names are // what Harness/WireIndirectPeek.cpp's readers expect in the JSON dump. TEST_F(PipeStatsTest, WireIndirectCountersPrintInTheirOwnBracket) { PS::AddCalls(PS::CallClass::WireIndirectNativeDraws, 3); diff --git a/MobileGL/MG_Test/Wire/AdoptInboxTest.cpp b/MobileGL/MG_Test/Wire/AdoptInboxTest.cpp index 1e469de8..67678834 100644 --- a/MobileGL/MG_Test/Wire/AdoptInboxTest.cpp +++ b/MobileGL/MG_Test/Wire/AdoptInboxTest.cpp @@ -6,7 +6,7 @@ // SPDX-License-Identifier: LGPL-3.0-only // End of Source File Header -// P11 B2 (docs/archive/contracts/CONTRACT-P11.md B2). Server::AdoptInbox - T0's Offers matched to their +// P11 B2 (B2). Server::AdoptInbox - T0's Offers matched to their // map_persistent records BY SEQ, never by arrival order - over both aux channels the product has: // the in-process queue (inproc) and a real socket pair with SCM_RIGHTS (fork spawn / unix / fd:). // diff --git a/MobileGL/MG_Test/Wire/AdoptTierStreamTest.cpp b/MobileGL/MG_Test/Wire/AdoptTierStreamTest.cpp index 53bfa900..b69a51c5 100644 --- a/MobileGL/MG_Test/Wire/AdoptTierStreamTest.cpp +++ b/MobileGL/MG_Test/Wire/AdoptTierStreamTest.cpp @@ -6,7 +6,7 @@ // SPDX-License-Identifier: LGPL-3.0-only // End of Source File Header -// P11 A1 (docs/archive/contracts/CONTRACT-P11.md §1): MOBILEGL_IPC_ADOPT_TIER=0/1 ON A STREAM DATA PLANE. +// P11 A1 (§1): MOBILEGL_IPC_ADOPT_TIER=0/1 ON A STREAM DATA PLANE. // // Real servers on loopback TCP and forked peers (P12ServerRig.h), so the session is the product's // two-process tcp session and each side reads its OWN knob, as on the tcp lane: diff --git a/MobileGL/MG_Test/Wire/GlamorEglSequenceTest.cpp b/MobileGL/MG_Test/Wire/GlamorEglSequenceTest.cpp index d5086086..d61dadf2 100644 --- a/MobileGL/MG_Test/Wire/GlamorEglSequenceTest.cpp +++ b/MobileGL/MG_Test/Wire/GlamorEglSequenceTest.cpp @@ -17,7 +17,7 @@ // EGL_EXT_image_dma_buf_import + _modifiers (dmabuf_capable), XRGB8888/ARGB8888 importable, // eglCreateImageKHR(EGL_LINUX_DMA_BUF_EXT) of a shared image's descriptor. // -// And the implicit-sync flush (docs/archive/notes/anland/plan-x11-gpu.md): the shared_image +// And the implicit-sync flush: the shared_image // Flush verb the client sends from glFlush is answered by the server. // // Chrome's GPU process on the same kind of display (a GBM one) is the other dma-buf producer, and it diff --git a/MobileGL/MG_Test/Wire/PipeWireCodecTest.cpp b/MobileGL/MG_Test/Wire/PipeWireCodecTest.cpp index 1bf5e4e3..2c1c9dfa 100644 --- a/MobileGL/MG_Test/Wire/PipeWireCodecTest.cpp +++ b/MobileGL/MG_Test/Wire/PipeWireCodecTest.cpp @@ -1128,7 +1128,7 @@ TEST_F(PipeWireCodecTest, UserIndexSpanExactlyAtSegmentEndReachesTheSink) { } // ===================================================================================== -// P5b (docs/archive/contracts/CONTRACT-P5B.md): one round trip per row the four migration packages consume +// P5b: one round trip per row the four migration packages consume // ===================================================================================== // // The shape is the one above: encode, pump one record through the ring and the decoder, and @@ -1335,7 +1335,7 @@ TEST_F(PipeWireCodecTest, BindStreamOutputReachesTheSink) { } // ===================================================================================== -// P5c ct (docs/archive/contracts/CONTRACT-P5C.md §5): the two control records round-trip +// P5c ct (§5): the two control records round-trip // ===================================================================================== // // Same shape as the P5b rows above: encode, pump, and assert the record reached the RIGHT @@ -1398,7 +1398,7 @@ TEST_F(PipeWireCodecTest, ObjectDeathReachesTheSinkWithItsHandleAndKind) { } // ===================================================================================== -// P5c rv (docs/archive/contracts/CONTRACT-P5C.md §5.3): the residual-value record round-trips +// P5c rv (§5.3): the residual-value record round-trips // ===================================================================================== // // Not a sink row: the decoder's arm runs the REAL applier (MGPipeApplySetContextValues), so @@ -1443,7 +1443,7 @@ TEST_F(PipeWireCodecTest, SetContextValuesRoundTripsIntoPipeInputs) { } // ===================================================================================== -// P5b t2 (docs/archive/contracts/CONTRACT-P5B.md §2 t2). c0b's cases above round-trip each row once; these +// P5b t2 (§2 t2). c0b's cases above round-trip each row once; these // pin the fields t2's EMITTERS actually fill and the one ordering property the span family has. // ===================================================================================== @@ -3271,7 +3271,7 @@ TEST(FenceWireRoundTrip, MissingConsumerDeclinesWithoutInventingASignaledAnswer) } // ===================================================================================== -// P5c ct (docs/archive/contracts/CONTRACT-P5C.md §5): the two control records, through the REAL sink +// P5c ct (§5): the two control records, through the REAL sink // ===================================================================================== // // The codec cases above pin the bytes and the dispatch with a recording sink; these pin what diff --git a/MobileGL/MG_Test/Wire/RemoteClientAdoptT0.inc b/MobileGL/MG_Test/Wire/RemoteClientAdoptT0.inc index ddefd5a5..875023ec 100644 --- a/MobileGL/MG_Test/Wire/RemoteClientAdoptT0.inc +++ b/MobileGL/MG_Test/Wire/RemoteClientAdoptT0.inc @@ -6,7 +6,7 @@ // SPDX-License-Identifier: LGPL-3.0-only // End of Source File Header -// P11 B2 (docs/archive/contracts/CONTRACT-P11.md B2): T0'S PROTOCOL ON THE HOST, over a live inproc session. +// P11 B2 (B2): T0'S PROTOCOL ON THE HOST, over a live inproc session. // // A host has no AHardwareBuffer, so what these prove is the protocol, the negotiation and the // fallback - never GPU correctness, which is the device's (B2's device gates). Two halves: diff --git a/MobileGL/MG_Test/Wire/RemoteClientControls.inc b/MobileGL/MG_Test/Wire/RemoteClientControls.inc index c6a44e87..a0ba7286 100644 --- a/MobileGL/MG_Test/Wire/RemoteClientControls.inc +++ b/MobileGL/MG_Test/Wire/RemoteClientControls.inc @@ -1559,7 +1559,7 @@ TEST(RemoteClientControls, ARefusedCreateUnlatchesItsObjectAndItsNextCreateBlock // // THE ASSERTIONS BELOW ARE THEREFORE A DEBT, NOT A SPEC, and they are written to be LOUD about it: // they pin today's numbers so that whoever lands the signal sees THIS case go red and knows the -// repair started working. docs/archive/notes/p12/UNPUBLISH-GUARD-SIGNALS.md §4-§6 has the rest. +// repair started working. The phase notes §4-§6 have the rest. TEST(RemoteClientControls, DroppedApplierRecordsAreNotRepairedTodayAndThisCaseIsTheDebt) { const auto child = RunInChild([] { ::setenv("MOBILEGL_PIPE_STATS", "1", 1); diff --git a/MobileGL/MG_Test/Wire/RemoteClientTest.cpp b/MobileGL/MG_Test/Wire/RemoteClientTest.cpp index 1361f21a..66788f53 100644 --- a/MobileGL/MG_Test/Wire/RemoteClientTest.cpp +++ b/MobileGL/MG_Test/Wire/RemoteClientTest.cpp @@ -387,7 +387,7 @@ TEST(RemoteEmitTable, SetSwapIntervalIsTheServerForwarderAndNotAFatal) { #endif // MGTEST_HAVE_FORK -// ---- P5b package i1 (docs/archive/contracts/CONTRACT-P5B.md §2 i1) ------------------------------------- +// ---- P5b package i1 (§2 i1) ------------------------------------- TEST(RemoteEmitTable, TheSevenI1SlotsAreClassBAndAreNotTheFatalThunk) { // The census's five measured slots plus the two companions that share their rows. Named @@ -899,7 +899,7 @@ TEST(CapsMirrorTest, TheConsumerBlockDoesNotCollideWithTheFeatureBits) { } // ===================================================================================== -// P5b d1: the draw family's record plan (docs/archive/contracts/CONTRACT-P5B.md §2 d1). These drive the +// P5b d1: the draw family's record plan (§2 d1). These drive the // PRODUCTION derivation the nineteen emitters call - PlanDrawInfo / PlanDrawRange / // PlanDrawIndirect over a RemoteDrawBindings snapshot - so the fields on the wire are pinned // here without a GL context (R-16: the production predicate, not a copy). The bindings' READ @@ -2660,7 +2660,7 @@ TEST(RemoteGuards, ClientPipeInputsFillWithTheApplierIdleIsAllowed) { // =========================================================================================== // P5e (ra) - the wait rule, the present credit and gPipeInputs' ownership -// (docs/archive/contracts/CONTRACT-P5E.md §1, §2.3, §2.4, §3.1, §3.3, §3.5) +// (§1, §2.3, §2.4, §3.1, §3.3, §3.5) // =========================================================================================== // // EVERY CASE BELOW ARMS RUN-AHEAD BY PUBLISHING THE CAP BIT, because that is the only thing diff --git a/MobileGL/MG_Test/Wire/ServerLoopTest.cpp b/MobileGL/MG_Test/Wire/ServerLoopTest.cpp index c677d088..a521109f 100644 --- a/MobileGL/MG_Test/Wire/ServerLoopTest.cpp +++ b/MobileGL/MG_Test/Wire/ServerLoopTest.cpp @@ -2537,7 +2537,7 @@ TEST(StagedShadowProductionTest, TheStreamingIdiomThroughAPoolReuseIsUploadedNot // ===================================================================================== // P5b d1: a draw_vbo record of every d1 shape crosses to the REAL ServerVerbSink with its -// fields intact (docs/archive/contracts/CONTRACT-P5B.md §2 d1). No backend object lives in this process, +// fields intact (§2 d1). No backend object lives in this process, // so each record is DECLINED after the sink has witnessed it - which is exactly the point: // the witness is taken before the backend is consulted, so these cases pin the wire's fields // and not a backend call. The emitter half (GL args -> these fields) is RemoteClientTest's diff --git a/MobileGL/MG_Test/Wire/SessionTest.cpp b/MobileGL/MG_Test/Wire/SessionTest.cpp index c8bfe40a..26a8e3aa 100644 --- a/MobileGL/MG_Test/Wire/SessionTest.cpp +++ b/MobileGL/MG_Test/Wire/SessionTest.cpp @@ -564,7 +564,7 @@ TEST(SessionTest, PresentAckSerialIsWaitedOnWithGreaterOrEqualAndWakesThroughThe } // --------------------------------------------------------------------------- -// P5e (ra) - SEG_EVENT flow control (docs/archive/contracts/CONTRACT-P5E.md §2.6) +// P5e (ra) - SEG_EVENT flow control (§2.6) // --------------------------------------------------------------------------- // // THE DEADLOCK THE CONTRACT ARGUES AWAY HAS TWO HALVES AND THIS IS THE FIRST. A run-ahead diff --git a/MobileGL/MG_Test/Wire/SharedImageTest.cpp b/MobileGL/MG_Test/Wire/SharedImageTest.cpp index adee1f35..99470ece 100644 --- a/MobileGL/MG_Test/Wire/SharedImageTest.cpp +++ b/MobileGL/MG_Test/Wire/SharedImageTest.cpp @@ -6,7 +6,7 @@ // SPDX-License-Identifier: LGPL-3.0-only // End of Source File Header -// Shared images (docs/archive/notes/anland/plan-ahb-dmabuf.md): the server's registry, a +// Shared images: the server's registry, a // session's references, and the aux-socket inbox that carries an import's descriptor beside T0's // Offers. On a host the image memory is a memfd, which is enough for everything here: what is // under test is that a descriptor which travelled through SCM_RIGHTS still names its image. diff --git a/MobileGL/MG_Test/Wire/StagedTextureStoreTest.cpp b/MobileGL/MG_Test/Wire/StagedTextureStoreTest.cpp index f396b556..41de83a1 100644 --- a/MobileGL/MG_Test/Wire/StagedTextureStoreTest.cpp +++ b/MobileGL/MG_Test/Wire/StagedTextureStoreTest.cpp @@ -397,7 +397,7 @@ TEST(StagedTextureStoreTest, TheGpuDirtyMarkIsTheServersOwnDirtyAnswer) { EXPECT_EQ(monolithStore.TrackedResources(), 0u); } -// ---- P8-E (docs/archive/notes/p8/E.md): the store follows glCopyImageSubData ----------- +// ---- P8-E: the store follows glCopyImageSubData ----------- // // Two 4x4 RGBA8 levels (four bytes a texel), each adopted whole with a distinct byte pattern so a // mis-addressed row or a swapped endpoint shows as a wrong byte, not a coincidentally right one. diff --git a/docs/Disaggregated/ARCHITECTURE.md b/docs/Disaggregated/ARCHITECTURE.md index 6989b75f..5a368d4a 100644 --- a/docs/Disaggregated/ARCHITECTURE.md +++ b/docs/Disaggregated/ARCHITECTURE.md @@ -1,6 +1,6 @@ # 设计与架构(索引) -> 这一页只有设计要点和章节去向;每一部分的完整设计在 [`design/`](design/)。章节编号 §1–§17、附 A / B 沿用至今,代码注释里写的 `ARCHITECTURE.md §N` 按下表找到对应文件。各阶段的 wire 契约原文已冻结在 `docs/archive/contracts/CONTRACT-*.md`,与设计文字冲突时以更新的契约为准。 +> 这一页只有设计要点和章节去向;每一部分的完整设计在 [`design/`](design/)。章节编号 §1–§17、附 A / B 沿用至今,代码注释里写的 `ARCHITECTURE.md §N` 按下表找到对应文件。各阶段的 wire 契约原文见 git 历史,与设计文字冲突时以更新的契约为准。 ## 一句话 @@ -32,5 +32,5 @@ | 12–13 | persistent map 与大缓冲采纳;回读、往返清单、五部分验证门 | [`design/07-memory-readback-verification.md`](design/07-memory-readback-verification.md) | | 14–15 | 帧节奏与线程;进程、握手、EGL、Android(含上屏 server)、崩溃处理 | [`design/08-runtime-and-platform.md`](design/08-runtime-and-platform.md) | | 16、附 A、附 B | 源码目录与构建选项;全部开关;边界计数器 | [`design/09-build-switches-counters.md`](design/09-build-switches-counters.md) | -| 17 | 各阶段落地时的形状与仍生效的规则(链到 `docs/archive/notes/`) | [`design/10-phase-shapes.md`](design/10-phase-shapes.md) | +| 17 | 各阶段落地时的形状与仍生效的规则(原文见 git 历史) | [`design/10-phase-shapes.md`](design/10-phase-shapes.md) | | — | 状态归属:多 session / 多 context / share group(anland 统一 server 前置) | [`design/11-state-ownership.md`](design/11-state-ownership.md) | diff --git a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md index ed6efcb7..f97df837 100644 --- a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md +++ b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md @@ -1,6 +1,6 @@ # 当前阶段:P13 已收官(2026-10-07);下一阶段 P14 -> **更新 2026-10-07**。这一页只有摘要;计划与裁定在 [`docs/archive/notes/p13/PLAN-P13.md`](../archive/notes/p13/PLAN-P13.md)、[`docs/archive/notes/p13/INTEGRATOR-DECISIONS-P13.md`](../archive/notes/p13/INTEGRATOR-DECISIONS-P13.md),逐波记录在 [`docs/archive/notes/p13/README.md`](../archive/notes/p13/README.md)。上一阶段 P8 于 09-30 收官,见 [`docs/archive/notes/p8/README.md`](../archive/notes/p8/README.md)。 +> **更新 2026-10-07**。这一页只有摘要;计划与裁定见 git 历史。上一阶段 P8 于 09-30 收官。 ## 目标 @@ -23,4 +23,4 @@ **P14**:状态归属(同进程多 session / 多 context / share group),设计见 [`design/11-state-ownership.md`](design/11-state-ownership.md)。性能轮(基线 `dev` 构建,定频,FCL MC + anland glmark2,两后端)也排在 P13 之后。 -**待用户决策**:[`DEBTS.md`](DEBTS.md) 中「需裁定」各项;FCL 无声死亡留给用户(`docs/archive/notes/p13/fcl-soak/README.md`)。 +**待用户决策**:[`DEBTS.md`](DEBTS.md) 中「需裁定」各项;FCL 无声死亡留给用户(细节见 git 历史)。 diff --git a/docs/Disaggregated/DEBTS.md b/docs/Disaggregated/DEBTS.md index f56cf0d4..8373b052 100644 --- a/docs/Disaggregated/DEBTS.md +++ b/docs/Disaggregated/DEBTS.md @@ -4,7 +4,7 @@ > > **2026-10-07(P13 收官)关闭三行**:ID-P8-13(9 条 monolith 缺陷——monolith 换到记录臂后对应 monolith 登记在集成车道上全过,旧的 monolith 前端臂在 W6 删除)、ID-P8-14(`SyncClientSideVertexArraysForIndirectFetch` 的整 buffer 回读与 Magma monolith 深度 mip 的 view 类型都属于已删的 monolith 前端臂)、`MOBILEGL_PIPE_TEXEL_RETAIN_MB`(W3b 随 pull 构建删除)。新增两行:W9 缓存容量重调与 Magma monolith 性能,都排在 P13 之后的性能轮,基线是 `dev` 构建。 > -> 路线图只列"有债务、看这里"。每条写明去向;已关闭的历史债与当时的完整债务表见 [`docs/archive/notes/p5b/README.md`](../archive/notes/p5b/README.md) 末节。开放问题另见 [`OPEN-QUESTIONS.md`](OPEN-QUESTIONS.md)。更新:2026-09-30(P8 第二波;按债务审查重排。同日:create-indirect 换成派生 fixture `minecraft-1.21.1-neoforge-create-indirect-in-world-align1024`(不是原抓取,16 字节对齐的 SSBO 范围绑定挪到 1024 对齐),ID-P8-14、ID-P8-19 两条关闭——红米两后端 monolith / spawn 全过,Magma spawn 不再丢设备)。去向「需裁定」= 等用户定;「可进行」= 随时可开的小修,不依赖别的阶段。 +> 路线图只列"有债务、看这里"。每条写明去向;已关闭的历史债与当时的完整债务表见 git 历史。开放问题另见 [`OPEN-QUESTIONS.md`](OPEN-QUESTIONS.md)。更新:2026-09-30(P8 第二波;按债务审查重排。同日:create-indirect 换成派生 fixture `minecraft-1.21.1-neoforge-create-indirect-in-world-align1024`(不是原抓取,16 字节对齐的 SSBO 范围绑定挪到 1024 对齐),ID-P8-14、ID-P8-19 两条关闭——红米两后端 monolith / spawn 全过,Magma spawn 不再丢设备)。去向「需裁定」= 等用户定;「可进行」= 随时可开的小修,不依赖别的阶段。 | 债务 | 去向 | |---|---| @@ -26,12 +26,12 @@ | P8 转出(E):driver-written 标按整张纹理打(`GenerateMipmap` 也打),驱动拒读时连基级也具名拒绝,偏保守;跨格式拷贝 store 不跟随;拒绝仍是会话 Fatal(要改回包状态才能答 `GL_INVALID_OPERATION`) | 小修(按 level 打标);其余按需 | | P8 转出(B):`PipeCalls.def:260` `GenerateMipmap` 仍是 `kWaitApplied`,裁定 14 的理由(CPU 滤波碰 client 影子)已不成立,可改 `kWaitNone` | 性能工作(协议行为变更,需单独裁定) | | P8 转出(C):server SSBO 标记过近似(窗口内每个绑定的 SSBO 都标);一个留在 SSBO 绑定上又当 restart EBO 用的 buffer 每次 draw 都回读 | 性能工作 | -| P13 转出(ID-P13-2,P14 更新):Magma monolith 记录臂对 dev(pull)——trace 上已基本追平:rd12 83.8 对 87.0 fps(−4%),openra 747 对 293(dev 在那里等 GPU);P14 最大一项是 `553eb86d`(纹理层上传不再在 CPU 上等 GPU 排空,rd12 70→83)。但 **FCL MC 上仍差**:monolith 171 对 dev 232(−26%),inproc 195;呈现线程 CPU 只占约 2.8 / 5.8 ms 帧,其余是等待——与 trace 不同的另一处等待 | 下一阶段第一项:FCL Magma monolith 做 off-CPU profile(`--trace-offcpu`,同找到上传等待的方法;P14 收官时两次采集都没抓到游戏帧),找出那 3 ms 等待;数字见 `docs/archive/notes/perf-p14/README.md` | -| ~~P13 转出(W9):缓存容量重调~~ **P14 关闭(读数)**:`MOBILEGL_PIPE_STATS` 在 rd12 / openra 上 render-state CSO 稳态每帧新铸 0 个,Magma 管线 memo 命中 99.0% / 92.7%,没有缓存抖动,P8 容量保留 | 已关闭(`docs/archive/notes/perf-p14/BENCH.md` W9 节) | -| P14 转出:Espryt monolith 记录臂对 dev(pull)rd12 91.1 对 115.2 fps(−21%);FCL MC 198 对 229(−13%)。渲染线程每帧 CPU 11.56 对 9.07 ms:client half +1.39(validate 0.92:EmitGlobalConstants 0.17、EmitVertexElements 0.13、Tracker::Update 0.12、CopyField 0.10、validate 自身 0.10、EmitVertexBuffers 0.07;verb port 约 0.2)、backend +0.45(SyncNeccessaryTextures +0.14、SyncNeccessaryBuffers +0.08、AdoptUnchangedBufferSets +0.09、BindCurrentProgramWithResources +0.07、SyncCurrentProgramByHandle +0.05)、driver +0.33、applier +0.07。每项都在帧时间 2% 以下;合起来是记录臂的结构成本:pull 的后端在 draw 时按指针读前端对象,push 要检测变化(tracker)、序列化(emitter、uniform span)、应用(applier)、再由后端按句柄经 slot 表重新解析,并且因为后端看不到前端脏位而对每个绑定对象做 clean 检查——每步每 draw 几十 ns、各自是不相干的冷 cache 行,乘以 1471 draw/帧 | 下一阶段:per-(VAO, program) draw-packet 缓存(设计草稿 `docs/archive/notes/perf-p14/NEXT-draw-packet-cache.md`,估计 rd12 Espryt monolith 回收 1.0–1.6 ms/帧,约 91→100–106 fps);先只做 client half 原型量 | +| P13 转出(ID-P13-2,P14 更新):Magma monolith 记录臂对 dev(pull)——trace 上已基本追平:rd12 83.8 对 87.0 fps(−4%),openra 747 对 293(dev 在那里等 GPU);P14 最大一项是 `553eb86d`(纹理层上传不再在 CPU 上等 GPU 排空,rd12 70→83)。但 **FCL MC 上仍差**:monolith 171 对 dev 232(−26%),inproc 195;呈现线程 CPU 只占约 2.8 / 5.8 ms 帧,其余是等待——与 trace 不同的另一处等待 | 下一阶段第一项:FCL Magma monolith 做 off-CPU profile(`--trace-offcpu`,同找到上传等待的方法;P14 收官时两次采集都没抓到游戏帧),找出那 3 ms 等待;数字见 git 历史 | +| ~~P13 转出(W9):缓存容量重调~~ **P14 关闭(读数)**:`MOBILEGL_PIPE_STATS` 在 rd12 / openra 上 render-state CSO 稳态每帧新铸 0 个,Magma 管线 memo 命中 99.0% / 92.7%,没有缓存抖动,P8 容量保留 | 已关闭(W9 节,见 git 历史) | +| P14 转出:Espryt monolith 记录臂对 dev(pull)rd12 91.1 对 115.2 fps(−21%);FCL MC 198 对 229(−13%)。渲染线程每帧 CPU 11.56 对 9.07 ms:client half +1.39(validate 0.92:EmitGlobalConstants 0.17、EmitVertexElements 0.13、Tracker::Update 0.12、CopyField 0.10、validate 自身 0.10、EmitVertexBuffers 0.07;verb port 约 0.2)、backend +0.45(SyncNeccessaryTextures +0.14、SyncNeccessaryBuffers +0.08、AdoptUnchangedBufferSets +0.09、BindCurrentProgramWithResources +0.07、SyncCurrentProgramByHandle +0.05)、driver +0.33、applier +0.07。每项都在帧时间 2% 以下;合起来是记录臂的结构成本:pull 的后端在 draw 时按指针读前端对象,push 要检测变化(tracker)、序列化(emitter、uniform span)、应用(applier)、再由后端按句柄经 slot 表重新解析,并且因为后端看不到前端脏位而对每个绑定对象做 clean 检查——每步每 draw 几十 ns、各自是不相干的冷 cache 行,乘以 1471 draw/帧 | 下一阶段:per-(VAO, program) draw-packet 缓存(设计草稿(见 git 历史),估计 rd12 Espryt monolith 回收 1.0–1.6 ms/帧,约 91→100–106 fps);先只做 client half 原型量 | | P14 转出:Espryt monolith 的 driver 项 +0.33 ms/帧(2.9%),全在 `glDrawElements` 内部,GL 调用组合与 dev 相同。`simpleperf stat`(整次运行、渲染线程):feat 比 dev 多执行 16.6% 指令、L1D refill 多 56%、L2D 多 23%(IPC 3.73 对 3.86)。推断:记录臂每 draw 更大的工作集(record、applier 状态、slot 表、twin)把驱动的状态挤出 cache——这是计数器推断,没有在驱动内部测量 | 随 draw-packet 缓存一起验证:落地前后量 L1D refill 与 driver ms/帧;如果 driver 项不降,推断不成立,再单独查 | | P14 转出(测过未做):Tracker / residual 的前端变更 epoch 快路径——在每个 `DECLARE_GL_FUNCTION_END` 入口(除 draw、`glBindVertexArray`、浮点 `glUniform*` 外)以及手写入口和 EGL 入口里 bump 一个上下文 epoch;epoch 未动时 validate 只重算 VAO / program 派生的 shutter(上限约 0.07 ms),再经审计哪些 residual 字段依赖 VAO / program 绑定后跳过 residual copy(合计 0.15–0.25 ms,1.5–2%) | 各自低于 2% 门槛,且漏 bump 一个入口就渲染陈旧状态;并入 draw-packet 设计(其 §3 的上下文 epoch 就是它),不单独做 | -| P13 转出(FCL 浸泡,用户裁定:FCL 暂不改、MobileGL 不做规避):FCL game process can die silently (exit SIGNALED status=34, SIGRTMIN+2): the JVM signal reset after renderer selection drops libcore's AsynchronousCloseMonitor handler, and FCL's okhttp/Okio watchdog then kills the process; renderer-independent (reproduced on P12 and P13 libraries, both backends; untested with other renderers)。浸泡:P13 库 30 次(Magma 22 / Espryt 8)死 18 次、P12 库 10 次死 2 次;P12 / P13 逐次交替的对照(同场景同网络时段)P12 4/10、P13 2/10,时间线(`Renderer:` 行到 MobileGL 首行约 6.2 s、晚死固定在其后约 9.4 s)两库相同,无证据表明 MobileGL 拉高概率;全部 status=34,无 tombstone、无 kgsl;证据与机理见 [`docs/archive/notes/p13/fcl-soak/README.md`](../archive/notes/p13/fcl-soak/README.md) | fix belongs in FCL (save/restore libcore's SIGRTMIN+2 sigaction around JVM creation); left for the user | +| P13 转出(FCL 浸泡,用户裁定:FCL 暂不改、MobileGL 不做规避):FCL game process can die silently (exit SIGNALED status=34, SIGRTMIN+2): the JVM signal reset after renderer selection drops libcore's AsynchronousCloseMonitor handler, and FCL's okhttp/Okio watchdog then kills the process; renderer-independent (reproduced on P12 and P13 libraries, both backends; untested with other renderers)。浸泡:P13 库 30 次(Magma 22 / Espryt 8)死 18 次、P12 库 10 次死 2 次;P12 / P13 逐次交替的对照(同场景同网络时段)P12 4/10、P13 2/10,时间线(`Renderer:` 行到 MobileGL 首行约 6.2 s、晚死固定在其后约 9.4 s)两库相同,无证据表明 MobileGL 拉高概率;全部 status=34,无 tombstone、无 kgsl;证据与机理见 git 历史 | fix belongs in FCL (save/restore libcore's SIGRTMIN+2 sigaction around JVM creation); left for the user | | P8 转出(MD):dev 的 `RingAllocateSlow` 在出错的上下文上无上限地排水(设备上挂在 `glFinish`) | 小修(dev) | | P8 转出:`LogForwardChannel.APeerThatStopsReadingCostsWarnLinesNotTheCallersTime` 在负载下超时(两次),单跑必过 | 小修(放宽时限或隔离) | | P8 转出(SV):`gen_pipe_dirty_surface.py` 扫描集成测试源,测试成员名与 GLContext 成员同名(如 `m_parameters`)会静默弄坏它的自检;`.Mip3DValidation.` 在没装校验层的车道上是失败不是跳过 | 小修 / CI 记录 | @@ -42,11 +42,11 @@ | P11 转出(M2,给 dev):dev 的 `DirectVulkan.SplitRecording.` 车道没有 `RESOURCE_LOCK`、其用例读字面日志路径——`-j` 下可能互相截断;P11 线的副本已修(Magma 空 uniform 的重复修复已在 ID-P8-17 合成一条) | 下次向 dev 回流时带上 | | P11 转出(M2):超过 stage 分块预算的大层按分片发出,没有写入框覆盖的分片仍带整框(server 要靠它拼层图),会把影子盖到 GPU 写过的地方;修法要一个两个 server 都跳过的「只定位」区域写法,控制协议修订 +1(split 专属,早于 P11) | 小包或 P8 | | P11 转出(M2):上传仍有两种有损形状,各记一次日志——一层的精确写入框超过 4096 个时按存储的矩形表覆盖发出;applier 一个条目累计超过 4096 个区域时并成并集框。纹理带 GPU 写时两者都会把影子盖进空隙 | 小修,无触发报告 | -| P10 转出(性能):设备上 tcp loopback 的 rd12 每帧 19.4 ms 中 ~11.2 ms 是生产者在 stream 传输里的停车(发送 + 环 / stage / ack 等待),credit 等待只有 ~0.2 ms(`docs/archive/notes/p10/C-MEASUREMENTS.md` §2,ID-P10-13) | 路线图推完后的性能工作 | -| P11 转出(性能):设备上 MC 26.3,split T2 相对单进程采纳的 p99 Espryt +37–42%、Magma 约 2.5×;其中一部分是线程落位——server apply 线程钉在 6–7 核,client GL 线程多半落到慢核,每帧 CPU 约 2.3×(`docs/archive/notes/p11/A-DEVICE.md`)。RSS 一半已由 B2(T0)交付:峰值内存 Espryt −41–42%、Magma −18–26%(ID-P11-17) | 路线图推完后的性能工作(p99 与线程落位) | +| P10 转出(性能):设备上 tcp loopback 的 rd12 每帧 19.4 ms 中 ~11.2 ms 是生产者在 stream 传输里的停车(发送 + 环 / stage / ack 等待),credit 等待只有 ~0.2 ms(见 git 历史 §2,ID-P10-13) | 路线图推完后的性能工作 | +| P11 转出(性能):设备上 MC 26.3,split T2 相对单进程采纳的 p99 Espryt +37–42%、Magma 约 2.5×;其中一部分是线程落位——server apply 线程钉在 6–7 核,client GL 线程多半落到慢核,每帧 CPU 约 2.3×(见 git 历史)。RSS 一半已由 B2(T0)交付:峰值内存 Espryt −41–42%、Magma −18–26%(ID-P11-17) | 路线图推完后的性能工作(p99 与线程落位) | | P11 转出(B2,性能):`glBufferStorage(NULL)` 的采纳先把整块零存储当 `resource_subdata` 发一遍(T2 与 T0 都是;MC 26.3 8 个存储、441.5 MiB) | 路线图推完后的性能工作 | | P12 未做:DirectGLES `g_Display` / `g_Surface` / `g_Context` 仍是全局(每进程一个会话时不需要);cached-app freezer 的完整处理(文档从未定义);多 context;server 窗口不转发输入 | 等出现第二个会话 / 第二个 context 的需求 | | P9 转出:Magma 每次 draw 对可写 SSBO / texel buffer / XFB 目标发整 buffer 的 `OnGpuWritten`(create-indirect 首帧 7,093 条),client 已自标同一批,冗余无害;`OnMipLevelsGenerated`、`OnCapsInvalidated` 仍无生产者。`OnTextureWriteback` 也无生产者,但别删:CPU 三通道 mip 退路要它(`CONTRACT-P5B.md:255`) | 以后的收窄 / 清理候选(ID-P9-7) | -| 树外脚本:普查跑器、`wsl_p5_gate.sh` 等在 `~/w7/notes/`,git merge 不会传播;`docs/archive/notes/p11/gate.sh` 是事实上的门 | 需要时入库 | +| 树外脚本:普查跑器、`wsl_p5_gate.sh` 等在 `~/w7/notes/`,git merge 不会传播;事实上的门脚本见 git 历史 | 需要时入库 | -已关闭的历史债(P5 的 27 个 wrong-answer、`rsp` 残余读、P5b 的 inproc 依赖、ABI 指纹、默认 staging 装不下 128 MiB 上传、184 符号棘轮 CI 门)及当时的完整债务表见 [`docs/archive/notes/p5b/README.md`](../archive/notes/p5b/README.md) 末节。 +已关闭的历史债(P5 的 27 个 wrong-answer、`rsp` 残余读、P5b 的 inproc 依赖、ABI 指纹、默认 staging 装不下 128 MiB 上传、184 符号棘轮 CI 门)及当时的完整债务表见 git 历史。 diff --git a/docs/Disaggregated/MEASUREMENTS.md b/docs/Disaggregated/MEASUREMENTS.md index 308247ff..dd613303 100644 --- a/docs/Disaggregated/MEASUREMENTS.md +++ b/docs/Disaggregated/MEASUREMENTS.md @@ -1,6 +1,6 @@ # 实测(索引) -> 这一页只有结论和去向;完整的表、命令、协议与读法在各阶段 `docs/archive/notes/<阶段>/README.md` 的"实测"节。代码和旧笔记里的 `MEASUREMENTS.md §N` 按下表"§"列找到对应阶段(小节编号在那里原样保留)。 +> 这一页只有结论和去向;完整的表、命令、协议与读法在各阶段的"实测"节(原文见 git 历史)。代码和旧笔记里的 `MEASUREMENTS.md §N` 按下表"§"列找到对应阶段(小节编号在那里原样保留)。 **口径**:性能只记录、不设门;看**逐线程 CPU 时间**,不看整机帧率。性能对比只用一台手机(Redmi `2f7cbe2e`,Adreno 830),定频、同热窗口、两臂交替跑([`guide/pin-verification-2026-09-07.md`](guide/pin-verification-2026-09-07.md))。 @@ -25,29 +25,29 @@ 这解释了 handoff §3.6「换快 3.4 倍的链路墙钟不变」:钱花在设备每次唤醒上;handoff §3.2 那 249 s 是在**未定频**的机器上取的,含这份空闲税。 **同一个诊断给出一条可移植修法**:把服务端的自旋预算调大(Activity 的 `env` extra → `MOBILEGL_IPC_SPIN_US=2000`,不需要 root、不需要改代码), 那一帧 **221.5 s → 182.8 s(−17%)**;设备定频+关深度空闲则是 **166.5 s(−25%)**。服务端日志会打印 `spin 2000 us` 自证。 - 见 [`docs/archive/notes/p12/DEVICELOST-AND-UPLOAD-WAITS.md`](../archive/notes/p12/DEVICELOST-AND-UPLOAD-WAITS.md) §2.6–2.10。 + 见 git 历史 §2.6–2.10。 - **画面正确**:Vulkan 后端真机画面检查 36/36 通过,CTS 五块相对基线没有超过 0.5 个百分点的退步、没有新崩溃(P7);server 自有窗口上屏两后端 SSIM 1.0(P12)。 -- **五臂传输对比(2026-09-28,未定频交错 A/B)**:重负载(rd12)下 inproc ≈ spawn+shm 比 monolith **快约 1/3**(run-ahead 流水线并行 + applier 路径探针更少),轻负载(openra)下 split 只付固定开销;**tcp localhost 慢 ~8 倍,瓶颈是 present credit=1 的串行等待(~74%)+ futex 唤醒税**,`MOBILEGL_IPC_SPIN_US=2000` 单项实测 21.7→63.6 fps;跨主机 TCP 的「`eglMakeCurrent` hang」**是测试环境造成的**(主机 v2rayN `xray_tun` 代理终结 TCP 后中继卡住,不是源码 bug);绕开后 P12 出口门 (b) 通过:WSL client 经 Wi-Fi 重放 rd12 世界内 trace,ssim 0.999883,稳态 17–22 fps(`PRESENT_CREDIT` 1/2/3 = 16.9 / 21.3 / 22.1),openra 稳态 105–133 fps;加载帧 2.7 GB 受带宽约束(server 实测 52 MB/s),稳态受往返延迟(20–24 MB/s)。全文 [`docs/archive/notes/perf-five-arm-20260928`](../archive/notes/perf-five-arm-20260928/README.md)。 +- **五臂传输对比(2026-09-28,未定频交错 A/B)**:重负载(rd12)下 inproc ≈ spawn+shm 比 monolith **快约 1/3**(run-ahead 流水线并行 + applier 路径探针更少),轻负载(openra)下 split 只付固定开销;**tcp localhost 慢 ~8 倍,瓶颈是 present credit=1 的串行等待(~74%)+ futex 唤醒税**,`MOBILEGL_IPC_SPIN_US=2000` 单项实测 21.7→63.6 fps;跨主机 TCP 的「`eglMakeCurrent` hang」**是测试环境造成的**(主机 v2rayN `xray_tun` 代理终结 TCP 后中继卡住,不是源码 bug);绕开后 P12 出口门 (b) 通过:WSL client 经 Wi-Fi 重放 rd12 世界内 trace,ssim 0.999883,稳态 17–22 fps(`PRESENT_CREDIT` 1/2/3 = 16.9 / 21.3 / 22.1),openra 稳态 105–133 fps;加载帧 2.7 GB 受带宽约束(server 实测 52 MB/s),稳态受往返延迟(20–24 MB/s)。全文见 git 历史。 ## 按阶段 | § | 阶段 | 一句结论 | 全文 | |---|---|---|---| -| 1 | P0 | 能从应用进程拉起第二个进程;跨进程共享 GPU 内存只有一条路在所有设备上可用 | [`docs/archive/notes/p0`](../archive/notes/p0/README.md) | -| 2 | P1 | 逐 draw 核对推送状态,79 条 trace 零分歧 | [`docs/archive/notes/p1`](../archive/notes/p1/README.md) | -| 3 | P2 | 桌面基准:新 tracker 比它替掉的旧填充更便宜 | [`docs/archive/notes/p2`](../archive/notes/p2/README.md) | -| 4 | P3a | 两机真机 Release:接口代价 +6–12%,VAO 切换密集的场景 +27–30% | [`docs/archive/notes/p3a`](../archive/notes/p3a/README.md) | -| 5 | P4a | 换到 Redmi;P4a 自己只加 3–6 个百分点 | [`docs/archive/notes/p4a`](../archive/notes/p4a/README.md) | -| 6 | P5 | 两线程第一帧画对;真机两线程臂还跑不完 | [`docs/archive/notes/p5`](../archive/notes/p5/README.md) | -| 7 | P5b | 真机两线程跑通四条游戏 trace;两线程额外代价 +6–18% | [`docs/archive/notes/p5b`](../archive/notes/p5b/README.md) | -| 8 | P5c | 两线程之间零共享内存后,全部测试仍绿 | [`docs/archive/notes/p5c`](../archive/notes/p5c/README.md) | -| 9 | P5d | 游戏内 7–13 → 103–106 fps,client CPU 15.0 → 9.2 ms/帧 | [`docs/archive/notes/p5d`](../archive/notes/p5d/README.md) | -| 10–11 | P5e | 发完就走比每条都等快 69%;重负载下与单线程持平 | [`docs/archive/notes/p5e`](../archive/notes/p5e/README.md) | -| 12 | P6 | 两进程与两线程持平;每帧数据量与记录数首次实测 | [`docs/archive/notes/p6`](../archive/notes/p6/README.md) | -| 13 | P3b/P4b | 纹理上传形状在四种拓扑下完全一致 | [`docs/archive/notes/p34b`](../archive/notes/p34b/README.md) | -| 14 | P6.5 | 跨机 TCP 102/102;断线约 5 s 检测到 | [`docs/archive/notes/p65`](../archive/notes/p65/README.md) | -| 15 | P7 | 真机画面 36/36;server 内存无界增长收住(主机 825 → 546 MiB) | [`docs/archive/notes/p7`](../archive/notes/p7/README.md) | -| 16 | P12 | 审查后真机复测:Espryt SSIM 1.0;Magma 1.0 / 0.999999511;P12 定向 CTest 46/46;纹理上传回包等待 1→0(主机机制门,真机墙钟待测);**P12 已收官(09-29)**:跨机 TCP 门 (b) 通过(rd12 ssim 0.999883、稳态 17–22 fps);FCL 门 (a) 通过(Minecraft 上屏到 render server 窗口,杀 server 后 33–54 ms 闩住 device-lost) | [`docs/archive/notes/p12`](../archive/notes/p12/README.md) | -| 17 | 五臂传输测量(2026-09-28,非阶段) | inproc/shm 重负载比 monolith 快 ~1/3;tcp localhost 瓶颈是 credit=1 + 唤醒税(SPIN_US=2000 → 2.9×);跨主机 hang 实为主机 xray TUN 代理造成;直连 Wi-Fi 稳态 rd12 17–22 fps、openra 105–133 fps | [`docs/archive/notes/perf-five-arm-20260928`](../archive/notes/perf-five-arm-20260928/README.md) | -| 18 | P11 | 同机零拷贝(T0)MC 26.3 峰值内存 Espryt −41–42%、Magma −18–26%,ssim / 帧时 / CPU 不变;外部 client 走共享内存 rd12 Espryt 约 119 fps(TCP 40–53);split T2 相对单进程采纳 p99 Espryt +37–42%、Magma 约 2.5×。未量:M2 后 split server 上纹理无 GPU 写时 Espryt 自己按存储阈值取舍精确写入框,非 ring 路径可能多发几个小框 | [`docs/archive/notes/p11`](../archive/notes/p11/README.md) | -| 19 | P8 | 真实内容只 Magma wire indirect 命中(MC 26.3 × Magma inproc 1,300 万 draw CPU 展开)→ 原生后 create-indirect 每次整 GPU 等待 321 → 0;红米 create-instancing × Espryt × monolith 0.870 → 0.99998(Adreno 丢排队环形拷贝,dev + feat 两条阶梯);最大 program archive 355 KB = arena/4 的 4.2 %(不分片);出口设备矩阵 77 格 / 臂无一变差 | [`docs/archive/notes/p8`](../archive/notes/p8/README.md) | +| 1 | P0 | 能从应用进程拉起第二个进程;跨进程共享 GPU 内存只有一条路在所有设备上可用 | git 历史 | +| 2 | P1 | 逐 draw 核对推送状态,79 条 trace 零分歧 | git 历史 | +| 3 | P2 | 桌面基准:新 tracker 比它替掉的旧填充更便宜 | git 历史 | +| 4 | P3a | 两机真机 Release:接口代价 +6–12%,VAO 切换密集的场景 +27–30% | git 历史 | +| 5 | P4a | 换到 Redmi;P4a 自己只加 3–6 个百分点 | git 历史 | +| 6 | P5 | 两线程第一帧画对;真机两线程臂还跑不完 | git 历史 | +| 7 | P5b | 真机两线程跑通四条游戏 trace;两线程额外代价 +6–18% | git 历史 | +| 8 | P5c | 两线程之间零共享内存后,全部测试仍绿 | git 历史 | +| 9 | P5d | 游戏内 7–13 → 103–106 fps,client CPU 15.0 → 9.2 ms/帧 | git 历史 | +| 10–11 | P5e | 发完就走比每条都等快 69%;重负载下与单线程持平 | git 历史 | +| 12 | P6 | 两进程与两线程持平;每帧数据量与记录数首次实测 | git 历史 | +| 13 | P3b/P4b | 纹理上传形状在四种拓扑下完全一致 | git 历史 | +| 14 | P6.5 | 跨机 TCP 102/102;断线约 5 s 检测到 | git 历史 | +| 15 | P7 | 真机画面 36/36;server 内存无界增长收住(主机 825 → 546 MiB) | git 历史 | +| 16 | P12 | 审查后真机复测:Espryt SSIM 1.0;Magma 1.0 / 0.999999511;P12 定向 CTest 46/46;纹理上传回包等待 1→0(主机机制门,真机墙钟待测);**P12 已收官(09-29)**:跨机 TCP 门 (b) 通过(rd12 ssim 0.999883、稳态 17–22 fps);FCL 门 (a) 通过(Minecraft 上屏到 render server 窗口,杀 server 后 33–54 ms 闩住 device-lost) | git 历史 | +| 17 | 五臂传输测量(2026-09-28,非阶段) | inproc/shm 重负载比 monolith 快 ~1/3;tcp localhost 瓶颈是 credit=1 + 唤醒税(SPIN_US=2000 → 2.9×);跨主机 hang 实为主机 xray TUN 代理造成;直连 Wi-Fi 稳态 rd12 17–22 fps、openra 105–133 fps | git 历史 | +| 18 | P11 | 同机零拷贝(T0)MC 26.3 峰值内存 Espryt −41–42%、Magma −18–26%,ssim / 帧时 / CPU 不变;外部 client 走共享内存 rd12 Espryt 约 119 fps(TCP 40–53);split T2 相对单进程采纳 p99 Espryt +37–42%、Magma 约 2.5×。未量:M2 后 split server 上纹理无 GPU 写时 Espryt 自己按存储阈值取舍精确写入框,非 ring 路径可能多发几个小框 | git 历史 | +| 19 | P8 | 真实内容只 Magma wire indirect 命中(MC 26.3 × Magma inproc 1,300 万 draw CPU 展开)→ 原生后 create-indirect 每次整 GPU 等待 321 → 0;红米 create-instancing × Espryt × monolith 0.870 → 0.99998(Adreno 丢排队环形拷贝,dev + feat 两条阶梯);最大 program archive 355 KB = arena/4 的 4.2 %(不分片);出口设备矩阵 77 格 / 臂无一变差 | git 历史 | diff --git a/docs/Disaggregated/OPEN-QUESTIONS.md b/docs/Disaggregated/OPEN-QUESTIONS.md index 3705db09..c3eb6465 100644 --- a/docs/Disaggregated/OPEN-QUESTIONS.md +++ b/docs/Disaggregated/OPEN-QUESTIONS.md @@ -5,7 +5,7 @@ P0 已回答的不再列出(spike A 的域、spike B 的分档、`posix_spawn` 不可用、OOM 探测惯用法、`GetInteger64i_v`/`GetProgramiv` 退役、D21 与 `RenderbufferObject` lifetime id、动态 accessor 基线)。 1. **client 侧 dirty 走查的真实每 draw CPU 代价。** 已答(P2–P4a):推送没有在拉取基线之下净减少;Release 下 P2 边界 +6–12%,P3a 在 VAO 切换密的 rd12 上再加 +17–19 pt,P4a 在 Espryt 上 +3.4–5.7 pt(`MEASUREMENTS.md` §3–§5)。用户 2026-09-08 接受,性能自此只记录。 -2. **真实语料上纹理重铸拉取的发生率。** 已答(P4a):可忽略,保留 LRU 维持默认 0——79 例 × 两后端 780 个统计窗口里共 2 次(`iris-photon`、`iris-derivative` 各 1,只在 DirectGLES)。但 P5b 下这条路径是具名 Fatal,正是这两条 trace 加 `create-indirect` GLES 的首阻塞(P9)。**P9 W2 关闭**:重铸不需要拉取——server 读 GPU 层、store 补 pending 盒(Espryt),GPU→GPU 拷贝(Magma);77 行 × {monolith, inproc} 普查仍是同两次(都是 store 无字节的渲染目标),`OnTexturePullRequest` 已删([`docs/archive/notes/p9/W2-REMINT.md`](../archive/notes/p9/W2-REMINT.md))。 +2. **真实语料上纹理重铸拉取的发生率。** 已答(P4a):可忽略,保留 LRU 维持默认 0——79 例 × 两后端 780 个统计窗口里共 2 次(`iris-photon`、`iris-derivative` 各 1,只在 DirectGLES)。但 P5b 下这条路径是具名 Fatal,正是这两条 trace 加 `create-indirect` GLES 的首阻塞(P9)。**P9 W2 关闭**:重铸不需要拉取——server 读 GPU 层、store 补 pending 盒(Espryt),GPU→GPU 拷贝(Magma);77 行 × {monolith, inproc} 普查仍是同两次(都是 store 无字节的渲染目标),`OnTexturePullRequest` 已删(见 git 历史)。 3. **spike B 的 `untrusted_app` 域复核。** 两台设备的分档在 `shell` 域测得;从应用进程再跑一次 `extmem_probe`(spike A 的 exec 钩子已可用)。P11 前做。**2026-09-22 降级**:只对同机臂的 T0 / T1 有意义,stream 数据面不需要。 4. **渲染状态的 wire 粒度。** 已答(P2):16 个边界 / 15 个 chunk,7 pipeline 396 B + 8 dynamic 772 B;CSO LRU 64 暂定,P13 重调。 5. **无存储的 capability。** 已答(P2):`FramebufferSrgb`、`DepthClamp`、`TextureCubeMapSeamless` 三个都补了真存储,`sizeof(RenderStateParameters)` 仍 1168。 diff --git a/docs/Disaggregated/README.md b/docs/Disaggregated/README.md index 00fe5b72..be755b89 100644 --- a/docs/Disaggregated/README.md +++ b/docs/Disaggregated/README.md @@ -21,10 +21,9 @@ |---|---| | 现在做到哪、下一步 | [`CURRENT_STAGE_PROGRESS.md`](CURRENT_STAGE_PROGRESS.md) | | 设计要点与各部分设计 | [`ARCHITECTURE.md`](ARCHITECTURE.md) → [`design/`](design/) | -| 分几个阶段、每个阶段做了什么 | [`ROADMAP.md`](ROADMAP.md) → [`docs/archive/notes/<阶段>/`](../archive/notes/README.md) | +| 分几个阶段、每个阶段做了什么 | [`ROADMAP.md`](ROADMAP.md) | | 性能与验证的关键数字 | [`MEASUREMENTS.md`](MEASUREMENTS.md) | | 怎么构建、运行、测试 | [`guide/build-and-run.md`](guide/build-and-run.md) | | 代码在哪 / 术语 / 工程纪律 | [`guide/code-map.md`](guide/code-map.md)、[`guide/glossary.md`](guide/glossary.md)、[`guide/discipline.md`](guide/discipline.md) | -| 各阶段的原始计划、裁定、报告、证据(已冻结) | [`docs/archive/notes/`](../archive/notes/README.md) | -整理记录:2026-09-24 两次整理——顶层只留索引,设计正文拆到 `design/`,上手与参考放 `guide/`,阶段细节放 `notes/<阶段>/`(2026-10 起冻结在 `docs/archive/notes/`);整理前的版本见提交 `1fb18d9`。更早的设计竞赛与评审稿在 git 历史(`8b31de2f`、`1794ac94`、`8349babe`、`87ee17c6`)。 +整理记录:2026-09-24 两次整理——顶层只留索引,设计正文拆到 `design/`,上手与参考放 `guide/`,阶段细节放 `notes/<阶段>/`(这些笔记已从树中删除,见 git 历史);整理前的版本见提交 `1fb18d9`。更早的设计竞赛与评审稿在 git 历史(`8b31de2f`、`1794ac94`、`8349babe`、`87ee17c6`)。 diff --git a/docs/Disaggregated/ROADMAP.md b/docs/Disaggregated/ROADMAP.md index 966434f0..aacc7df0 100644 --- a/docs/Disaggregated/ROADMAP.md +++ b/docs/Disaggregated/ROADMAP.md @@ -1,6 +1,6 @@ # 路线图(索引) -> **2026-10-07**:P0 到 P7、P12、P9、P10、P11、P8、**P13** 已完成——拆分路线与单进程路线都走完。P13(退役 pull 路径):单进程也只走记录臂,pull / push 两套构建、`MOBILEGL_PIPE_PUSH` 与 `MOBILEGL_PIPE_LEGACY_MEMOS` 编译期开关、残余值块和后端的前端对象臂全部删除;库拆成按 link ratchet 分区的七个模块,split 构建里 server 一半单独真链接;G1 退役,由零 `MG_Remote` 符号、skip 普查与 recorder 金标接班;性能工作排在其后,基线是 `dev` 构建。下一项是 **P14**(状态归属)。每个阶段的计划、验收结果、实测与报告在 `docs/archive/notes/<阶段>/`(点阶段名进入)。 +> **2026-10-07**:P0 到 P7、P12、P9、P10、P11、P8、**P13** 已完成——拆分路线与单进程路线都走完。P13(退役 pull 路径):单进程也只走记录臂,pull / push 两套构建、`MOBILEGL_PIPE_PUSH` 与 `MOBILEGL_PIPE_LEGACY_MEMOS` 编译期开关、残余值块和后端的前端对象臂全部删除;库拆成按 link ratchet 分区的七个模块,split 构建里 server 一半单独真链接;G1 退役,由零 `MG_Remote` 符号、skip 普查与 recorder 金标接班;性能工作排在其后,基线是 `dev` 构建。下一项是 **P14**(状态归属)。每个阶段的计划、验收结果、实测与报告见 git 历史。 ## 目标 @@ -15,29 +15,29 @@ client(跑应用的一方)与 server(跑驱动的一方)可以在**不 | 阶段 | 做什么 | 状态 | |---|---|---| -| [P0](../archive/notes/p0/README.md) | 打地基:计数器、调用目录与生成器、CI 门;验证 Android 能拉起第二个进程 | ✅ 09-05 | -| [P0.5](../archive/notes/p05/README.md) | 抽出前后端共用的数据类型头,切断后端对前端头文件的依赖 | ✅ | -| [P1](../archive/notes/p1/README.md) | 后端改读一个"输入块",并能逐 draw 核对它与前端真实状态一致 | ✅ | -| [P2](../archive/notes/p2/README.md) | 前端开始主动推送渲染状态;接口代价实测 +6–12%,决定继续 | ✅ 09-08 | -| [P3a](../archive/notes/p3a/README.md) | GLES 后端的 buffer、顶点数组改用句柄 | ✅ 09-08 | -| [P4a](../archive/notes/p4a/README.md) | GLES 后端的帧缓冲、纹理、sampler、program 改用句柄 | ✅ 09-08 | -| [P5](../archive/notes/p5/README.md) | 第一次拆成两线程:命令队列 + 后端线程(每条命令都等) | ✅ 09-16 | -| [P5b](../archive/notes/p5b/README.md) | 把剩余命令迁到队列上;真机首次以独立后端线程跑通目标游戏 | ✅ 09-16 | -| [P5c](../archive/notes/p5c/README.md) | 两线程之间不再偷偷共享内存,只经队列交换 | ✅ 09-17 | -| [P5d](../archive/notes/p5d/README.md) | 两线程版本的性能:游戏内 7–13 fps → 103–106 fps | ✅ 09-18 | -| [P5e](../archive/notes/p5e/README.md) | client 发完就走,不再每条命令等后端;重负载下与单线程持平 | ✅ 09-19 | -| [P5f](../archive/notes/p5f/README.md) | 所有状态都经队列传递,为拆进程扫清最后障碍;Vulkan 后端也能发完就走 | ✅ 09-20 | -| [P6](../archive/notes/p6/README.md) | 拆成两个进程;真机上两进程与两线程成本持平 | ✅ 09-22 | -| [P6.5](../archive/notes/p65/README.md) | 传输分控制面 / 数据面;电脑当 client、手机当 server 经 TCP 跑通 | 第一波 ✅,余项交 CI | -| [Ph](../archive/notes/p7/README.md) | server 能安全地接受外来连接:令牌、限额、坏数据不致崩溃 | 必需项 ✅(随 P7) | -| [P3b / P4b](../archive/notes/p34b/README.md) | GLES 后端的深化与收尾 | 大部分 ✅,余项并行 | -| [P7](../archive/notes/p7/README.md) | Vulkan 后端完整迁移;真机画面检查 36/36 通过 | ✅ 09-23 | -| [**P12**](../archive/notes/p12/README.md) | **server 自己开窗口上屏,client 不需要窗口** | ✅ 09-29:出口门 B(跨机 TCP)✅ 09-28、A(FCL + 杀 server)✅ 09-29;契约 `docs/archive/contracts/CONTRACT-P12.md`;G1 成立;余项进 [`DEBTS.md`](DEBTS.md) | -| [**P8**](../archive/notes/p8/README.md) | ~~把剩余的仿真路径挪到正确的一侧,补齐协议~~ → **补齐 server 侧仿真缺口与 split 覆盖** | ✅ 09-30:重定界(原 10 项里 6 项前序已完成);Espryt 生成 mip / 暂存副本与 GPU 写 / 驱动拒读、Magma wire 原生 indirect 与 dispatch;246 例登上 split 三臂(`split_coverage.py`);Create 在 Adreno 上的丢拷贝修到 dev 与 feat;契约 `docs/archive/contracts/CONTRACT-P8.md`;余项进 [`DEBTS.md`](DEBTS.md) | -| [**P9**](../archive/notes/p9/README.md) | **反向通道:回读、日志、重铸不再同步等待 client** | ✅ 09-29:PACK-PBO 回读 fire-and-forget(两后端)、日志分级转发、重铸无拉取(`OnLog` / `OnTexturePullRequest` 删,回调 9 → 7),F1 / F2;契约 `docs/archive/contracts/CONTRACT-P9.md`;G1 成立;事件量批处理无实测需求不做;余项进 [`DEBTS.md`](DEBTS.md) | -| [**P10**](../archive/notes/p10/README.md) | **同步对象、查询与帧节奏** | ✅ 09-29:fence 轮询由 server 报告本地作答(`kEventFenceSignaled`、`MOBILEGL_IPC_POLL_ESCALATE`;主机 Magma·tcp −37%,Adreno 830 上两后端 0 次往返);`SetSwapInterval` 转发、class C 清零;query / XFB / AsyncCompile 登记 split 各臂;credit 1/2/3 设备 loopback 在噪声内;契约 `docs/archive/contracts/CONTRACT-P10.md`;G1 成立;余项进 [`DEBTS.md`](DEBTS.md) | -| [**P11**](../archive/notes/p11/README.md) | **同机大缓冲零拷贝共享** | ✅ 09-29:T0 零拷贝导入(两后端,默认开,自测不过或 Stream 上静默退回 T2);同机外部 client 经 helper + 令牌 broker 走共享内存(B1);连接按 `PairBind` nonce 配对(修订 5);采纳档位在握手时定;契约 `docs/archive/contracts/CONTRACT-P11.md`;余项进 [`DEBTS.md`](DEBTS.md) | -| [**P13**](../archive/notes/p13/README.md) | **删掉旧的"后端直接读前端"路径** | ✅ 10-07:单进程只走记录臂;pull / push 构建与 `PIPE_PUSH` / `LEGACY_MEMOS` 编译期开关、残余值块、后端前端对象臂删除;七个 OBJECT 模块与 server-only 真链接;link ratchet 172 → 27 具名债务;recorder 金标;G1 退役;FCL 真机两后端冒烟通过;性能轮(基线 `dev`)与余项进 [`DEBTS.md`](DEBTS.md) | +| P0 | 打地基:计数器、调用目录与生成器、CI 门;验证 Android 能拉起第二个进程 | ✅ 09-05 | +| P0.5 | 抽出前后端共用的数据类型头,切断后端对前端头文件的依赖 | ✅ | +| P1 | 后端改读一个"输入块",并能逐 draw 核对它与前端真实状态一致 | ✅ | +| P2 | 前端开始主动推送渲染状态;接口代价实测 +6–12%,决定继续 | ✅ 09-08 | +| P3a | GLES 后端的 buffer、顶点数组改用句柄 | ✅ 09-08 | +| P4a | GLES 后端的帧缓冲、纹理、sampler、program 改用句柄 | ✅ 09-08 | +| P5 | 第一次拆成两线程:命令队列 + 后端线程(每条命令都等) | ✅ 09-16 | +| P5b | 把剩余命令迁到队列上;真机首次以独立后端线程跑通目标游戏 | ✅ 09-16 | +| P5c | 两线程之间不再偷偷共享内存,只经队列交换 | ✅ 09-17 | +| P5d | 两线程版本的性能:游戏内 7–13 fps → 103–106 fps | ✅ 09-18 | +| P5e | client 发完就走,不再每条命令等后端;重负载下与单线程持平 | ✅ 09-19 | +| P5f | 所有状态都经队列传递,为拆进程扫清最后障碍;Vulkan 后端也能发完就走 | ✅ 09-20 | +| P6 | 拆成两个进程;真机上两进程与两线程成本持平 | ✅ 09-22 | +| P6.5 | 传输分控制面 / 数据面;电脑当 client、手机当 server 经 TCP 跑通 | 第一波 ✅,余项交 CI | +| Ph | server 能安全地接受外来连接:令牌、限额、坏数据不致崩溃 | 必需项 ✅(随 P7) | +| P3b / P4b | GLES 后端的深化与收尾 | 大部分 ✅,余项并行 | +| P7 | Vulkan 后端完整迁移;真机画面检查 36/36 通过 | ✅ 09-23 | +| **P12** | **server 自己开窗口上屏,client 不需要窗口** | ✅ 09-29:出口门 B(跨机 TCP)✅ 09-28、A(FCL + 杀 server)✅ 09-29;契约见 git 历史;G1 成立;余项进 [`DEBTS.md`](DEBTS.md) | +| **P8** | ~~把剩余的仿真路径挪到正确的一侧,补齐协议~~ → **补齐 server 侧仿真缺口与 split 覆盖** | ✅ 09-30:重定界(原 10 项里 6 项前序已完成);Espryt 生成 mip / 暂存副本与 GPU 写 / 驱动拒读、Magma wire 原生 indirect 与 dispatch;246 例登上 split 三臂(`split_coverage.py`);Create 在 Adreno 上的丢拷贝修到 dev 与 feat;契约见 git 历史;余项进 [`DEBTS.md`](DEBTS.md) | +| **P9** | **反向通道:回读、日志、重铸不再同步等待 client** | ✅ 09-29:PACK-PBO 回读 fire-and-forget(两后端)、日志分级转发、重铸无拉取(`OnLog` / `OnTexturePullRequest` 删,回调 9 → 7),F1 / F2;契约见 git 历史;G1 成立;事件量批处理无实测需求不做;余项进 [`DEBTS.md`](DEBTS.md) | +| **P10** | **同步对象、查询与帧节奏** | ✅ 09-29:fence 轮询由 server 报告本地作答(`kEventFenceSignaled`、`MOBILEGL_IPC_POLL_ESCALATE`;主机 Magma·tcp −37%,Adreno 830 上两后端 0 次往返);`SetSwapInterval` 转发、class C 清零;query / XFB / AsyncCompile 登记 split 各臂;credit 1/2/3 设备 loopback 在噪声内;契约见 git 历史;G1 成立;余项进 [`DEBTS.md`](DEBTS.md) | +| **P11** | **同机大缓冲零拷贝共享** | ✅ 09-29:T0 零拷贝导入(两后端,默认开,自测不过或 Stream 上静默退回 T2);同机外部 client 经 helper + 令牌 broker 走共享内存(B1);连接按 `PairBind` nonce 配对(修订 5);采纳档位在握手时定;契约见 git 历史;余项进 [`DEBTS.md`](DEBTS.md) | +| **P13** | **删掉旧的"后端直接读前端"路径** | ✅ 10-07:单进程只走记录臂;pull / push 构建与 `PIPE_PUSH` / `LEGACY_MEMOS` 编译期开关、残余值块、后端前端对象臂删除;七个 OBJECT 模块与 server-only 真链接;link ratchet 172 → 27 具名债务;recorder 金标;G1 退役;FCL 真机两后端冒烟通过;性能轮(基线 `dev`)与余项进 [`DEBTS.md`](DEBTS.md) | | **P14** | **状态归属:同进程多 session / 多 context / share group**(统一 server 的前提,anland 内置渲染器不做按进程隔离) | 设计 ✅ [`design/11-state-ownership.md`](design/11-state-ownership.md),实现待做 | ## 另见 diff --git a/docs/Disaggregated/design/02-catalogue-and-records.md b/docs/Disaggregated/design/02-catalogue-and-records.md index 9992684d..94f16291 100644 --- a/docs/Disaggregated/design/02-catalogue-and-records.md +++ b/docs/Disaggregated/design/02-catalogue-and-records.md @@ -41,7 +41,7 @@ ### 3.3 能力位(`MGPCapBit`) -`CallMask` 取代"槽位是否为 null"这一隐式能力探测;`MGPCaps` = `DynamicBackendParameters` + `CallMask` + 格式能力表与 renderer 字符串两个 blob,握手后快照、`MakeCurrent` / `InitCapabilities` 后按 generation 重发布。位包括 viewport array、fp64 顶点、`kCapResidentSubData`、XFB / query 家族、`kCapNeedsHostIndexBytes`、`kCapNeedsHostUboBytes`、`kCapBackendOwnsXfbCapture`、`kCapRunAheadApply`(`MGPipeRunAheadCapBitsFor`:Espryt 自 P5e、Magma 自 P5f 之后的 Magma run-ahead 起发布,后者契约 `docs/archive/contracts/CONTRACT-MAGMA-RUNAHEAD.md`)。**不存在"归属开关"(D-B7)**:multi-draw 分档与 restart 重写永远由 server 拥有,client 只在 caps 要求时提供索引字节。 +`CallMask` 取代"槽位是否为 null"这一隐式能力探测;`MGPCaps` = `DynamicBackendParameters` + `CallMask` + 格式能力表与 renderer 字符串两个 blob,握手后快照、`MakeCurrent` / `InitCapabilities` 后按 generation 重发布。位包括 viewport array、fp64 顶点、`kCapResidentSubData`、XFB / query 家族、`kCapNeedsHostIndexBytes`、`kCapNeedsHostUboBytes`、`kCapBackendOwnsXfbCapture`、`kCapRunAheadApply`(`MGPipeRunAheadCapBitsFor`:Espryt 自 P5e、Magma 自 P5f 之后的 Magma run-ahead 起发布,后者契约见 git 历史)。**不存在"归属开关"(D-B7)**:multi-draw 分档与 restart 重写永远由 server 拥有,client 只在 caps 要求时提供索引字节。 ## 4. 记录与 payload 约定(`MG_Pipe/MGPipeTypes.h`) diff --git a/docs/Disaggregated/design/04-reverse-channel.md b/docs/Disaggregated/design/04-reverse-channel.md index 2c137ffd..c53be181 100644 --- a/docs/Disaggregated/design/04-reverse-channel.md +++ b/docs/Disaggregated/design/04-reverse-channel.md @@ -55,8 +55,8 @@ - 删除:`OnTexturePullRequest`(与 W3 删除的 `OnLog` 合计,回调 9 → 7)、`texture-remint-pull` 标记。op 50 `ResourceSubDataComplete` 只追加不删,留作退役行(解码拒收)。`MOBILEGL_PIPE_TEXEL_RETAIN_MB` 已无消费者,但在 pull 构建里,随 P13 删(G1)。 - `ImageBindableHint` 仍是预防:hint 在第一次 sync 前到达就直接按 image-bindable 分配,省掉一次 server 回读 + 重传。 - 已知 dev 缺陷(非 P9):monolith Espryt 的前端臂重放 client 影子,覆盖 GPU 写过的纹素。 -- 普查、覆盖矩阵、门与 red-once:[`docs/archive/notes/p9/W2-REMINT.md`](../../archive/notes/p9/W2-REMINT.md)。 +- 普查、覆盖矩阵、门与 red-once:见 git 历史。 ### 8.5 XFB scatter 留在 server -补丁循环需要"捕获前的字节",而拆分后权威影子归 server(`StagedShadow`),所以 scatter 在 server 原地跑完;回程只有一条 `OnBufferWriteback`,载补好的整段,按 `SEG_EVENT` 容量的四分之一切片(`MGPipeBufferWritebackSliceBytes`),最后一片落地即蕴含之前每一片。孤儿目标(`HasDefinedContent == 0`)零填充后照常散射。`OnXfbScatterReady` 已删除(回调 10 → 9)。落地论证见 [`docs/archive/notes/p34b/README.md`](../../archive/notes/p34b/README.md)(espryt D1)。 +补丁循环需要"捕获前的字节",而拆分后权威影子归 server(`StagedShadow`),所以 scatter 在 server 原地跑完;回程只有一条 `OnBufferWriteback`,载补好的整段,按 `SEG_EVENT` 容量的四分之一切片(`MGPipeBufferWritebackSliceBytes`),最后一片落地即蕴含之前每一片。孤儿目标(`HasDefinedContent == 0`)零填充后照常散射。`OnXfbScatterReady` 已删除(回调 10 → 9)。落地论证见 git 历史(espryt D1)。 diff --git a/docs/Disaggregated/design/05-backend-and-server.md b/docs/Disaggregated/design/05-backend-and-server.md index f9c665b3..c051f7ec 100644 --- a/docs/Disaggregated/design/05-backend-and-server.md +++ b/docs/Disaggregated/design/05-backend-and-server.md @@ -69,4 +69,4 @@ Track V(值类型:render state、pixel store、capability 位、标量)是 ### 10.3 索引宿主镜像(`Server/IndexHostMirror`,P8,待重裁) -设计:`kCapNeedsHostIndexBytes` 下,server 从本来就要收的 `ResourceCreate/Respecify/SubData` 流增量维护 element-array buffer 的宿主镜像,零额外流量;预算 `MOBILEGL_PIPE_INDEX_MIRROR_MB`(默认 64),超预算退化为逐 draw 经 `MGHostSpan` 传送。**P6 的 a6 审计实测宿主索引 span 无 producer、client 索引已是 owned buffer**,所以 P8 要按真实消费者重新裁定,不照抄本节([`docs/archive/notes/p8/README.md`](../../archive/notes/p8/README.md))。 +设计:`kCapNeedsHostIndexBytes` 下,server 从本来就要收的 `ResourceCreate/Respecify/SubData` 流增量维护 element-array buffer 的宿主镜像,零额外流量;预算 `MOBILEGL_PIPE_INDEX_MIRROR_MB`(默认 64),超预算退化为逐 draw 经 `MGHostSpan` 传送。**P6 的 a6 审计实测宿主索引 span 无 producer、client 索引已是 owned buffer**,所以 P8 要按真实消费者重新裁定,不照抄本节(见 git 历史)。 diff --git a/docs/Disaggregated/design/06-transport.md b/docs/Disaggregated/design/06-transport.md index 11f4ec58..7ffd1347 100644 --- a/docs/Disaggregated/design/06-transport.md +++ b/docs/Disaggregated/design/06-transport.md @@ -92,4 +92,4 @@ fence 完成度必须来自真的逐 fence 退休,不是 present 水位(Dire - 两端是不同二进制:`wireFingerprint`(`PipeFields.def` 派生的逐成员布局摘要 + 目录摘要 + 字节序 / 指针宽度)永远比较;`buildFingerprint` 只在 `Dial == Fork`(或 `MOBILEGL_IPC_REQUIRE_SAME_BUILD=1`)下比较;不一致是 `Refuse`,不是 abort。 - TCP 上每条 `kWaitReply` 就是一个 RTT、`SEG_STAGE` 字节对的是 30–100 MB/s 的链路:这两列从"记录项"变成可行性数(开放问题 19、20)。 -第一波(全 TCP 控制 + stream 数据)已落地;同机混搭(nd `auto` / sd)是第二波。细节 [`docs/archive/notes/p65/README.md`](../../archive/notes/p65/README.md),契约 `docs/archive/contracts/CONTRACT-P65.md`。 +第一波(全 TCP 控制 + stream 数据)已落地;同机混搭(nd `auto` / sd)是第二波。细节与契约见 git 历史。 diff --git a/docs/Disaggregated/design/07-memory-readback-verification.md b/docs/Disaggregated/design/07-memory-readback-verification.md index 9c52eab5..81c4b9cd 100644 --- a/docs/Disaggregated/design/07-memory-readback-verification.md +++ b/docs/Disaggregated/design/07-memory-readback-verification.md @@ -10,7 +10,7 @@ |---|---|---| | T0 | client 分配 `AHardwareBuffer` BLOB,server 导入(Vulkan / GLES) | 唯一在两台设备、两个后端上都完整读写的档(P11 主攻) | | T1 | server 导出 opaque fd | 仅 Adreno 的 Vulkan 路径 | -| T2 | 拒绝,client 侧推送 | 永久正确回退;**今天 split 用的档**(`MOBILEGL_IPC_ADOPT_TIER=2`),stream 数据面上强制(P11 A1:两端握手时 `Transport::SettleAdoptTierAtHandshake` 对 0/1 打一行 `Refuse{AdoptTierOnStream}` 并走 T2;共享段上 client 握手期 `Fatal{UnimplementedAdoptTier}`,[`CONTRACT-P11.md`](../../archive/contracts/CONTRACT-P11.md) §1) | +| T2 | 拒绝,client 侧推送 | 永久正确回退;**今天 split 用的档**(`MOBILEGL_IPC_ADOPT_TIER=2`),stream 数据面上强制(P11 A1:两端握手时 `Transport::SettleAdoptTierAtHandshake` 对 0/1 打一行 `Refuse{AdoptTierOnStream}` 并走 T2;共享段上 client 握手期 `Fatal{UnimplementedAdoptTier}`,`CONTRACT-P11.md` §1) | T2 下 client 侧推送三件套:不做 map/unmap 命令对(payload 带 `hasLiveHostWrites`);在每个 validate 点按 64 KiB 块推送可达的已映射 buffer,脏页追踪 + 哈希抑制只发变化的块(P5d);门 `PersistentCoherentMapScenario`。`mpr` 数的是每一次 `MapPersistent` 发射(铸成或拒绝都算),所以在 monolith 下也可断言。 diff --git a/docs/Disaggregated/design/08-runtime-and-platform.md b/docs/Disaggregated/design/08-runtime-and-platform.md index 0cadbb1b..40f53183 100644 --- a/docs/Disaggregated/design/08-runtime-and-platform.md +++ b/docs/Disaggregated/design/08-runtime-and-platform.md @@ -42,7 +42,7 @@ TCP `--serve` 的 supervisor(`ServerMain.cpp` 的 `TcpSupervisor`,判定部 - 交付链(spike A 已证):APK 唯一可 exec 的位置是 `lib//`,server 以 `add_executable` + `lib*.so` 命名构建;从 `untrusted_app` 进程 `fork`+`execve` 同域、零 avc denial;`posix_spawn` 在 minSdk 26 不可用。一份共享库两个角色(stub `dlopen` + `dlsym("mobilegl_server_main")`)。 - 离屏 server:前台 `MobileGLServerService`(`:mglsrv`),从 `nativeLibraryDir` exec,fork-per-session,EGL 是 pbuffer / surfaceless。 -- **上屏 server(P12 子集)**:窗口归 **server 自己**(client 的窗口不跨进程)。`MobileGLDisplayActivity`(`:mglwin`)持全屏 SurfaceView,在自己的进程里用一个线程跑 TCP server(会话串行、会话间重置闩、后端按进程钉住);`ServerDisplay` 以 acquire / release / 几何三个钩子持有窗口,apply 线程以**租约**使用它。client 设 `MOBILEGL_IPC_SURFACE=server` 后**无头**:`eglCreateWindowSurface(NULL)` 发一帧 `WindowKind::ServerOwned`(控制修订 3),不发 `SetWindowHandle`,尺寸由 reply 带回,resize 变成对 server 窗口的几何请求;client 没给 `EGL_WIDTH/HEIGHT`(SDL)时取 native window 的大小作请求,server 把窗口缓冲固定成它并等比留黑边(不然横屏游戏在竖屏窗口里被裁)。FCL 只能接外部 server(自带 spawn 会把窗口指针发过来,被 Rule H 拒),且要开版本设置「游戏退到后台时不暂停」,否则 FCL 一退后台游戏就暂停(`docs/archive/contracts/CONTRACT-P12.md`)。一台设备同一时刻一个 server;一个会话一种表面模式(`SurfaceModeMismatch`);无显示的 server 对 ServerOwned 具名拒绝(`NoServerDisplay`)。 +- **上屏 server(P12 子集)**:窗口归 **server 自己**(client 的窗口不跨进程)。`MobileGLDisplayActivity`(`:mglwin`)持全屏 SurfaceView,在自己的进程里用一个线程跑 TCP server(会话串行、会话间重置闩、后端按进程钉住);`ServerDisplay` 以 acquire / release / 几何三个钩子持有窗口,apply 线程以**租约**使用它。client 设 `MOBILEGL_IPC_SURFACE=server` 后**无头**:`eglCreateWindowSurface(NULL)` 发一帧 `WindowKind::ServerOwned`(控制修订 3),不发 `SetWindowHandle`,尺寸由 reply 带回,resize 变成对 server 窗口的几何请求;client 没给 `EGL_WIDTH/HEIGHT`(SDL)时取 native window 的大小作请求,server 把窗口缓冲固定成它并等比留黑边(不然横屏游戏在竖屏窗口里被裁)。FCL 只能接外部 server(自带 spawn 会把窗口指针发过来,被 Rule H 拒),且要开版本设置「游戏退到后台时不暂停」,否则 FCL 一退后台游戏就暂停(见 git 历史)。一台设备同一时刻一个 server;一个会话一种表面模式(`SurfaceModeMismatch`);无显示的 server 对 ServerOwned 具名拒绝(`NoServerDisplay`)。 - 失窗:`surfaceDestroyed` 有界(3 s)阻塞,直到 apply 线程(批内每条记录前也检查)放掉后端表面并以 `Fatal{ServerWindowLost}` 闩住会话;server 继续监听。进程内会话结束时手动做进程退出本来白给的清理(Espryt twin 与单元影子、swap interval、Magma renderer)。 - `HeadlessGL` 的 fork 预检会产生孤儿 server:server 的 EOF 检测即时且无条件退出。 diff --git a/docs/Disaggregated/design/09-build-switches-counters.md b/docs/Disaggregated/design/09-build-switches-counters.md index 839e9377..604d4815 100644 --- a/docs/Disaggregated/design/09-build-switches-counters.md +++ b/docs/Disaggregated/design/09-build-switches-counters.md @@ -82,4 +82,4 @@ CMake:`MOBILEGL_BUILD_DISAGGREGATED`(OFF)、`MOBILEGL_BUILD_DISAGGREGATED_ ## 附 B:边界计数器(`MobileGL/MG_Util/Metrics/PipeStats.h`) -关闭时每站点一次全局 load + 一条永不命中的分支。字节类(stage buffer / texture / UBO / client 数组、`pmap`、`resid`、`csob-blob`、`seg` = 写进 `SEG_STAGE` 的字节)、调用类(`draws`、`accessor-calls`、纹理上传 emit / box / rect / jobs、`csom` / `csob`、`mpr`、`trp`、`rsp`、`wrec`、server 应用的控制记录 `ar`(applier_reset)/ `od`(object_death)、`maxrec` / `ringwraps` / `ringpads` / `ringwaits`、门铃 `srv` / `srvpark` / `cli` / `clipark`)与六个 memo 门的 hit/miss。每 `MOBILEGL_PIPE_STATS_PERIOD` 帧一条 `MGPipe stats:` 汇总行,按角色写日志。读法陷阱:`accessor-calls` 是静态下界,判性能只看 CPU 时间;spawn 下 client 不推进帧窗口(`frames=0`),窗口化字段在 spawn client 上无效,run total 仍有效([`docs/archive/notes/p6/README.md`](../../archive/notes/p6/README.md) §12.1)。站点清单(哪些路径**没有**接线)写在 `PipeStats.cpp` 头部,那份清单是契约。 +关闭时每站点一次全局 load + 一条永不命中的分支。字节类(stage buffer / texture / UBO / client 数组、`pmap`、`resid`、`csob-blob`、`seg` = 写进 `SEG_STAGE` 的字节)、调用类(`draws`、`accessor-calls`、纹理上传 emit / box / rect / jobs、`csom` / `csob`、`mpr`、`trp`、`rsp`、`wrec`、server 应用的控制记录 `ar`(applier_reset)/ `od`(object_death)、`maxrec` / `ringwraps` / `ringpads` / `ringwaits`、门铃 `srv` / `srvpark` / `cli` / `clipark`)与六个 memo 门的 hit/miss。每 `MOBILEGL_PIPE_STATS_PERIOD` 帧一条 `MGPipe stats:` 汇总行,按角色写日志。读法陷阱:`accessor-calls` 是静态下界,判性能只看 CPU 时间;spawn 下 client 不推进帧窗口(`frames=0`),窗口化字段在 spawn client 上无效,run total 仍有效(见 git 历史 §12.1)。站点清单(哪些路径**没有**接线)写在 `PipeStats.cpp` 头部,那份清单是契约。 diff --git a/docs/Disaggregated/design/10-phase-shapes.md b/docs/Disaggregated/design/10-phase-shapes.md index ff621645..8759fee3 100644 --- a/docs/Disaggregated/design/10-phase-shapes.md +++ b/docs/Disaggregated/design/10-phase-shapes.md @@ -8,10 +8,10 @@ | 原节 | 主题 | 仍生效的规则 | 全文 | |---|---|---|---| -| 17.1 | verb barrier 与诚实的同地址空间传输(P5) | 同地址空间不得成为旁路(R-2):encoder 把 `MGHostSpan::Ptr` 恒写 `nullptr`;reply 以记录序号为 slot id(R-3);等待看门狗 120 s 只判死锁,不是性能门 | [`docs/archive/notes/p5/README.md`](../../archive/notes/p5/README.md) | +| 17.1 | verb barrier 与诚实的同地址空间传输(P5) | 同地址空间不得成为旁路(R-2):encoder 把 `MGHostSpan::Ptr` 恒写 `nullptr`;reply 以记录序号为 slot id(R-3);等待看门狗 120 s 只判死锁,不是性能门 | git 历史 | | 17.2 | 后端槽三类、caps、tight readback(P5) | A 本地答 / B 发射 / C 具名拒绝,永不回落 monolith(R-4);能力只读 `CallMask`(R-8);`ReadPixels` 线上恒 tight,client 按自己的 pack state 散射 | 同上 | | 17.3 | server 角色、shadow 与退出(P5) | apply 线程终身持有 native context,EGL 罕见操作经控制邮箱进 apply 线程;staged shadow 只交 server-owned 拷贝;有界退出顺序 | 同上 | | 17.4 | lane 隔离(P5) | 每条 split 条目私有日志;E1 与 E3(a) 的对照是常驻用例(`RemoteWaitBoundaryControl.AnUnwaitedPublishIsSeenAsNoWait`、`PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer`),不重跑 lane | 同上 | -| 17.5 | class-C verb 迁移(P5b) | 迁移顺序由动态普查决定;一次迁移 = 一个发射器 + 一个 sink 体;记录逐字带 GL 调用参数,未测量的形式按名拒绝(规则 D) | [`docs/archive/notes/p5b/README.md`](../../archive/notes/p5b/README.md) | -| 17.6 | 共享地址空间访问归零(P5c) | server 端纹理 staged shadow;`SEG_EVENT` 是唯一反向通道;sink / twin 按记录句柄解析;`applier_reset` / `object_death` 控制记录;角色守卫 `Fatal{RoleViolation}` | [`docs/archive/notes/p5c/README.md`](../../archive/notes/p5c/README.md) | -| 17.7 | run-ahead(P5e) | 规则 F:unbarriered 记录的 apply 不读任何 client 内存(违反即具名 Fatal,与 strict 开关无关);`gPipeInputs` 是 server 角色内存;`RunAheadArmed()` 在首次 caps 采纳时锁存,只能关不能开;`RUN_AHEAD=0` 是 A/B 对照 | [`docs/archive/notes/p5e/README.md`](../../archive/notes/p5e/README.md) | +| 17.5 | class-C verb 迁移(P5b) | 迁移顺序由动态普查决定;一次迁移 = 一个发射器 + 一个 sink 体;记录逐字带 GL 调用参数,未测量的形式按名拒绝(规则 D) | git 历史 | +| 17.6 | 共享地址空间访问归零(P5c) | server 端纹理 staged shadow;`SEG_EVENT` 是唯一反向通道;sink / twin 按记录句柄解析;`applier_reset` / `object_death` 控制记录;角色守卫 `Fatal{RoleViolation}` | git 历史 | +| 17.7 | run-ahead(P5e) | 规则 F:unbarriered 记录的 apply 不读任何 client 内存(违反即具名 Fatal,与 strict 开关无关);`gPipeInputs` 是 server 角色内存;`RunAheadArmed()` 在首次 caps 采纳时锁存,只能关不能开;`RUN_AHEAD=0` 是 A/B 对照 | git 历史 | diff --git a/docs/Disaggregated/design/11-state-ownership.md b/docs/Disaggregated/design/11-state-ownership.md index f2962fb5..e721f84e 100644 --- a/docs/Disaggregated/design/11-state-ownership.md +++ b/docs/Disaggregated/design/11-state-ownership.md @@ -1,6 +1,6 @@ # 状态归属:session / context / share group / thread current(P14 设计) -> 为 anland 内置统一 server 而做。动因与否定项见 [`docs/archive/notes/anland/handoff-legacy-mobilegl-unified.md`](../../archive/notes/anland/handoff-legacy-mobilegl-unified.md):不许用「每应用 fork 一个渲染进程」掩盖全局状态归属。本文行号对 `2f64ede8`(+ `4156ca6e` 文档提交),代码移动后以符号名检索。 +> 为 anland 内置统一 server 而做。动因与否定项见 git 历史:不许用「每应用 fork 一个渲染进程」掩盖全局状态归属。本文行号对 `2f64ede8`(+ `4156ca6e` 文档提交),代码移动后以符号名检索。 ## 结论 diff --git a/docs/Disaggregated/guide/build-and-run.md b/docs/Disaggregated/guide/build-and-run.md index d77ff9df..9e4f1493 100644 --- a/docs/Disaggregated/guide/build-and-run.md +++ b/docs/Disaggregated/guide/build-and-run.md @@ -35,5 +35,5 @@ ctest --test-dir build-split -L 'integration-(spawn|tcp)' --output-on-failure - 两份 APK flavour:单进程 / split(Gradle 属性 `mobilegl.buildDisaggregated`、`mobilegl.buildDisaggregatedInproc`;独立 plugin 构建默认 split,FCL 内嵌默认单进程)。split APK 同样要设 `MOBILEGL_TRANSPORT`,不设就是单进程对照。 - 设备侧 server 有两种形态:离屏的前台 Service(`MobileGLServerService`)与上屏的 `MobileGLDisplayActivity`;同一时刻只有一个。plugin 与 trace 两个 flavour 的 APK 都带(standalone 构建默认开 `mobilegl.buildDisaggregated`),入口是 APK 底部导航栏的 “Render Server” 页;plugin flavour 的这三个组件不导出,只有 trace 允许 adb 直接按组件名拉起。 -- 电脑当 client、手机当 server 的跨机配置(起 server、设令牌、`adb forward` 备用路线)见 [`docs/archive/notes/p65/README.md`](../../archive/notes/p65/README.md) 的"两边怎么配"。 +- 电脑当 client、手机当 server 的跨机配置(起 server、设令牌、`adb forward` 备用路线)见 git 历史中的"两边怎么配"。 - 性能对比只用 Redmi `2f7cbe2e`,按 [`pin-verification-2026-09-07.md`](pin-verification-2026-09-07.md) 定频,reboot-clean、同热窗口、配对 A/B。P13 之后的性能工作以 `dev` 分支构建为「之前」基线(用户 2026-10-07)。 diff --git a/docs/Disaggregated/guide/pin-verification-2026-09-07.md b/docs/Disaggregated/guide/pin-verification-2026-09-07.md deleted file mode 100644 index 94a45230..00000000 --- a/docs/Disaggregated/guide/pin-verification-2026-09-07.md +++ /dev/null @@ -1,28 +0,0 @@ -# 设备定频档案与核验 - -本分支性能 A/B 所用设备的定频方式与核验结果。规则:每次运行前后各跑一次 `pin_device.sh check`,DRIFT 的运行作废重跑;stock 值硬编码、不从已钉设备采样(否则一次 restore 会把钉频变成永久);温度门 40 °C;reboot-clean、同热窗口、两臂背靠背。 - -## 当前战役设备(2026-09-11 起,P4a 之后唯一用于 A/B 的设备) - -| 设备 | SoC / GPU | 大核 | 小核 | GPU | 备注 | -|---|---|---|---|---|---| -| Redmi M332BF `2f7cbe2e` | SM8750 / Adreno 830v2 | policy6 → 1958400(stock 1017600–3072000) | policy0 → 1555200(stock 556800–2745600) | kgsl `min/max_pwrlevel = 0`;2026-09-11 实测 1050 MHz(厂商 `thermal_pwrlevel` 锁 1),2026-09-16 起实测 1100 MHz | 主动风扇 `/sys/class/xm_power/hw_monitor/pwm_fan` 恒 level 2,用例间降温 <1 min;温度门 `cpuss-0-0` | - -与小米 `35d0befa` 同 SoC、同 OPP 表,两台的钉频数值可比;跨钉频口径(1050 vs 1100 MHz)的活动不可比钟频,只有同场配对可比。Redmi 的行已于 P6 收尾(2026-09-22)并入树内 `tools/device_bench/pin_device.sh`(`2f7cbe2e` 条目;stock 范围与小米不同,GPU 实测钳在 1050 MHz:`thermal_pwrlevel` 写 0 读回 1,见 [`docs/archive/notes/p6/README.md`](../../archive/notes/p6/README.md) §12.7);此前它只在树外的 `docs/archive/notes/p2/devices/pin_device.sh`。 - -## 2026-09-07 核验:小米 `35d0befa` 与 Oppo `3B159D009VZ00000`(P2 / P3a 使用) - -结论:`bench.sh` 的 `/proc/ppm` + `/proc/gpufreq` 钉法在两台上都不存在(MT6993 已改 `/proc/gpufreqv2/`),所以用 `bench.sh --no-pin` + `tools/device_bench/pin_device.sh pin|unpin|check`(纯 adb + su;exit 0 PINNED / 1 DRIFT / 2 UNPINNED,UNPINNED 非零使 `check && measure` 不可能量到未钉设备)。`devices/*.env` 的 `PROFILE_VERIFIED=1` 只认证文件里的节点与钉值,不认证 `bench.sh` 能驱动它们;给 `bench.sh` 加 `PIN_STYLE` 仍未做。 - -| | 小米 24129PN74C(SM8750 / Adreno 830v2) | Oppo PLG110(MT6993 / Mali,gpufreqv2) | -|---|---|---| -| 大核 | policy6 → 1958400(精确 OPP;stock 1017600–2841600) | policy4 → 2000000(最近 OPP,+2.1%;stock 300000–3500000,厂商守护随后改回 3200000) | -| 小核 | policy0 → 1555200(精确;stock 556800–2745600) | policy0 → 1600000(+2.9%;stock 300000–2100000) | -| 额外 | — | policy7(单核 4.21 GHz)同钉 2000000,否则一个热线程就打破钉频 | -| 方法 | `scaling_min_freq = scaling_max_freq = 目标`;governor(walt / sugov_ext)不动;写序 min→`cpuinfo_min_freq`、max→目标、min→目标(min 高于当前 max 会被 cpufreq 钳住) | 同左 | -| GPU | `kgsl-3d0/{min,max}_pwrlevel = 0` → 1100 MHz(devfreq 路径封顶 1050);`gpuclk` 单位是 Hz | `/proc/gpufreqv2/fix_target_opp_index = 0` → 1716000 kHz,恢复写 −1;不用 ged `custom_*`(取 OPP 下标、且被 urcc-service 争写) | -| 温度门 | `cpuss-0-0`(zone13),idle 34.7 °C | `soc_max`(zone14),idle 36–37 °C,门只勉强可达 | -| 30 s 八路负载核验 | 7 个样本零漂移,47 → 52 °C | 7 个样本零漂移,53 → 62 °C | -| 陷阱 | `gpubusy` 打的是周期数,busy 百分比读 `gpu_busy_percentage` | `scaling_governor/min/max` 是 0660 system,必须经 su 读,否则空值看起来像在工作 | - -两台核验后均已解钉并复核 UNPINNED,写过的节点全部恢复。未核验:Oppo GPU 钉在图形负载下的实际时钟(核验窗口 GPU 处于 power-collapse)、整场 bench 窗口内的钉频持久性、重启后状态、厂商热管理介入。 diff --git a/docs/Disaggregated/pwait/README.md b/docs/Disaggregated/pwait/README.md index 7f092524..452e75d4 100644 --- a/docs/Disaggregated/pwait/README.md +++ b/docs/Disaggregated/pwait/README.md @@ -5,8 +5,8 @@ with a 165 Hz display (6.06 ms per vsync). Espryt = DirectGLES, Magma = DirectVu thread records and applies. Inproc: the GL thread records and `mgl-srv-apply` applies and presents. The timelines and latency below come from one 4.9 s Perfetto run per arm (`pwlat`, with frametimeline). -The fps numbers come from the 3-rep A/B in [SCOREBOARD.md](../../archive/notes/perf-p15/SCOREBOARD.md) (section pwab). -The mechanism is analysed in depth in [PRESENT-WAIT.md](../../archive/notes/perf-p15/PRESENT-WAIT.md). +The fps numbers come from the 3-rep A/B in SCOREBOARD.md (section pwab). +The mechanism is analysed in depth in PRESENT-WAIT.md. ## Summary diff --git a/docs/MobileVA/plan.md b/docs/MobileVA/plan.md deleted file mode 100644 index 9424841c..00000000 --- a/docs/MobileVA/plan.md +++ /dev/null @@ -1,655 +0,0 @@ -# MobileVA: a vendor-agnostic VA-API driver on Android MediaCodec (plan, 2026-10-04) - -> Status: **plan only. No code, no build and no device work has been done for it.** Facts in this -> note are tagged **[verified]** (observed on the device, or read from code in this repo, with the -> source named) or **[unverified]** (expected from documentation or memory of the client sources; -> each one has a check in the M1 spikes). Anything that says "will", "proposed" or "TODO" is design. -> -> Context: [`docs/archive/notes/anland/plan-ahb-dmabuf.md`](../archive/notes/anland/plan-ahb-dmabuf.md) -> (shared images), the YUV import work in MobileGL `7218bacb` / `18a5dba0`, and the skill -> `.claude/skills/anland-mobilegl-plasma/` (build, deploy, probes). - -## 1. Goal and why - -Hardware video decode in the anland KDE Plasma container comes from `/usr/lib/dri/msm_drm_drv_video.so` -today. That driver: - -- is an unpackaged third-party binary ("DroidSpaces V4L2 VA-API driver 0.4.7", copied in on - 2026-09-21). It comes from no pacman package and from nothing in the anland repo. **[verified]** -- is **Qualcomm-only**. It drives the kernel's V4L2 stateful decoder at a hardcoded `/dev/video32` with - Qualcomm-private modes and UBWC formats (STREAM_OUTPUT_MODE=SECONDARY, Q10C/TP10/Q12A). **[verified]** -- **CPU-copies** every decoded frame into NV12/P010 dma-bufs it allocated itself (`nv12_copy`). - **[verified]** -- loads only because the render node's DRM driver name is `msm_drm`. No `LIBVA_DRIVER_NAME` is - set. **[verified]** - -Because neither the phone's EGL (no `EGL_EXT_image_dma_buf_import`) nor its Vulkan (no -`VK_EXT_external_memory_dma_buf`) imports a raw dma-buf, MobileGL then copies those foreign buffers a -**second** time on the CPU, into server YUV AHardwareBuffers (`SharedImages::ImportForeignYuv` / -`RefreshForeign`, 7218bacb). **[verified]** That costs about 31% of one server core at 720p30/60. -**[verified, 2026-10-04]** - -So each frame takes two CPU copies, and the path works only on Qualcomm. - -**Goal.** A libva driver of our own in the container. It forwards the compressed bitstream to the -MobileGL server process on Android, which decodes it with NDK `AMediaCodec` into AHardwareBuffers -that MobileGL owns. Decoded frames then reach GL with **zero CPU copies on any Android SoC**. - -## 2. User decisions (binding) - -| Topic | Decision | -|---|---| -| Location | A new top-level directory **`MobileVA/`** beside `MobileGL/`, with its own CMake targets. It is **never linked into the GL library**. It may reuse MobileGL's transport and shared-image registry. | -| Where decode runs | Inside the existing `:mobilegl` server process of the anland APK. | -| Codec priority | H.264, then VP9, then AV1, then HEVC (including 10-bit / P010; VP9 profile 2 and AV1 10-bit where the device supports them). **Only H.264 (milestone 1) is in scope for the first implementation.** | -| Old driver | Stays installed as an A/B fallback. Ours is the default. One documented knob switches back, and Chrome's GPU process must honour it too. | -| Clients | Chrome, mpv and GStreamer now; ffmpeg is the test harness. Firefox comes later. Nothing may block it or any other client: no app-name checks, no assumptions about Chrome's call order, and the VA semantics implemented honestly. | -| Vendor-agnostic | Only public Android NDK/SDK and Linux facilities: AMediaCodec, AImageReader, AHardwareBuffer, sync_file, dma-buf. Capabilities come from what the device's MediaCodec reports, never hardcoded limits. No vendor gralloc handles, no qcom/kgsl, no vendor format constants or vendor MediaFormat keys. | -| Zero copy | No CPU copy on the main path. An exported dma-buf's declared layout (fourcc, offsets, pitches, modifier) must be truthful, so an opaque or compressed layout is never exported as linear NV12. CPU readback (vaDeriveImage / vaGetImage / vaMapBuffer) may copy; that copy is inherent. | -| MobileGL | Core profile only, so no fixed-function test apps. | - -## 3. What we already know - -### 3.1 How clients drive VA - -| # | Fact | Status | -|---|---|---| -| C1 | Chrome 153's VaapiVideoDecoder uses **ALLOCATE mode**. It calls `vaCreateSurfaces(n=1)` once per frame-pool frame (about 22 frames), then `vaExportSurfaceHandle` on each surface once: one fd, `SEPARATE_LAYERS`, R8 + GR88 (e.g. 1280x720, stride 1280, slice 736, uv_offset 942080). It imports each export as a **single NV12 EGLImage** bound to `GL_TEXTURE_EXTERNAL_OES` and caches the import. It never allocates decode buffers through GBM. | **[verified]** (memory `chrome-vaapi-yuv-foreign-copy`, DMD_VA_LOG traces) | -| C2 | Chrome accepts a VA driver whose vendor string is neither Intel nor AMD. The DroidSpaces driver gives `kVideoDecoderName = VaapiVideoDecoder` and `kIsPlatformVideoDecoder = true`. | **[verified]** (skill `probes/cdpmedia.py`) | -| C3 | Chrome's GPU sandbox is off by default in `mobilegl-startup.sh chrome` (`--disable-gpu-sandbox`). With the sandbox on, the GPU process may not call `socket()`/`connect()` after start-up. | **[verified]** (startup script comment, anland 41ec066) | -| C4 | The old driver exports P010 only as `COMPOSED_LAYERS` ("SEPARATE_LAYERS not implemented"). | **[verified]** | -| C5 | MobileGL imports **no single-channel dma-bufs** (R8, GR88). So KWin's own NV12 path, which splits a buffer into R8 + GR88 imports, is not served, and KWin advertises no YUV format over linux-dmabuf. | **[verified]** (skill SKILL.md) | -| C6 | mpv's `--hwdec=vaapi` GL interop imports **each layer separately** as R8 / GR88 EGLImages. With C5, it would fail on MobileGL today. | **[unverified]**; check with LIBVA_TRACE and mpv `-v` | -| C7 | ffmpeg, mpv (it uses ffmpeg's hwaccel), GStreamer `vah264dec` and Chrome pass H.264 slice data as the **whole slice NAL unit without its start code**: it starts at the NAL header byte and keeps the emulation-prevention bytes. | **[unverified]** (memory of the client sources) | -| C8 | Whether Chrome calls `vaSyncSurface` before it samples a surface, or relies on implicit dma-buf sync. ffmpeg syncs inside `vaDeriveImage`/`vaGetImage` downloads. | **[unverified]**; record with `LIBVA_TRACE` | -| C9 | Chrome reads `LIBVA_DRIVER_NAME` through libva. Chrome itself picks a driver name only for some Intel cases. | **[unverified]** | -| C10 | GStreamer's `va` plugin registers elements only for drivers on its allowlist unless `GST_VA_ALL_DRIVERS=1` is set. | **[unverified]** | -| C11 | `LIBVA_TRACE=/path` in libva logs every call with its parameters, for **either** driver. That makes it the A/B observation tool. | **[unverified]** for this libva build | - -### 3.2 Platform and repo facts - -| # | Fact | Status | -|---|---|---| -| P1 | Device: Lenovo TB321FU (Y700), Adreno 750, Android 15, kernel 6.1. Container: Arch Linux ARM, glibc. libva headers in the cross sysroot are **VA-API 1.24** (`~/sysroots/arch-kde-mgl/usr/include/va`). | **[verified]** | -| P2 | Server YUV shared images are AHBs: `Y8Cb8Cr8_420` / `YCbCr_P010`, usage `GPU_SAMPLED_IMAGE \| CPU_WRITE_OFTEN \| CPU_READ_RARELY`. Plane offsets come from `AHardwareBuffer_lockPlanes`. They are exported with modifier `DRM_FORMAT_MOD_INVALID`. A returning fd is identified by `(st_dev, st_ino)`, so a re-import of our own buffer is **zero-copy** (no foreign path). | **[verified]** (`MG_Remote/Server/SharedImageRegistry.cpp`, yuvprobe GBM NV12 case) | -| P3 | Espryt converts YUV to RGBA with `GL_EXT_YUV_target` (Adreno 750 has it). Magma converts with `VkSamplerYcbcrConversion` on the AHB external format. Both convert once per reader frame epoch. | **[verified]** (`DirectGLES.cpp ConvertYuvForSampling`, `WireYuvImage.cpp`) | -| P4 | The foreign-copy fallback is labelled. Its first use logs "a foreign ... dma-buf is sampled through image N, refreshed by a CPU copy", and `Image::ForeignSource::Copies` counts each copy. That is the proof hook for "our buffers never take the fallback". | **[verified]** (code) | -| P5 | The YUV conversion paths call `RefreshForeign` but, from a read of the code, do **not** wait on the image's write fence (`DupWriteFence`) the way the RGBA shared-image path does. | **[unverified]**: code read only; confirm before relying on write fences for YUV | -| P6 | The client shared-image C ABI (`MG_Impl/SharedImageApi.h`) makes its round trips on the **process's GL client session**, the same ring its GL calls ride, so "like any GL call they must not race the GL calls of another thread". A VA driver therefore **cannot** use it from a decode thread. It needs its own connection. | **[verified]** (header comment) | -| P7 | The server listener pairs a client's two connections by a `PairBind` first frame (`MG_Remote/Server/PairAcceptor.h`) and refuses any other first frame by name. | **[verified]** (code) | -| P8 | A hung shader stalls every GPU user on the device, and the server process is shared by every desktop client. Process-global state in the server is a cross-session hazard (memory `multi-session-server-cross-session-hazards`). | **[verified]** | -| P9 | NDK `AMediaCodecStore` / `AMediaCodecInfo` (the codec list) need API 36. On Android 15 (API 35) the codec list comes from Java `MediaCodecList` through JNI. | **[unverified]**: from NDK headers; check `__ANDROID_API__` guards | -| P10 | `JNI_GetCreatedJavaVMs` is callable from NDK code on API 31+. That lets a lazily loaded .so reach the app's JavaVM. | **[unverified]** | -| P11 | Codec2 decoders give each output buffer the `presentationTimeUs` of the input that produced it. | **[unverified]**; spike S2 | -| P12 | `AImage_deleteAsync(image, releaseFence)` (API 26) returns a codec output buffer once a GPU read finishes, with no CPU wait. | **[unverified]** | - -## 4. Architecture - -``` -container (glibc) Android :mobilegl process (bionic) -─────────────────────────────────────────── ────────────────────────────────────────────────────── -client (Chrome GPU proc / mpv / gst / ffmpeg) - └─ libva ─ /usr/lib/dri/mobileva_drv_video.so libMobileGL.so (server) libMobileVAService.so - • VA objects (config/context/surface/buffer) listener @anland-mobilegl ──▶ ServiceBind "mobileva" - • H.264 header rebuild → Annex-B access unit SharedImageRegistry ◀─────── C ABI: allocate decode- - • own socket connection + reader thread (AHB images, fences) target YUV images, fences - │ • per-connection session - └──── unix:@anland-mobilegl (own connection, ───────────────────────────────▶ • AMediaCodec (async) → - MobileVA protocol, fds via SCM_RIGHTS) AImageReader (PRIVATE) - • copy thread: own EGL ctx, - GL consumer (Chrome/mpv via MobileGL EGL) ── imports exported fd ──▶ registry GL_EXT_YUV_target Y2Y copy - Identify(inode) → same AHB, zero-copy codec AHB → surface AHB -``` - -### 4.1 Directory and targets - -``` -MobileVA/ - CMakeLists.txt option MOBILEVA_BUILD_DRIVER (Linux), MOBILEVA_BUILD_SERVICE (Android), MOBILEVA_BUILD_TESTS (host) - Common/ protocol (POD, versioned, length-prefixed; SCM_RIGHTS helpers), BitReader/BitWriter, - exp-Golomb, emulation-prevention insert/strip, capability types - Codec/H264/ slice-header pre-parse, SPS/PPS synthesis from VA params, access-unit assembly - (pure C++, no libva/Android deps beyond va.h structs; host-testable) - Driver/ mobileva_drv_video.so: __vaDriverInit_1_, the VA vtable, objects, connection - Service/ libMobileVAService.so: session, MediaCodec decoder, AImageReader, GPU copy, caps (JNI) - Test/ gtest host tests -``` - -- The top-level `CMakeLists.txt` adds `MobileVA/` behind an option. No MobileGL target links any - MobileVA target. -- The driver has no link dependency on libva (drivers implement `VADriverVTable`) and none on - libMobileGL. It reads the endpoint from `/etc/mobilegl/client.conf` (`MOBILEGL_IPC_CONTROL`) the way - the GL client does, overridable by `MOBILEVA_ENDPOINT`. -- The service links `mediandk`, `nativewindow`, `EGL`, `GLESv3`, `android`, `log`. It reaches the - registry through a narrow C ABI that libMobileGL.so (server build) exports (§4.3). - -### 4.2 Where the H.264 rebuild runs: in the client - -The driver rebuilds the headers and assembles a complete Annex-B access unit **in the client -process**. The server receives a codec-generic request: `Decode{context, target surface, seq, config -bytes if changed, AU bytes, flags}`. - -**Why:** -- A parser bug then fails one client's decode, not the shared server process that every desktop client - depends on (P8). -- The rebuild is pure and host-testable. -- The wire protocol stays codec-agnostic for VP9/AV1/HEVC. - -All parsing uses bounds-checked readers and returns a VA error; it never asserts. - -### 4.3 Transport, sessions and the server hooks - -- **Connection.** One connection per `VADriverContext` (one per `vaInitialize`), opened at - `vaInitialize`. Chrome opens its VA display before any sandbox (C3). The first frame is a new - `CtrlMsg` **`ServiceBind{name:"mobileva", version}`**, appended to `protocol.fbs`'s union. The - existing `PairAcceptor` hands such a connection to a registered service by name, and refuses - unknown names by name. - - This is the only MobileGL transport change. Everything after the first frame is MobileVA's own - protocol, defined in `MobileVA/Common`. - - Fallback if the acceptor change turns out invasive: the service listens on its own abstract socket - `@anland-mobilegl-va` in the same process. It still uses the same registry. -- **Protocol (draft).** Length-prefixed frames `{magic, version, type, length, requestId}`; fds ride - `SCM_RIGHTS` on the same socket. - - | Request | Answer | - |---|---| - | `Hello{version, pid}` | `Welcome{version, caps[]}` | - | `CreateContext{codec, profile, w, h}` | `{ctx}` or error | - | `CreateSurfaces{w, h, fourcc, n}` | per surface `{id, fd, offsets, pitches, modifier, allocation size}` | - | `ImportSurface{fd, layout}` | `{id}`, only for buffers the registry identifies as its own; anything else gets `VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE` | - | `DestroySurfaces` / `DestroyContext` | | - | `Decode{...}` | no answer on success; errors come back as events | - | `Sync{surface}` | answered when the surface's latest decode is complete, or on timeout or error | - | `QueryStatus{surface}` | answered at once | - | `Readback{surface}` | the CPU fallback for `vaGetImage` (§6.4) | - | server events | `SurfaceDone{id, gen, status}`, `ContextError{ctx, reason}` | - - A reader thread in the driver dispatches answers by request id, so a blocking `vaSyncSurface` on one - thread never stalls `vaEndPicture` on another. No assumption is made about which threads a client - uses. -- **Handles are per connection.** Surface, context and buffer ids live in maps owned by the - connection, never in globals (P8). Each connection owns a `SharedImages::SessionHolder` for the - images it allocated. A GL session that imports an exported fd takes its own `ImageRef`, so images - outlive the VA connection while they are still sampled. -- **Server C ABI** (new, in `MG_Remote/Server`, exported from the server libMobileGL.so): - - `mobilegl_server_register_service(name, version, accept_fn, user)` - - `mobilegl_server_holder_create/destroy` - - `mobilegl_server_image_allocate(holder, w, h, fourcc, flags, out{id, AHardwareBuffer*, fd, layout})` - with a flag `DECODE_TARGET` that adds `GPU_COLOR_OUTPUT` to the YUV usage - - `mobilegl_server_image_release(holder, id)` - - `mobilegl_server_image_begin_write(id)` / `publish_write(id, sync_file)` / `dup_read_fences(id, fds, cap)` -- **Loading.** The server `dlopen`s `libMobileVAService.so` from its own directory (`dladdr`) on the - first `ServiceBind{"mobileva"}`. If the library is missing, it refuses cleanly. The service reaches - the JavaVM with `JNI_GetCreatedJavaVMs` (P10) for the codec list. No Java change is needed in the - APK; anland only packs the extra `.so` into jniLibs. -- **Failure isolation.** - - The driver sends with `MSG_NOSIGNAL` and treats `EPIPE`/EOF as "server gone": every pending and - future call returns `VA_STATUS_ERROR_OPERATION_FAILED` (Sync: `..._DECODING_ERROR`). It never - aborts. - - Objects created after a loss reconnect lazily, so a long-lived VADisplay (Chrome keeps one per - GPU process) can recover. - - Server side, a malformed request ends that connection only. -- **The service never touches backend state.** - - It has its own EGL context on its own thread, never in the backend's share group. - - It **never calls `eglTerminate`** on the default display, which Espryt shares in-process. - - Its only interface with Espryt/Magma is the registry's sync_file fences. - -## 5. Capabilities - -At service load, enumerate `MediaCodecList(REGULAR_CODECS)` over JNI. For each **decoder** that is -`isHardwareAccelerated()` (API 29) and not an alias, and for each supported type (`video/avc`, later -`video/x-vnd.on2.vp9`, `video/av01`, `video/hevc`), record: - -- the codec name -- `profileLevels` -- `VideoCapabilities` width/height ranges and alignment -- `getMaxSupportedInstances()` -- the `FEATURE_LowLatency` (API 30) and `FEATURE_AdaptivePlayback` features - -Log the table once. - -Translation to VA, with host tests: - -| MediaCodec AVC profile | VA profile | -|---|---| -| `AVCProfileConstrainedBaseline` or `AVCProfileBaseline` | `VAProfileH264ConstrainedBaseline` | -| `AVCProfileMain` | `VAProfileH264Main` | -| `AVCProfileHigh` | `VAProfileH264High` | -| `AVCProfileHigh10` | `VAProfileH264High10`, only once P010 output works | - -- Entrypoint: `VAEntrypointVLD` only. -- `VAConfigAttribRTFormat`: `YUV420` (`YUV420_10` with a 10-bit profile). -- `VAConfigAttribMaxPictureWidth/Height` and `vaQuerySurfaceAttributes` `MaxWidth/MaxHeight`: the - codec's upper bounds. -- Surface pixel formats: NV12 (P010 later). -- Memory types: `VA` and `DRM_PRIME_2`. -- If no hardware decoder exists for a type, its profiles are simply not listed. -- If `vaCreateContext` exceeds `getMaxSupportedInstances`, or `AMediaCodec_configure` fails, it returns - `VA_STATUS_ERROR_ALLOCATION_FAILED`, so the client falls back to software for that stream. - -## 6. The four hard problems - -### 6.1 Parsed parameters vs elementary stream (H.264) - -VA gives `VAPictureParameterBufferH264`, `VAIQMatrixBufferH264`, and per slice -`VASliceParameterBufferH264` plus the slice data. That slice data is the whole slice NAL (C7, to -confirm). MediaCodec wants Annex-B access units with SPS/PPS. The client never hands VA the original -SPS/PPS, so we **synthesize** them. - -1. **Slice NALs go in verbatim** with a `00 00 00 01` start code; a start code already present is not - duplicated. Slices with `VA_SLICE_DATA_FLAG_BEGIN/MIDDLE/END` are concatenated. One `vaEndPicture` - produces one access unit. -2. **Pre-parse each slice header** with a bounds-checked RBSP reader over a de-escaped copy of the - first ~64 bytes. The parse is driven by fields we know from the VA picture parameters: - - `first_mb_in_slice`, `slice_type`, `pic_parameter_set_id`, `frame_num` (u(v), - log2_max_frame_num), `field_pic_flag`/`bottom_field_flag`, `idr_pic_id`, - `pic_order_cnt_lsb`/`delta_pic_order_cnt_bottom`, `delta_pic_order_cnt[0..1]`, - `redundant_pic_cnt`, `direct_spatial_mv_pred_flag`, `num_ref_idx_active_override_flag`. - - We need **`pic_parameter_set_id`** to give our PPS the same id the slices name. - - We need **`num_ref_idx_active_override_flag`**: VA gives only the *effective* - `num_ref_idx_l0/l1_active_minus1` per slice, and the PPS defaults - (`num_ref_idx_l{0,1}_default_active_minus1`) are **not** in VA. PPS default = the effective value - of a slice with override = 0; any value if every slice overrides. -3. **SPS** (id 0): - - `profile_idc` and constraint flags come from the config's VAProfile: CB = 66 with - constraint_set0+1, Main = 77, High = 100, High10 = 110. - - For profile ≥ 100: `chroma_format_idc` and `bit_depth_*_minus8` from VA, - `qpprime_y_zero_transform_bypass_flag` = 0, `seq_scaling_matrix_present_flag` = 0 (scaling lists - go in the PPS, see 4). - - From VA: `log2_max_frame_num_minus4`, `pic_order_cnt_type`, `log2_max_pic_order_cnt_lsb_minus4`, - `delta_pic_order_always_zero_flag`, `max_num_ref_frames = num_ref_frames`, - `gaps_in_frame_num_value_allowed_flag`, `pic_width_in_mbs_minus1`, `frame_mbs_only_flag`, - `mb_adaptive_frame_field_flag`, `direct_8x8_inference_flag`. - - **Gotcha:** VA's `picture_height_in_mbs_minus1` is the *frame* height in MBs, so - `pic_height_in_map_units_minus1 = ((h+1) >> !frame_mbs_only) - 1`. - - `frame_cropping_flag` = 0. VA surfaces are coded-size; the client crops. - - `level_idc` is **not in VA**. Pick the smallest level in Table A-1 whose MaxFS ≥ frame MBs, - MaxDpbMbs ≥ MBs × max(num_ref_frames, 1) and MaxMBPS ≥ MBs × 60, capped at the codec's maximum - level. This is a heuristic (open question Q3). - - **VUI** carries only `bitstream_restriction_flag` = 1 with `max_num_reorder_frames` = 0, - `max_dec_frame_buffering` = max(num_ref_frames, 1), motion-vector limits at their maximum and no - byte or bit limits. This is deliberate; see §6.2. Colour description is irrelevant to the decoded - samples, so it is not emitted. - - **POC type 1** needs `offset_for_non_ref_pic`, `offset_for_top_to_bottom_field` and the - `offset_for_ref_frame[]` cycle, and **none of them are in VA**. VA passes resolved POCs instead. - POC drives temporal direct and implicit weights, so it changes pixels. M1 **refuses** POC type 1 - at `vaEndPicture` (`VA_STATUS_ERROR_DECODING_ERROR`, logged once); see TODO H264-2. -4. **PPS** (id from the slice): - - `seq_parameter_set_id` = 0. - - From VA: `entropy_coding_mode_flag`, `bottom_field_pic_order_in_frame_present_flag` (VA - `pic_order_present_flag`), `weighted_pred_flag`, `weighted_bipred_idc`, `pic_init_qp_minus26`, - `pic_init_qs_minus26`, `chroma_qp_index_offset`, `deblocking_filter_control_present_flag`, - `constrained_intra_pred_flag`, `redundant_pic_cnt_present_flag`. - - `num_slice_groups_minus1` = 0. FMO is refused. - - Then, when any of them is not the default: `transform_8x8_mode_flag`, the scaling lists and - `second_chroma_qp_index_offset`. - - **Scaling lists:** when the IQ matrix is not all-flat-16, set `pic_scaling_matrix_present_flag` - = 1 and write all 6 (+2 with 8x8) lists **explicitly**. VA gives effective lists, so the - fall-back rules never matter. - - **Gotcha (Q4):** whether `VAIQMatrixBufferH264` lists are in zigzag or raster order differs in our - memory of the client sources. Verify with an x264 `--cqm jvt` stream and the A/B driver before - trusting either. -5. **Emit** SPS/PPS before the access unit only when their bytes differ from the last sent with the - same id, and again after every (re)configure or flush. -6. **Configure** MediaCodec lazily at the first `vaEndPicture`, when SPS/PPS exist: `csd-0` = SPS, - `csd-1` = PPS, plus width/height. Re-configure, after draining the old codec, when the coded size, - profile or bit depth changes (§6.2). -7. **M1 refuses** (logged once, `VA_STATUS_ERROR_UNSUPPORTED_PROFILE` or `_DECODING_ERROR`): - - field pictures (`field_pic_flag` = 1; MBAFF frames are fine) - - FMO/ASO - - chroma formats other than 4:2:0 - - POC type 1 - -### 6.2 Output order and surface mapping - -- **Tagging.** Every queued input carries `presentationTimeUs = seq`, a per-context monotonic decode - counter. The context keeps `seq → {surface id, surface generation}`. An output buffer's - `presentationTimeUs` names its surface (P11, to confirm). MediaCodec's own output **order is - irrelevant**: we never present in its order. Clients that reorder (Chrome, ffmpeg) display in their - own order. -- **Release.** Release every output with `render=true` into the AImageReader. Match the acquired - `AImage` to the released buffer FIFO, asserting `AImage_getTimestamp == pts × 1000`. -- **Latency is the deadlock risk.** ffmpeg (framemd5) downloads a frame, which calls `vaSyncSurface` - on its only thread, after its own reorder delay. If MediaCodec holds that frame waiting for more - input, nothing more comes: deadlock. Mitigations, in order: - 1. The VUI rewrite (`max_num_reorder_frames = 0`). A conforming decoder then bumps every picture as - soon as it is decoded, so decode-order output gives the lowest latency. This does not change - samples: POC values in slice headers are untouched. - 2. `KEY_LOW_LATENCY = 1` where `FEATURE_LowLatency` is listed, plus `KEY_PRIORITY = 0` and a high - `KEY_OPERATING_RATE`. - 3. **Spike S2 must measure input→output lag** on the device (H.264 with B-pyramids). If any - hardware decoder still holds frames, document it and bound `vaSyncSurface` by a timeout - (`VA_STATUS_ERROR_TIMEDOUT`, default 2 s; `vaSyncSurface2` gets the client's own timeout). Never - wait forever. -- **Surface state.** Each surface has `pendingGen`, which `Decode` increments, and `doneGen`, set when - its copy fence is published. `vaSyncSurface` waits for `doneGen ≥ pendingGen` *as of the call*. It - answers only after the copy's fence has **signalled**, because after `vaSyncSurface` a client may - `mmap` the exported dma-buf. `vaQuerySurfaceStatus` returns `VASurfaceRendering` or - `VASurfaceReady` without blocking. -- **Readers that never sync** (C8). At `Decode` the service calls `begin_write(image)`, which opens a - pending write generation with no fence yet. At copy completion it calls `publish_write(image, - fence)`. - - **TODO (P5):** both backends' YUV sampling must honour the write fence and, for a pending write - without a fence, CPU-wait on the registry with a bound (e.g. 100 ms, logged once). That makes the - GL path correct whether or not a client syncs. - - It does not deadlock: the decode input comes from the client's VA connection (another server - thread), not from the GL session that waits. -- **Lost outputs.** If an output with `seq = N` arrives while older entries are still pending, the - decoder dropped them (decode-order output is expected). Complete them with - `VA_STATUS_ERROR_DECODING_ERROR` (`vaQuerySurfaceError`), log, and never leave a waiter hanging. -- **Seek / flush.** VA has no flush; clients restart at an IDR. Feed it as is; MediaCodec's references - reset at the IDR. Late outputs of pre-seek frames still land in their own surface generation. A - surface re-targeted since then has a newer generation, so the stale output is **dropped, not - copied**. The generation check matters because "last write wins" is not guaranteed. -- **Resolution change.** - - A new coded size inside the same context drains the old codec: queue EOS, wait for all outputs, - copy them. Then configure a new one. The change happens at an IDR, so no references are lost. - - Chrome and ffmpeg usually recreate the VA context instead, which simply creates a new codec. -- **Destroy mid-stream.** `vaDestroyContext` stops and deletes the codec, drops pending outputs, and - completes all waiters with an error. `vaDestroySurfaces` on a surface with a pending decode marks the - entry dead; its output is discarded. -- **Hidden frames** do not exist in H.264. VP9/AV1 notes are in §9. - -### 6.3 Buffer ownership: zero-copy and truthful export - -**Constraint.** VA surfaces are created up front and exported once, and clients cache the import (C1). -MediaCodec decodes into buffers that the AImageReader BufferQueue allocates and picks per frame. No -public API lets us hand MediaCodec our own buffers. - -| Option | Verdict | -|---|---| -| **A. Aliasing**: re-point a surface's shared image at the codec's output AHB | **Rejected.** It is correct only for importers that go through MobileGL by inode. A client that `mmap`s the exported fd (GStreamer downstream of DMABuf caps, ffmpeg `hwmap`, a future direct KWin/Firefox import) would read the surface's own, stale memory. The codec's buffer is typically opaque or compressed (UBWC-like), so it can never be exported as linear NV12 either. | -| **B. Server GPU copy** into the surface's own linear NV12 AHB | **Chosen.** Correct for every consumer, keeps the export truthful, and costs one small GPU pass (1080p NV12 ≈ 3 MB read + 3 MB written; 4K60 ≈ 1.5 GB/s, small against the GPU's bandwidth). Measure it in M1. | - -**Copy path (B):** -- The AImageReader uses `AIMAGE_FORMAT_PRIVATE` with usage `GPU_SAMPLED_IMAGE`, so the codec keeps its - preferred (possibly compressed) layout, and `maxImages` ≈ 6. -- The copy thread owns an EGL context (GLES 3) and imports the codec AHB (`AImage_getHardwareBuffer` - → `eglGetNativeClientBufferANDROID` → `EGL_NATIVE_BUFFER_ANDROID` → `GL_TEXTURE_EXTERNAL_OES`). It - imports the surface AHB the same way, as an FBO attachment. -- It draws with **`GL_EXT_YUV_target`**: a `__samplerExternal2DY2YEXT` source written to a - `layout(yuv) out` target, which is a raw YUV→YUV copy with no colour conversion. NEAREST sampling - gives every 2x2 quad the same chroma sample, so the target's chroma subsampling writes it back - exactly. 8-bit and 10-bit values survive the float round trip. **Bit-exact by construction**, to be - proven by spike S3. -- Copy region = min(surface, codec crop rect); the rest of the surface is untouched. -- **Write after read.** Before overwriting a surface, take `dup_read_fences` and make the GL context - wait on them (`EGL_ANDROID_native_fence_sync` import + `eglWaitSyncKHR`). -- **Write publish.** Create an EGL native fence, `publish_write(image, fence)`, and - `AImage_deleteAsync(image, dup(fence))` so the codec buffer returns as soon as the GPU has read it. - No CPU wait on the main path. The only CPU wait is the one `vaSyncSurface` does for its answer. -- **Decode-target images** are the registry's YUV images plus `GPU_COLOR_OUTPUT` (new allocation flag). - Check `AHardwareBuffer_isSupported` with exactly that usage. CPU usage stays on, which keeps - allocators off compressed layouts and makes `lockPlanes` meaningful. -- **Truthful export.** Once per format at service start, a **layout probe** checks that the CPU view - equals the raw dma-buf view: write a pattern through `lockPlanes` and read it back through `mmap` of - the exported fd at the claimed offsets (spike S3). - - Pass: surfaces are exported as `DRM_FORMAT_NV12`, two layers or one composed object, with the - probed offsets and pitches and modifier **`DRM_FORMAT_MOD_LINEAR`**. MobileGL's importer already - accepts LINEAR or INVALID. - - Fail: export with `DRM_FORMAT_MOD_INVALID`, and route `vaDeriveImage` to "unsupported" so clients - use `vaGetImage`, which the server serves by `Readback`. -- **Export flags.** `vaExportSurfaceHandle` honours `SEPARATE_LAYERS` (R8 + GR88 / R16 + GR1616) and - `COMPOSED_LAYERS` (NV12 / P010) for every client. It returns a `dup` of the surface's fd each call. -- **Fallbacks when there is no `GL_EXT_YUV_target`** (non-Adreno devices; availability unverified): - 1. A Vulkan pass: read with `VkSamplerYcbcrConversion` in `RGB_IDENTITY` / full range / NEAREST, and - write through per-plane views of the surface AHB, if it maps to `G8_B8R8_2PLANE_420_UNORM` with - the needed usage. - 2. A **labelled, counted CPU copy** from a `YUV_420_888` + `CPU_READ_OFTEN` AImageReader. Never - silent; logged once with the reason. Chosen at service start and reported in the caps log. -- **Proof of "no CPU copy on the GL path."** - - The server log must have no "foreign ... refreshed by a CPU copy" line (P4) during playback. - - MobileVA's stats line (`MOBILEVA_STATS=1`, every 5 s per context) shows `decoded`, `gpu_copies`, - `cpu_copies = 0` and `readbacks = 0`. - -### 6.4 CPU access (vaDeriveImage / vaGetImage / vaMapBuffer) - -- `vaDeriveImage` (only with a passing layout probe) returns an NV12 `VAImage` whose buffer maps the - surface's dma-buf in the client (`mmap`, `DMA_BUF_IOCTL_SYNC` START/END around map/unmap). It - implies a `vaSyncSurface`. -- `vaGetImage` copies from that mapping, or from `Readback` when no mapping is allowed. -- Parameter and slice buffers are client memory only. `vaMapBuffer` on them is plain memory. -- `vaPutImage` / `vaPutSurface` / VPP / encode: `VA_STATUS_ERROR_UNIMPLEMENTED`. - -## 7. A/B knob, install, environment - -- **Install.** - - `xdeploy.sh` installs `/usr/lib/dri/mobileva_drv_video.so` by rename-into-place, beside the old - `msm_drm_drv_video.so`, which stays. - - The APK packs `libMobileVAService.so` next to `libMobileGL.so`. - - The driver exports the init symbol for the sysroot's libva (`__vaDriverInit_1_24`, built from - `VA_DRIVER_INIT_FUNC`). libva also tries lower minors. -- **Default and knob.** - - `/etc/environment.d/10-mobilegl.conf` and `/etc/profile.d/mobilegl.sh` set - `LIBVA_DRIVER_NAME=mobileva` and `GST_VA_ALL_DRIVERS=1` (C10). - - The one documented knob is `MOBILEGL_VA_DRIVER`, which `mobilegl-startup.sh` and a helper - `mobilegl-va-driver {mobileva|msm_drm}` (it rewrites both files) turn into `LIBVA_DRIVER_NAME`. - `msm_drm` is the old driver. A per-process `LIBVA_DRIVER_NAME=msm_drm mpv ...` works too. - - `mobilegl-startup.sh chrome` exports the chosen name explicitly, so the GPU process (which - inherits the browser's environment) uses it (C9). - - `MOBILEGL_CHROME_VIDEO_DECODE=software` keeps its meaning. -- **Proof of which driver a process uses:** `grep _drv_video /proc//maps`; the driver's - `vaQueryVendorString` ("MobileVA (MediaCodec )"); `MOBILEVA_TRACE=1` logs every VA call. -- **Render node.** The driver never `ioctl`s the DRM fd libva hands it, and accepts DRM, Wayland and - X11 display types (Chrome uses DRM; mpv may use Wayland). - -## 8. Verification plan (per codec, on the device, both backends) - -**Bit-exactness.** -- Generate streams in the container with ffmpeg `libx264`: - - Baseline / Main / High - - CAVLC (`-coder 0`), weighted prediction (`-weightp 2`), B-pyramid with `-bf 3 -refs 4` - - multiple slices (`-slices 4`), custom CQM (`-x264opts cqm=jvt`) - - odd sizes (1278x718), long GOP (`-g 600`) - - a mid-stream resolution change: two encodes concatenated into `.ts` with `-c copy` -- For each: `ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -i X -pix_fmt nv12 -f framemd5 hw` - against `ffmpeg -i X -pix_fmt nv12 -f framemd5 sw`. -- Expect identical hashes. Report every mismatch. Repeat with `LIBVA_DRIVER_NAME=msm_drm` (A/B). - -**vainfo.** `vainfo --display drm --device /dev/dri/renderD128` profiles and entrypoints equal the -service's logged MediaCodec caps table, nothing more. - -**mpv.** -- `--hwdec=vaapi-copy` correct: render to a raw file (`--o`) and framemd5 it against software. -- `--hwdec=vaapi` (GL interop on MobileGL) plays with correct colours. Prerequisite: TODO R3, - per-plane R8/GR88 import (C5/C6). - -**GStreamer.** `filesrc ! qtdemux ! h264parse ! vah264dec ! videoconvert ! checksumsink` equals the -same pipeline with `avdec_h264`. - -**Chrome.** -- `cdpmedia.py` shows `VaapiVideoDecoder` / `kIsPlatformVideoDecoder = true`, and - `/proc//maps` shows `mobileva_drv_video.so`. YouTube is forced to AVC by a `CDP_EXPR` override - of `MediaSource.isTypeSupported`; also local files. -- Colours exact: a pattern clip with known BT.709 limited-range patches, pixel-checked in screenshots. -- No flicker: two screenshots plus a screen recording. -- No GPU-process restarts: no `exit_code` in Chrome's log. -- Seeking works: repeated `video.currentTime = t`. -- `getVideoPlaybackQuality()` dropped/total frames at 720p60, 1080p60 and 4K60 (local H.264 files; - YouTube AVC only goes to 1080p). - -**Cost.** -- Server-process CPU (`/proc//stat` over 30 s, skill `device/measure.sh`) and the Chrome GPU - process's CPU, for ours vs `msm_drm` on the same content. -- No foreign-copy log line and `cpu_copies = 0` (§6.3). -- GPU copy time per frame (`GL_EXT_disjoint_timer_query` if present, else fence-to-fence). - -**Desktop.** Still fine on both backends: `desktop-verify.sh`, scrolling, resize, lock/unlock -(`kscreenlocker_greet --testing`), panels. - -**Host tests (WSL archlinux, clang, `ctest -E DirectVulkan`, never two suites at once).** -- Bit writer/reader, exp-Golomb, emulation prevention. -- Slice-header pre-parse on real x264 slices. -- SPS/PPS synthesis: golden bytes for fixed VA inputs. Also a round trip: parse a real stream's - SPS/PPS into VA structs the way a client would, rebuild, re-parse, and compare every semantic field - except VUI. -- Surface/order mapping state machine: reorder, drops, generation-stale outputs, timeouts, destroy - mid-stream. -- Protocol encode/decode round trips and malformed-frame rejection. -- Capability translation. - -Device rules: battery ≥ 40%, USB serial HA27Q3LQ, leave the device on the merged build, on Magma, with -Plasma up. - -## 9. Milestone TODO list - -### M1: H.264, small and simple (the only milestone in scope now) - -**Spikes first.** Throwaway probes; keep them as skill probes only if they stay useful. -- **S1.** `LIBVA_TRACE` with the **old** driver for ffmpeg, mpv (both hwdec modes), GStreamer and - Chrome: call order, threads, whether and when `vaSyncSurface` comes, slice-data framing, export - flags. Settles C6–C11. -- **S2.** NDK MediaCodec latency probe (adb-shell ELF). Feed an x264 B-pyramid stream as is vs with - the VUI rewrite, ± `KEY_LOW_LATENCY`, through an AImageReader. Log input→output lag in frames and - check pts propagation (P11). **Go/no-go for the design in §6.2.** -- **S3.** Y2Y copy probe: codec output (PRIVATE) → `GL_EXT_YUV_target` copy into an NV12 AHB with - `GPU_COLOR_OUTPUT | CPU_*`. Compare bytes with a ByteBuffer-mode decode of the same frame. Also the - layout probe (lockPlanes vs `mmap`). Settles §6.3 and the truthful-export check. - -**Then:** -1. `MobileVA/` skeleton + CMake options, host test target; nothing links into MobileGL. -2. `Common/`: protocol, framing, SCM_RIGHTS, bit I/O, emulation prevention + tests. -3. `Codec/H264/`: pre-parse, SPS/PPS synthesis, AU assembly, change detection + golden tests. -4. MobileGL hooks: - - `ServiceBind` in `PairAcceptor` and a service registry - - the server C ABI (§4.3) - - the `DECODE_TARGET` allocation flag - - **YUV sampling waits on write fences and on pending writes** (P5), in both backends - - tests in `MG_Test` (SharedImageTest, pairing tests) -5. `Service/`: lazy load, JNI caps, session per connection, codec + reader per context, seq→surface - map, copy thread + fences, Sync/Query/Readback, stats, failure isolation. -6. `Driver/`: the vtable, objects, connection + reader thread + lazy reconnect, export/derive/get - image, `MOBILEVA_TRACE`. -7. Packaging: anland jniLibs, `xbuild.sh`/`xdeploy.sh` install, environment files, knob + helper, - `mobilegl-startup.sh chrome`. -8. Verification (§8) on Espryt and Magma, with numbers. -9. Land: - - README (knobs, A/B switch) - - skill SKILL.md / reproduce.md (build + install the driver and service on a new machine) - - memory files for non-obvious findings - - remove worktrees and build dirs - -### M2: VP9 (TODO, not started) - -- VA VP9 slice data is the **whole frame** (uncompressed header + compressed header + tiles), so there - is no header rebuild. Feed each frame as one input; clients split superframes (unverified per - client). -- **Profiles:** 0 (8-bit 4:2:0), 2 (10-bit → P010). Profiles 1/3 (4:4:4) only if MediaCodec lists - them. -- **Hidden frames** (`show_frame = 0`, typically the alt-ref). - - The target surface must hold the hidden frame, because the client later displays it by - `show_existing_frame` **without** a VA call (Chrome's VP9 decoder does this; unverified for - others). MediaCodec never outputs a hidden frame. - - Plan: after the hidden frame, queue a **synthesized 1-byte `show_existing_frame` header** - (frame_marker, profile bits, `show_existing_frame = 1`, `frame_to_show_map_idx` = a slot from the - frame's `refresh_frame_flags`). Map its output to the hidden frame's surface. - - **Gotcha to verify first:** in some decoders, showing an existing frame may update - `last_show_frame` / previous-frame MV state, which feeds `use_prev_frame_mvs` of the next frame. - Injecting between a hidden ARF and the next frame could then change pixels. Test with libvpx ARF - streams and framemd5. If it breaks, inject only after the next shown frame, or keep the hidden - frame's surface pending until a later output can be routed to it (open question Q6). -- A client-submitted `show_existing_frame` (some clients do submit it) maps to "copy the slot's last - known surface" with no codec input. -- Resolution changes on non-key frames (reference scaling) are legal in VP9; adaptive playback needs - `KEY_MAX_WIDTH/HEIGHT` = context size. - -### M3: AV1 (TODO, the hardest) - -- VA AV1 slice data carries **tile data only** (tile-group OBU payloads, with per-tile - offsets/sizes in `VASliceParameterBufferAV1`). The **sequence header OBU, frame header OBU and tile - group framing must all be synthesized** from `VADecPictureParameterBufferAV1`. -- **Sequence header:** - - From VA: profile, `still_picture`, `use_128x128_superblock`, the tool-enable flags, - `enable_order_hint` + `order_hint_bits`, bit depth, `mono_chrome`, colour range, subsampling, - chroma position, `film_grain_params_present`. - - Chosen: one operating point (idc 0), `seq_level_idx` from size (open question Q3), - `frame_id_numbers_present_flag = 0`, `reduced_still_picture_header = 0`, no timing/decoder-model - info. -- **Frame header:** the full `uncompressed_header()` from VA: - - frame type, show/showable flags, `error_resilient_mode`, `disable_cdf_update`, screen content / - integer MV, `frame_size_override_flag = 1` with explicit sizes, render size, superres, - `allow_intrabc`, explicit `ref_frame_idx[]` (`frame_refs_short_signaling = 0`), - `allow_high_precision_mv`, interpolation filter, `is_motion_mode_switchable`, `use_ref_frame_mvs`, - `refresh_frame_flags`, `primary_ref_frame`, `disable_frame_end_update_cdf` - - `tile_info()` from VA tile counts/sizes + `context_update_tile_id`; our own `TileSizeBytes = 4` - - quantization (deltas, qmatrix), segmentation (write every feature explicitly), delta q/lf - - loop filter **with every ref/mode delta written explicitly**, CDEF, loop restoration, `tx_mode`, - reference select, skip mode, warped motion, reduced tx set - - global motion params, film grain (`update_grain = 1`, full params) -- **Gotchas:** - - **Global motion params are coded relative to the primary reference frame's params** - (`PrevGmParams`), so the rebuilder must track every frame's GM params per slot exactly as the - decoder does. - - `ref_order_hint[]` is written only when error-resilient and order hints are enabled. - - Multiple tile groups per frame are merged into one tile group OBU with re-written - `tile_size_minus_1` fields. -- **Hidden frames:** as for VP9, synthesize a frame-header OBU with `show_existing_frame = 1` (temporal - delimiter first). **Never for a hidden KEY frame:** showing an existing key frame runs the reference - refresh process and changes decoder state. That case is open question Q7. -- **Film grain:** MediaCodec outputs grain-applied frames. Copy them into - `current_display_picture`'s surface. The grain-free reference surface is only a handle for us, - because MediaCodec keeps its own references. framemd5 against libdav1d is expected to match (grain - synthesis is normative). -- **10-bit:** P010 surfaces; S3's copy proof must be repeated for 10-bit. - -### M4: HEVC + 10-bit (TODO) - -- VA HEVC slice data is the whole slice NAL. **VPS/SPS/PPS** are synthesized from - `VAPictureParameterBufferHEVC` (+ `...HEVCRext` / SCC). -- **Missing from VA:** `profile_tier_level` level (heuristic), VPS fields (derive from SPS values) and, - above all, **the SPS's short-term RPS candidate sets**. VA gives only `num_short_term_ref_pic_sets` - and the slice-level `st_rps_bits`, and the long-term SPS candidates are missing too. -- **Approach:** synthesize an SPS with `num_short_term_ref_pic_sets = 0` and - `long_term_ref_pics_present` as needed. **Rewrite every slice segment header** with an explicit - `st_ref_pic_set` (and explicit long-term entries) built from the picture's RPS in VA - `ReferenceFrames`: - - `ST_CURR_BEFORE`/`AFTER` give used entries. - - DPB pictures with neither flag give "foll" entries with `used_by_curr = 0`. - - `LT_CURR` gives long-term entries via `poc_lsb_lt` and an explicit MSB. - - This is feasible because HEVC slice data starts **byte-aligned** after `byte_alignment()` - (`slice_data_byte_offset` in VA). Re-serialize the header, re-escape it, and append the original - slice data bytes. - - Entry points (tiles/WPP) are copied as parsed. -- **Scaling lists:** write `VAIQMatrixBufferHEVC` explicitly, including the 16x16/32x32 DC values. -- **10-bit:** Main10 → P010; verify 10-bit Y2Y precision in S3. -- `sps_max_num_reorder_pics = 0` / `sps_max_latency_increase_plus1 = 0` for low latency, as in H.264. - -### Later TODOs (from M1 deferrals) - -| Id | TODO | -|---|---| -| H264-1 | Field pictures (PAFF): both fields arrive as two VA pictures with the same target. Assemble both field NALs into one access unit, or feed them separately and map the single output to the shared target. Verify the codec's behaviour. | -| H264-2 | POC type 1: rewrite slice headers to POC type 0 (CABAC slice data is byte-aligned after `cabac_alignment_one_bit`; CAVLC needs a bit shift), or recover the offsets from the resolved POCs the client sends. | -| H264-3 | High10 / 4:2:2 only if a device lists them. | -| FF | **Firefox:** it decodes with ffmpeg's VA hwaccel in its RDD process and exports with `vaExportSurfaceHandle`, probably `SEPARATE_LAYERS` imported per plane (needs R3). Checks: whether the RDD sandbox allows our `connect()` (connect at `vaInitialize`; `MOZ_DISABLE_RDD_SANDBOX=1` only for diagnosis), how its `vaapitest` probe process reacts (vaInitialize + profile query must be fast and side-effect free), and which prefs are needed for a non-allowlisted GL vendor. No app-specific code. | -| R1 | **Copy elision** for MobileGL-internal readers: let GL readers sample the codec AHB directly and write the surface copy only when someone can see the raw memory. Blocked: a third party may `mmap` the exported fd with no VA call, so we cannot know. Revisit only with a safe signal. | -| R2 | **Explicit fences end-to-end:** attach the copy's sync_file to the exported dma-buf with `DMA_BUF_IOCTL_IMPORT_SYNC_FILE` (kernel ≥ 6.0; the device has 6.1), so implicit-sync consumers wait on the GPU and `vaSyncSurface` can answer before the fence signals. | -| R3 | **Per-plane imports in MobileGL:** R8/GR88 (R16/GR1616) EGLImages that alias a plane of a server YUV image. Needed by mpv's GL interop, Firefox and KWin's YUV linux-dmabuf path. Espryt: GPU plane extraction via Y2Y sampling; Magma: per-plane views. | -| R4 | One GPU pass instead of two for MobileGL readers (Y2Y copy + RGBA conversion), once R1 is solved. | -| R5 | Shared-memory ring for large access units instead of socket writes, if profiling shows socket cost at 4K. | - -## 10. Open questions - -- **Q1.** Do Adreno's (and other vendors') hardware AVC decoders honour `max_num_reorder_frames = 0` - / `KEY_LOW_LATENCY` with immediate output? (S2.) If not, what bounded strategy do we take for - single-threaded sync-after-decode clients? -- **Q2.** Is `GL_EXT_YUV_target` rendering into a `Y8Cb8Cr8_420 | GPU_COLOR_OUTPUT | CPU_*` AHB - allowed and bit-exact? (S3.) How common is the extension outside Adreno? -- **Q3.** Level selection for synthesized SPS / sequence headers when VA gives none: smallest - sufficient level, or the codec's maximum? Some decoders size their DPB by level. -- **Q4.** `VAIQMatrixBufferH264` list order convention. Verify against the old driver with a CQM - stream. -- **Q5.** Does Chrome sync surfaces at all (C8)? If not, the bounded server-side wait in P5 is - load-bearing for correctness, not just a safety net. -- **Q6.** VP9 hidden-frame injection vs `last_show_frame` / previous-MV state. Where may a synthesized - `show_existing_frame` be inserted safely? -- **Q7.** AV1 hidden key frames: how do we obtain their pixels without a state-changing - show-existing? -- **Q8.** `ServiceBind` on the shared listener vs a separate socket: confirm the acceptor change stays - small and keeps the PairAcceptor tests' guarantees. -- **Q9.** Concurrency limits: how many simultaneous hardware decoders the device allows - (`getMaxSupportedInstances`), and how Chrome reacts to `ALLOCATION_FAILED` on the N+1th video. -- **Q10.** Server restart: Chrome's GPU process restarts with the GL session anyway. Do mpv and - GStreamer recover from `OPERATION_FAILED` mid-stream, or must the driver reconnect transparently and - re-create contexts? (It cannot rebuild MediaCodec references; it would have to wait for the next - IDR.) diff --git a/docs/Performance/glmark2-handoff.md b/docs/Performance/glmark2-handoff.md deleted file mode 100644 index eaad29d6..00000000 --- a/docs/Performance/glmark2-handoff.md +++ /dev/null @@ -1,201 +0,0 @@ -# glmark2 performance work: handoff - -Status on 2026-10-04 after the first optimization pass on top of the -[baseline](glmark2-baseline.md). Everything here was measured on the anland Plasma desktop of the -Lenovo TB321FU (Adreno 750) at **pinned clocks** (CPU 1.80 / 2.25 / 2.25 / 2.25 GHz, GPU 680 MHz; -see the baseline). Single runs or two at most per point, so the numbers are **approximate** -(light scenes vary about +-15% run to run). The tablet was in portrait for the later runs, so the -"after" fullscreen numbers are 1600x2560 and the "before" ones 2560x1600 (same pixel count). - -## Headline - -glmark2 score, `-b :duration=5`, default scene list: - -| | stock kgsl stack | Espryt before | Espryt now | Magma before | Magma now | -|---|---|---|---|---|---| -| es2, 800x600 window | ~1076-1180 | ~1319 | **~1887** | ~778 | **~1213** | -| es2, fullscreen | ~1177 | ~572 | ~561 | ~354 | ~404 | -| desktop GL, 800x600 window | ~1161 | ~1283 | **~1809** | ~743 | **~1186** | - -The "now" es2 window scores include the two `buffer update-method=map` scenes, which MobileGL now -runs (they were Unsupported before), so they are a fair comparison with stock's. - -Per scene (es2 window unless marked F = fullscreen; FPS): - -| scene | stock | Espryt before | Espryt now | Magma before | Magma now | -|---|---|---|---|---|---| -| texture | 1269 | 1672 | ~2210 | 915 | ~1580 | -| build use-vbo=false | 1095 | 467 | ~1215 | 472 | ~1040-1190 | -| build use-vbo=true | 1287 | 1675 | ~2450 | 1062 | ~1730 | -| desktop blur | 976 | 275 | **~1000** | 157 | ~680 | -| desktop shadow | 1044 | 234 | **~1000** | 125 | ~830 | -| ideas | 688 | 138 | ~550 | 66 | ~354 | -| terrain | 443 | 149 | ~220 | 115 | ~157 | -| shadow | 975 | 1139 | ~1840 | 644 | ~1170 | -| refract | 838 | 981 | ~1280 | 331 | ~520 | -| jellyfish | 1185 | 1438 | ~2170 | 841 | ~1155 | -| buffer map (2 scenes) | 330 / 408 | Unsupported | ~465 | Unsupported | ~431 | -| texture F | ~1430 | ~726 | ~597 | ~445 | ~398 | -| terrain F | - | - | ~142 | - | ~112 | - -**Remaining gap:** Espryt is at or above stock in every windowed scene except **ideas (0.8x)** and -**terrain (0.5x)**. Magma is behind on most draw-heavy scenes (ideas 0.5x, terrain 0.35x, desktop -0.7-0.8x, refract 0.6x). **Fullscreen** is the biggest gap on both backends (0.4-0.5x of stock), -and nothing landed here addresses it. - -## Done (all on origin/feat/disaggregated) - -| commit | change | why / evidence | effect (approx) | -|---|---|---|---| -| `4722fa38` | the baseline report | - | - | -| `66b47a10` | **glFinish waits for the GPU** on the remote path (a server fence created, waited with `GL_SYNC_FLUSH_COMMANDS_BIT`, destroyed); **Magma submits** once 1024 retired per-clear objects pile up with nothing submitted; **ES contexts advertise** `GL_OES_rgb8_rgba8`, `GL_OES_depth24`, `GL_OES_mapbuffer` (with `glMapBufferOES` / `glUnmapBufferOES` / `glGetBufferPointervOES` exported as the core calls) | glFinish only waited for the server's apply, so off-screen rendering ran unbounded (glmark2 `--off-screen` "6846" / "12117" fps) and drove Magma's server to `VK_ERROR_OUT_OF_HOST_MEMORY` in `ClearWireFramebuffer`; es2 `--off-screen` could not start (glmark2 picked `GL_RGBA4` and no depth) | off-screen now real numbers (Espryt texture ~866, Magma ~800) and no crash; es2 `--off-screen` runs; the two buffer-map scenes run | -| `2de0d6dd` | **client-array buffers are reused** from a per-share-group pool (respecify, a non-blocking record, instead of a blocking ResourceCreate + destroy per array per draw); contiguous element ranges copied in one memcpy; the fetch plan skips sorting an already ascending range | desktop blur/shadow paid 28/52 blocking creates per frame, build use-vbo=false 2; `std::sort` was 27% of the client in build use-vbo=false | build use-vbo=false Espryt 467 -> ~1100, Magma 472 -> ~1040; blocking replies per frame in desktop 29/53 -> 1 (fps of desktop barely moved at this step: the next item was the limit) | -| `d627fca3` | **targeted wake-ups:** the client publishes the applied sequence it waits for (`RingControl::producerWakeSeq`, its own cache line); the server rings a parked client only once that sequence is applied (or the event ring filled); the parked flag is stored with release so the notifier sees the target | while the client waited for its present reply the server rang it after every record it applied: 18% of Espryt's apply thread was `SocketDoorbell::Notify`, and every ring was a futile wake-up and re-park on the client | Espryt desktop ~250 -> ~800, ideas 138 -> ~380, texture 1672 -> ~2190; Magma desktop ~150 -> ~550-650, ideas 45 -> ~137, refract 372 -> ~540 | -| `963f4d81` | Magma **reuses completed command buffers** (pool resets them at the next begin) instead of `vkFreeCommandBuffers` + `vkAllocateCommandBuffers` per submission | `FreeRetiredCommandBuffersCompletedUpTo` was 15% of Magma's apply thread in ideas | small: Magma texture / desktop +~10% | -| `915882b2` | the server **times records only when** `MOBILEGL_SERVER_FRAME_STATS` is on | two `steady_clock::now()` per record were ~5% of Espryt's apply thread | with the next row | -| `e5ee31b0` | the anland server build uses **`android-30`** (the APK's minSdk) in `build-android.sh` / `reproduce.md`: `thread_local` is native ELF TLS instead of emulated TLS | `__emutls_get_address` + `pthread_getspecific` were 7-12% of Espryt's apply thread. **An existing build dir keeps its API level: reconfigure (delete it) to get android-30** | Espryt (with the row above) desktop ~800 -> ~1000, ideas ~380 -> ~550, terrain 168 -> ~220; Magma unchanged | -| `bb31f374` | Magma **keeps the wire draw's render pass open** across draws to the same attachments. Every command that may not sit inside a pass (barriers, copies, clears, blits, dispatches, other passes' begins) in the resource managers and wire helpers first calls `EndActiveRenderPassOn(cb)` (`RenderPassGuard.h`); the per-draw "make image writes visible" barrier for sampled images is only recorded when an image may have been written since the last one (`WireImageWriteEpoch`, bumped by every pass end, out-of-pass work and storage-image draw); same-layout attachment barriers are skipped when the pass continues | `SetupWireDraw` ended and began a VkRenderPass for every draw (ideas: 305 passes per frame; End/Begin ~21% of the apply thread, plus `vkEndCommandBuffer` cost), and on a tiler each pass loads and stores its attachments | Magma ideas ~146 -> ~354, desktop shadow ~640 -> ~830; visually checked on ideas, terrain, shadow, refract, jellyfish, desktop, bump, conditionals, effect2d, Plasma, Chrome and the lock screen | - -Each landed with the host unit tests green (WSL clang, `ctest -L unit -E DirectVulkan`, 2851 -tests) and a device check on both backends (frames shown, Plasma, Chrome page + scroll input, -`kscreenlocker_greet --testing`). - -## Findings - -- **The common shape before the fixes: nothing was saturated.** GPU 7-40% busy, client and server - threads each ~30-50% busy, both waiting for each other with a wake-up per handoff. Removing - futile wake-ups (`d627fca3`) was worth more than any per-draw CPU saving. -- **Espryt after the fixes:** the remaining windowed gaps are ideas and terrain. Its present reply - is still a synchronous round trip per frame, and the server's per-draw state sync - (`DG::PrepareForDraw`, 28% of the apply thread in ideas before) is now the larger share. -- **Magma after the fixes:** CPU-bound on the server. Remaining per-draw costs in - `SetupWireDraw` (descriptor sets, `GetOrCreateProgram` / pipeline hash, `BuildWireVertexInput`, - vectors allocated per draw, scudo lock contention ~20% before), and per frame - `BlitDefaultFramebufferToSharedImage` (~30% of the apply thread: frame flush + a second submit - for the copy + `vkEndCommandBuffer`) plus `Present()` of the client's offscreen default surface - (a swapchain acquire + submit that nobody looks at) and GPU progress markers per submit. -- **Fullscreen:** every frame is rendered into the server's default framebuffer and then copied - into the window's shared image (Espryt `glBlitFramebuffer`, Magma `vkCmdCopyImage`); at 4 MP the - GPU is ~98% busy on texture at ~600 fps while stock does ~1430 and is even faster fullscreen than - windowed (it presumably skips composition). - -**Dead end: an adaptive client spin.** Growing the doorbell spin up to 1 ms towards the measured -reply latency (and shrinking it on long waits) gave +30-80% on light scenes (texture, jellyfish, -shadow) on Magma but cost refract -35% (370 -> 236) and fullscreen terrain -35% (90 -> 58), -reproducibly; the present reply simply got slower while the client spun. Polling the shared line -less often (backoff up to 64 iterations) did not change that, so it is not cache-line ping-pong. A -static `MOBILEGL_IPC_SPIN_US=1000` on the client showed the same mixed picture on Espryt. Not -landed; the targeted wake-up removed most of what the spin bought without the regressions. - -**Traps:** -- **Pin the clocks.** Unpinned, the stock stack's light scenes ran at GPU 310 MHz / big cores 672 - MHz and scored 425 instead of ~1100. -- **glFinish and `--off-screen`.** Before `66b47a10` off-screen MobileGL numbers were meaningless. -- **The stock desktop turns black mid-run** (a pure-black 21707-byte screenshot) while - SurfaceFlinger keeps latching ~125 buffers/s, and its score then jumps to ~1420-1500. Probe the - screen every ~15 s during stock runs and discard runs with a black probe; restart the stock - container + app (`stfix.sh`) to get the picture back. A powerdevil inhibit did not prevent it. -- **The MobileGL app's extra-keys bar** shrinks its desktop to ~2560x1410; set - `extra_keys_mode=with_keyboard` for fullscreen comparisons (it was restored afterwards). -- **The MobileGL session restores a System Settings window** at login; close it before measuring. -- **Rotation:** the stock app follows auto-rotate; check glmark2's "Surface Size" line. -- **Symbolizing:** the APK's server lib is stripped; a RelWithDebInfo build of the same tree was at - +0x80 for every function (check with `llvm-nm -D` on both). Container clients: simpleperf prints - offsets from the start of the executable mapping (add the r-x segment's page-aligned vaddr, - 0x4fb000 for the lib of 2026-10-04). Off-CPU (`sched_switch`) samples of container processes - get their user frames attributed to Android's libs, so use the client's own `P65LinkMetrics` for - its waits. -- `pkill -f