diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 60b790e7..b9bbd91f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1341,6 +1341,45 @@ jobs: fi echo "integration-split under strict is GREEN, two-sided, with the arming control present" + # ---- P5e (gl), CONTRACT-P5E §7: MAGMA'S OWN LANE, EXPECTED RED ----------------------- + # + # The two DirectVulkan.Split.NamedBlit entries abort on GetFramebufferBindingSlot@Clear + # (VulkanRenderer.cpp:7648). That field retires in P5e ON ESPRYT and in P7 ON MAGMA, and + # FieldOwnership.def carries ONE retiring-phase string for both - so admitting the pair to + # keep them in the Espryt lane would forgive an Espryt Clear reading the frontend's binding + # slot again, which is exactly the regression fb's handle arm exists to prevent. Splitting + # the lane costs two entries; admitting the row would cost the gate. + # + # THE LABEL IS `integration-magma-split` AND THE SPELLING MATTERS: `ctest -L` is a REGEX, so + # a label named `integration-split-magma` is still matched by `-L integration-split` and the + # entries would never have left. Measured before the rename. + # + # IT IS ASSERTED RED, WITH ITS MARKER. "Magma is red" must not be allowed to decay into + # "Magma did not run": the step fails both when the run goes green (P7 landed early, or the + # entries stopped drawing) and when it goes red without the named abort in a private log. + - name: Integration-magma-split under strict - expected red until P7 (CONTRACT-P5E section 7) + working-directory: build-split + env: + MOBILEGL_ITEST_REQUIRE_GPU: "1" + MOBILEGL_IPC_STRICT_ERRORS: "1" + MOBILEGL_TRANSPORT: "inproc" + run: | + ulimit -c unlimited + rc=0 + ctest -L integration-magma-split --no-tests=error -j 2 > "${RUNNER_TEMP}/strict-magma.txt" 2>&1 || rc=$? + tail -5 "${RUNNER_TEMP}/strict-magma.txt" + if [ "${rc}" -eq 0 ]; then + echo "::error::integration-magma-split went GREEN under strict. Magma is in lockstep for the whole of P5e (ID-90) and GetFramebufferBindingSlot retires there in P7, so these entries are expected to abort. If P7 has landed, delete this step and fold the entries back into integration-split." + exit 1 + fi + marker='Fatal{UnmigratedPipeInput, "GetFramebufferBindingSlot@Clear"}' + if ! grep -rqF "${marker}" MobileGL/MG_IntegrationTest/p5b-DirectVulkan-*.log 2>/dev/null; then + echo "::error::integration-magma-split is red but no private log carries ${marker} - the lane failed for some OTHER reason, which is a defect rather than the expected-red control" + grep -rhoE '(Fatal|Admitted)\{[A-Za-z]*, "[^"]*"\}' MobileGL/MG_IntegrationTest/p5b-DirectVulkan-*.log 2>/dev/null | sort | uniq -c | sort -rn | head + exit 1 + fi + echo "integration-magma-split is red by design on ${marker}" + - name: Upload strict lane logs if: always() uses: actions/upload-artifact@v7 diff --git a/MobileGL/MG_IntegrationTest/CMakeLists.txt b/MobileGL/MG_IntegrationTest/CMakeLists.txt index 58cfbb1b..1431dea1 100644 --- a/MobileGL/MG_IntegrationTest/CMakeLists.txt +++ b/MobileGL/MG_IntegrationTest/CMakeLists.txt @@ -2257,19 +2257,45 @@ if (MOBILEGL_BUILD_DISAGGREGATED) endif() # P5b measured named-blit blockers, exercising both backend bound-form lowerings. +# +# P5e (gl), CONTRACT-P5E §7: THE TWO BACKENDS GET DIFFERENT LABELS, because under strict they are +# answering different questions. +# +# Both DirectVulkan entries abort on GetFramebufferBindingSlot@Clear (VulkanRenderer.cpp:7648). +# That field's row retires in P5e ON ESPRYT and in P7 ON MAGMA, and FieldOwnership.def carries ONE +# retiring-phase string for both - so the derived allowlist cannot admit the pair without admitting +# it for Espryt too, where it would forgive exactly the regression fb's handle arm exists to +# prevent (an Espryt Clear reading the frontend's binding slot again would become a warning line). +# The alternative to a label is therefore not "admit one row"; it is "stop the Espryt lane from +# being able to see that row at all", which is a real loss of gate strength. +# +# So the lane is SPLIT rather than the allowlist WIDENED: `integration-split` stays a statement +# about Espryt and goes hard green, and the Magma entries get the expected-red step the contract +# already promises them for the backend it keeps in lockstep all phase (ID-90). if (MOBILEGL_BUILD_DISAGGREGATED) foreach(namedBlitBackend DirectGLES DirectVulkan) mgl_itest_join_environment(MGL_ITEST_NAMED_BLIT_ENVIRONMENT "MOBILEGL_BACKEND_TYPE=${namedBlitBackend}" "MOBILEGL_TRANSPORT=inproc" "MOBILEGL_ITEST_REQUIRE_GPU=1" "MGITEST_SPLIT_LANE=1" ${MGL_ITEST_CAPABILITY_ENV} ${MGL_ITEST_COMMON_ENV}) + # THE LABEL IS `integration-magma-split` AND NOT `integration-split-magma`, and that is not + # a preference: `ctest -L` takes a REGEX, not an exact name, so `-L integration-split` + # MATCHES a label spelled `integration-split-magma` as a substring. The obvious name would + # have left both entries in the Espryt lane while every listing showed them relabelled - a + # split that looks done and is not. Measured: with that spelling + # `ctest -N -L integration-split` still listed both DirectVulkan entries. + if (namedBlitBackend STREQUAL "DirectVulkan") + set(MGL_ITEST_NAMED_BLIT_LABELS "integration-magma-split") + else() + set(MGL_ITEST_NAMED_BLIT_LABELS "integration-split") + endif() foreach(namedBlitCase NamedBlitPreservesBindingsAndRestoresNextVerbsPixels NamedBlitDefaultEndpointPixels) gtest_discover_tests(MobileGLIntegrationTest TEST_PREFIX "${namedBlitBackend}.Split.NamedBlit." TEST_FILTER "F1WireScenario.${namedBlitCase}" DISCOVERY_TIMEOUT 30 PROPERTIES - LABELS "integration-split" + LABELS "${MGL_ITEST_NAMED_BLIT_LABELS}" TIMEOUT ${MGL_ITEST_TIMEOUT} ENVIRONMENT "${MGL_ITEST_NAMED_BLIT_ENVIRONMENT}\;MOBILEGL_LOG_FILE_PATH=${CMAKE_CURRENT_BINARY_DIR}/p5b-${namedBlitBackend}-${namedBlitCase}.log") endforeach() diff --git a/MobileGL/MG_Remote/CONTRACT-P5E.md b/MobileGL/MG_Remote/CONTRACT-P5E.md index 925c8d65..635f833e 100644 --- a/MobileGL/MG_Remote/CONTRACT-P5E.md +++ b/MobileGL/MG_Remote/CONTRACT-P5E.md @@ -518,6 +518,12 @@ and asserts `vbs > 0` — the server stamped a verb boundary. Everything strict of that stamp and the monolith arm never stamps, so without it "the lane is green" and "strict was never armed" are the same observation. +**Magma keeps the expected-red step, in a lane of its own.** The two `DirectVulkan.Split.NamedBlit` +entries carry `integration-magma-split` (so spelled: `ctest -L` is a regex and +`-L integration-split` matches `integration-split-magma`) and are asserted RED on +`Fatal{UnmigratedPipeInput, "GetFramebufferBindingSlot@Clear"}`. Admitting that pair instead would +forgive the same read on Espryt, where it is this phase's debt — one retiring-phase string serves +both backends. ---