From dd899510626e42e87a91ee38094e7e751abb28d7 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Fri, 18 Sep 2026 11:55:01 -0400 Subject: [PATCH] [MG_Test] (Disaggregated): P5e pa - the strict lane gets four entries of its own - MOBILEGL_IPC_STRICT_ERRORS=1 had no registered ctest entry anywhere: the phase's gate driver sets the knob by hand and pg's declared red-once for GetProgramForDraw never landed, so the two rows pa retires could come back and every gate would stay green. ID-109's finding, one scale down: the gap is a missing gated entry, not a missing case. - DirectGLES.Split.StrictProgramArm. registers the only two scenarios that are strict-CLEAN after pa - one per half. MultiDrawScenario.BaseVertexDrawsReject- MalformedArguments prepares a draw and asserts on GL errors rather than pixels; AtomicCounterScenario's three cases are the dispatch half. Everything else in the lane still ends in a readback, whose GetFramebufferBindingSlot@ReadPixels is an allowlisted row only P7 retires. - integration-split alone, and the prefix says which arm: the monolith arm of these scenarios is registered under DirectGLES. already and the knob is a no-op there, so labelling them integration-gpu would add entries that cannot fail for the reason they exist (R-16). - Negative control run: with the arm reverted all four abort, two with GetProgramForDraw@DrawArrays and two with GetProgramForDispatch@DispatchCompute. - Each entry takes a private log path through SplitLogPaths, for vi's reason: an entry that exists to carry a marker cannot share the file the marker is in. --- MobileGL/MG_IntegrationTest/CMakeLists.txt | 53 +++++++++++++++++++ .../Harness/SplitLogPaths.cmake.in | 5 +- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/MobileGL/MG_IntegrationTest/CMakeLists.txt b/MobileGL/MG_IntegrationTest/CMakeLists.txt index f72d467a..67d5ee9c 100644 --- a/MobileGL/MG_IntegrationTest/CMakeLists.txt +++ b/MobileGL/MG_IntegrationTest/CMakeLists.txt @@ -2203,6 +2203,59 @@ if (MOBILEGL_BUILD_DISAGGREGATED) ENVIRONMENT "${MGL_ITEST_GLES_SPLIT_SMALL_RING_ENVIRONMENT}" ) endforeach() + + # ---- P5e package pa: THE STRICT LANE GETS ENTRIES OF ITS OWN ------------------------------ + # + # pa retired the two per-draw program rows - Fatal{UnmigratedPipeInput, + # "GetProgramForDraw@DrawArrays"} and "...GetProgramForDispatch@DispatchCompute", 69 of the + # 109 entries the strict lane was red on. NOTHING GATED THEM. MOBILEGL_IPC_STRICT_ERRORS=1 is + # a knob the phase's gate driver sets by hand, no REGISTERED entry exports it, and package + # pg's declared red-once for this exact marker never landed - so the row could come back and + # every gate would stay green. That is ID-109's finding in miniature: the gap was never a + # missing test case, it was a missing gated ENTRY for a whole reading. + # + # WHICH SCENARIOS MAY JOIN is decided by the knob itself: under it every BARRIER-PULLED read + # is Fatal, and most split scenarios end in a readback, whose GetFramebufferBindingSlot@ReadPixels + # is an allowlisted row that only P7 retires. So a scenario is eligible exactly when it + # reaches PrepareForDraw / PrepareForCompute and then does NOT read pixels back. Two do, one + # per half of pa, and both were red with pa's own marker before it landed: + # * MultiDrawScenario.BaseVertexDrawsRejectMalformedArguments - the DRAW half; it prepares a + # draw and then asserts on GL errors rather than on pixels. + # * AtomicCounterScenario.* - the DISPATCH half, and all three cases were + # GetProgramForDispatch@DispatchCompute entries. + # + # LABELS IS integration-split ALONE, deliberately, and it is not the hole ID-109 names. That + # hole was a runtime ARM with no entry anywhere; here the monolith arm of these same scenarios + # is registered under DirectGLES. already and this knob is a no-op on it - a monolith client + # fills and stamps all 63 fields at every verb, so no read is unfresh and nothing can trip. + # An entry that cannot fail for the reason it exists is worse than none (R-16), so this lane + # names the arm it is for in its own prefix. The F1. lane sets the same precedent. + mgl_itest_join_environment(MGL_ITEST_GLES_SPLIT_STRICT_ENVIRONMENT + "MOBILEGL_BACKEND_TYPE=DirectGLES" "MOBILEGL_TRANSPORT=inproc" + "MOBILEGL_IPC_SERVER_PATH=${MGL_ITEST_SPLIT_SERVER_PATH}" "MGITEST_SPLIT_LANE=1" + "MOBILEGL_IPC_STRICT_ERRORS=1" + ${MGL_ITEST_CAPABILITY_ENV} ${MGL_ITEST_COMMON_ENV}) + + gtest_discover_tests(MobileGLIntegrationTest + TEST_PREFIX "DirectGLES.Split.StrictProgramArm." + TEST_LIST MGL_SPLIT_PA_STRICT_DRAW_TESTS + TEST_FILTER "MultiDrawScenario.BaseVertexDrawsRejectMalformedArguments" + DISCOVERY_TIMEOUT 30 + PROPERTIES + LABELS "integration-split" + TIMEOUT ${MGL_ITEST_TIMEOUT} + ENVIRONMENT "${MGL_ITEST_GLES_SPLIT_STRICT_ENVIRONMENT}" + ) + gtest_discover_tests(MobileGLIntegrationTest + TEST_PREFIX "DirectGLES.Split.StrictProgramArm." + TEST_LIST MGL_SPLIT_PA_STRICT_DISPATCH_TESTS + TEST_FILTER "AtomicCounterScenario.*" + DISCOVERY_TIMEOUT 30 + PROPERTIES + LABELS "integration-split" + TIMEOUT ${MGL_ITEST_TIMEOUT} + ENVIRONMENT "${MGL_ITEST_GLES_SPLIT_STRICT_ENVIRONMENT}" + ) # Apply per-entry paths after GoogleTest discovery has populated the TEST_LISTs. configure_file(Harness/SplitLogPaths.cmake.in SplitLogPaths.cmake @ONLY) set_property(DIRECTORY APPEND PROPERTY TEST_INCLUDE_FILES diff --git a/MobileGL/MG_IntegrationTest/Harness/SplitLogPaths.cmake.in b/MobileGL/MG_IntegrationTest/Harness/SplitLogPaths.cmake.in index 3bc1c1f6..af223975 100644 --- a/MobileGL/MG_IntegrationTest/Harness/SplitLogPaths.cmake.in +++ b/MobileGL/MG_IntegrationTest/Harness/SplitLogPaths.cmake.in @@ -6,9 +6,12 @@ file(MAKE_DIRECTORY "@CMAKE_CURRENT_BINARY_DIR@/split-logs") # P5e vi's client-array lane joins the same list for the same reason: its two entries are the # only ones that can reach Fatal{UnmigratedVerb, "DrawArrays+CLIENT_ARRAYS"} once ra publishes # the caps bit, and a shared log file is a marker nobody can attribute. +# P5e pa's strict lane joins it for the same reason as vi's: its four entries exist to CARRY a +# Fatal marker (the two program rows), and a shared log file is a marker nobody can attribute. foreach(entry IN LISTS MGL_SPLIT_CLEAR_TESTS MGL_SPLIT_TRIANGLE_TESTS MGL_SPLIT_PMAP_TESTS MGL_SPLIT_T2_TESS_TESTS MGL_SPLIT_T2_XFB_TESTS MGL_SPLIT_SYNC_TESTS - MGL_SPLIT_VI_CLIENT_ARRAY_TESTS) + MGL_SPLIT_VI_CLIENT_ARRAY_TESTS + MGL_SPLIT_PA_STRICT_DRAW_TESTS MGL_SPLIT_PA_STRICT_DISPATCH_TESTS) set_tests_properties("${entry}" PROPERTIES ENVIRONMENT "MOBILEGL_LOG_FILE_PATH=@CMAKE_CURRENT_BINARY_DIR@/split-logs/${entry}.log") endforeach()