From c1e985c893f35cda995b1f2b51e291258be2955b Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Tue, 6 Oct 2026 15:45:14 -0400 Subject: [PATCH] [CI] (P13 W5): the verify lane's omitted-fill-point control withholds the pack state at ReadPixels, and the data arm is logged at bring-up. --- .github/workflows/test.yml | 18 ++++++++++-------- MobileGL/ConfigLoader.cpp | 6 +++++- docs/ci/ci-cleanup-log.md | 2 +- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 92034645..a069e35b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -906,17 +906,19 @@ jobs: # NEGATIVE CONTROL B (gate G5). The omission skips the STAMP of one field for one verb while # still copying its value - indistinguishable from a fill row nobody wrote - so the poison - # must abort the glGenerateMipmap. Again: this step passes when ctest fails. + # must abort that verb. Again: this step passes when ctest fails. # # The entry it targets is PoisonOmissionScenario.WithoutOmissionCompletes, which is green in - # the ambient lane above and is the ONLY integration entry in the tree that calls - # glGenerateMipmap at all. It deliberately does not skip itself when the knob is set, exactly - # so that this control has something to turn red. + # the ambient lane above and deliberately does not skip itself when the knob is set, exactly + # so that this control has something to turn red. P13 W5: the pair is the pack state at + # ReadPixels (the split step's pair below). Monolith now runs the record arm, whose + # generate_mipmap resolves its texture by the verb's handle and never reads the active unit, + # so GenerateMipmap:GetActiveTextureUnit left this lane green (Test 37515697754). - name: Negative control B (omitted fill point) working-directory: build-verify env: MOBILEGL_ITEST_REQUIRE_GPU: "1" - MOBILEGL_PIPE_POISON_OMIT: GenerateMipmap:GetActiveTextureUnit + MOBILEGL_PIPE_POISON_OMIT: ReadPixels:GetPixelStoreParameters run: | FILTER='DirectGLES\.Verify\.PoisonOmissionScenario\.WithoutOmissionCompletes' matched=$(ctest -N -L integration-verify -R "${FILTER}" | grep -cE '^ *Test *#[0-9]+:') @@ -925,7 +927,7 @@ jobs: exit 1 fi if ctest --output-on-failure -L integration-verify -R "${FILTER}" --no-tests=error; then - echo "::error::MOBILEGL_PIPE_POISON_OMIT=GenerateMipmap:GetActiveTextureUnit left the verify lane GREEN. The per-verb poison is not armed, so a forgotten fill row would ship silently." + echo "::error::MOBILEGL_PIPE_POISON_OMIT=ReadPixels:GetPixelStoreParameters left the verify lane GREEN. The per-verb poison is not armed, so a forgotten fill row would ship silently." exit 1 fi echo "the omitted fill point turned the lane red, as it must" @@ -1147,8 +1149,8 @@ jobs: done echo "both backends reported GetPixelStoreParameters@ReadPixels where=read at least twice in the SERVER half, as they must" - # NEGATIVE CONTROL B ON THE SPLIT ARM, WITH THE SPLIT ARM'S PAIR. The monolith pair - # (GenerateMipmap:GetActiveTextureUnit) is inert here - the split backend's generate_mipmap + # NEGATIVE CONTROL B ON THE SPLIT ARM, WITH THE SAME PAIR. GenerateMipmap:GetActiveTextureUnit + # (the pre-P13 monolith pair) is inert here - the split backend's generate_mipmap # resolves its texture by the verb's handle and never reads the active unit - so this step # withholds ReadPixels:GetPixelStoreParameters, which the server reads under its own stamp. # Measured at landing: 2 of 2 red, each child dying with diff --git a/MobileGL/ConfigLoader.cpp b/MobileGL/ConfigLoader.cpp index bea1af33..2636788d 100644 --- a/MobileGL/ConfigLoader.cpp +++ b/MobileGL/ConfigLoader.cpp @@ -690,7 +690,11 @@ namespace MobileGL::MG_ConfigLoader { const Bool backendReady = MG_Config::ActiveBackendType == BackendType::DirectGLES || MG_Config::ActiveBackendType == BackendType::DirectVulkan; MG_Config::MonolithTakesRecordArm = backendReady; - if (lowered.empty() || lowered == "record") return; + if (lowered.empty() || lowered == "record") { + // The one line a device log can be asked for to show which arm a monolith runs. + MGLOG_I("Config: monolith data arm = %s", backendReady ? "record" : "frontend (backend has no record arm)"); + return; + } if (lowered == "frontend") { if (MG_Config::Transport != MG_Config::TransportMode::Monolith) { MGLOG_W("Config: MOBILEGL_PIPE_DATA_ARM=frontend is ignored under a transport - the " diff --git a/docs/ci/ci-cleanup-log.md b/docs/ci/ci-cleanup-log.md index 1e6d611e..ce2f5b72 100644 --- a/docs/ci/ci-cleanup-log.md +++ b/docs/ci/ci-cleanup-log.md @@ -81,7 +81,7 @@ them wrong. | Date | What was red | Cause | Fix | |---|---|---|---| -| 2026-10-06 | `Direct{GLES,Vulkan}.PoisonOmitted.PoisonOmissionScenario.OmittedFieldAbortsOnThatVerb` (verify tree, local; P13 W5 S7) | monolith now runs the record arm, which resolves GenerateMipmap's texture from the verb's handle and never reads the omitted `GetActiveTextureUnit` - the control could not go red | the monolith lanes omit `ReadPixels:GetPixelStoreParameters` (the pair the split lane already uses), which the record arm still reads; verified red-for-its-reason on both backends | +| 2026-10-06 | `Direct{GLES,Vulkan}.PoisonOmitted.PoisonOmissionScenario.OmittedFieldAbortsOnThatVerb` (verify tree, local; P13 W5 S7) | monolith now runs the record arm, which resolves GenerateMipmap's texture from the verb's handle and never reads the omitted `GetActiveTextureUnit` - the control could not go red | the monolith lanes omit `ReadPixels:GetPixelStoreParameters` (the pair the split lane already uses), which the record arm still reads; verified red-for-its-reason on both backends. Same change in test.yml's `integration-verify` "Negative control B (omitted fill point)" step, which went green with the old pair on Test 37515697754 | | 2026-10-06 | `integration-verify`, 184 aborts `Fatal{PipeVerifyDiffer, "GetPixelStoreParameters@ReadPixels"}` (verify tree, local; P13 W5 S7) | the verify read hook took the live context as the pack oracle inside the monolith verb port's neutral-pack readback window (it already used the applied pack for server-stamped verbs) | `MG_Record::MonolithPortApplyingForVerify()`; the hook uses the applied pack payload in that window too | | 2026-10-06 | `ResourceEmit.TheLiveHostWritesWireFiresOnTheCallAPersistentMapProducerWouldSetItOn` (verify unit, local; P13 W5 S7) | the always-false `HasLiveHostWrites` pin is lifted wherever the record arm is built (it gives the bit a producer), and every library builds it now | the case skips under `MOBILEGL_BUILD_RECORD_ARM` with the existing reason; `PinLiveHostWritesNamesABuffer` remains the successor | | 2026-10-06 | every `ctest` invocation in integration / verify / split jobs exited 8 after the tests passed (`integration-verify`, `integration-split*`, `integration (inproc)`, `spawn_lane_parity.py`) | `PipeCatalogueSourceRoot.cmake` (a CTest include file) used `if(... IN_LIST ...)`; CTest scripts run without policy CMP0057 on the pinned CMake 3.31.10, so the include errored | use `list(FIND)` instead (`MobileGL/MG_Test/Pipe/CMakeLists.txt`) |