From b0c6af3168a898bda99b95300d23ea3367ad613e Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Tue, 22 Sep 2026 20:09:24 -0400 Subject: [PATCH] [MG_IntegrationTest, tools] (P7): the stale-serial red-once is registered on split and spawn only, and the parity gate names it with the other server-side knobs MGITEST_MAGMA_FORCE_STALE_BUFFER_SERIAL is read by the server. The tcp arm's server is the lane fixture (scripts/ci/tcp_server_fixture.py), started once from its own environment, so an entry-level ENVIRONMENT never reaches it: DirectVulkan.Tcp.StaleSerial.* ran the unforced case under a name that claimed the knob and could never red (review ID-P7-34, item 1). The entry is now registered only when the arm is Split or Spawn, and spawn_lane_parity.py grows a second named asymmetry beside MAGMA_INPROC_ONLY: MAGMA_NOT_OVER_TCP, key prefixes the reference arm has and the tcp arm does not by name. It comes off the reference for the tcp arm alone, so the same entry missing from spawn is still an error. B2 adds its own knob entries to the same tuple in its tree. integration-magma-tcp 71 -> 70 entries (68 cases + the two fixture entries); split 90, spawn 69 unchanged. spawn_lane_parity.py build-split rc 0; tcp_lane_tools_test.py 6/6. Integrator merge onto pipe: B2's round-1 mechanism (`mglItestServerEnvKnobArm` in CMake, `compare_arms(no_tcp=)` in the parity script) already covers this shape, so `.StaleSerial.` joins MAGMA_SERVER_ENV_KNOB_NO_TCP instead of the separate MAGMA_NOT_OVER_TCP the package tree introduced. --- MobileGL/MG_IntegrationTest/CMakeLists.txt | 24 +++++++++++++++------- scripts/ci/spawn_lane_parity.py | 7 ++++++- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/MobileGL/MG_IntegrationTest/CMakeLists.txt b/MobileGL/MG_IntegrationTest/CMakeLists.txt index 859a10e2..54c37301 100644 --- a/MobileGL/MG_IntegrationTest/CMakeLists.txt +++ b/MobileGL/MG_IntegrationTest/CMakeLists.txt @@ -3125,13 +3125,23 @@ if (MOBILEGL_BUILD_DISAGGREGATED) PROPERTIES LABELS "${mglItestMagmaLabels}" TIMEOUT ${MGL_ITEST_TIMEOUT} ${mglItestArmProperties} ENVIRONMENT "${mglItestMagmaWireEnvironment}\;MOBILEGL_LOG_FILE_PATH=${CMAKE_CURRENT_BINARY_DIR}/p7-streamedsubdata${mglItestArmLogTag}.log") - gtest_discover_tests(MobileGLIntegrationTest - TEST_PREFIX "DirectVulkan.${mglItestArm}.StaleSerial." - TEST_FILTER "F1WireScenario.StreamedBufferSubDataBeforeEachDrawIsOrdered" - DISCOVERY_TIMEOUT 30 - PROPERTIES LABELS "${mglItestMagmaLabels}" TIMEOUT ${MGL_ITEST_TIMEOUT} - ${mglItestArmProperties} - ENVIRONMENT "${mglItestMagmaWireEnvironment}\;MGITEST_MAGMA_FORCE_STALE_BUFFER_SERIAL=1\;MOBILEGL_LOG_FILE_PATH=${CMAKE_CURRENT_BINARY_DIR}/p7-streamedsubdata-stale${mglItestArmLogTag}.log") + # SPLIT AND SPAWN ONLY - a parity exception, named in scripts/ci/spawn_lane_parity.py + # (MAGMA_SERVER_ENV_KNOB_NO_TCP, the same list as the B2 knobs above), not an omission. + # The knob is read by the SERVER, and the tcp arm's server is the lane fixture + # (scripts/ci/tcp_server_fixture.py) started once from its own environment: an + # entry-level ENVIRONMENT never reaches it, so a Tcp.StaleSerial. entry would run the + # plain Fm case under a name that claims the knob, and could never red. The inproc arm + # hosts the server in the test process and the spawn arm's server inherits the client's + # environment, so on those two the knob is real. + if(mglItestServerEnvKnobArm) + gtest_discover_tests(MobileGLIntegrationTest + TEST_PREFIX "DirectVulkan.${mglItestArm}.StaleSerial." + TEST_FILTER "F1WireScenario.StreamedBufferSubDataBeforeEachDrawIsOrdered" + DISCOVERY_TIMEOUT 30 + PROPERTIES LABELS "${mglItestMagmaLabels}" TIMEOUT ${MGL_ITEST_TIMEOUT} + ${mglItestArmProperties} + ENVIRONMENT "${mglItestMagmaWireEnvironment}\;MGITEST_MAGMA_FORCE_STALE_BUFFER_SERIAL=1\;MOBILEGL_LOG_FILE_PATH=${CMAKE_CURRENT_BINARY_DIR}/p7-streamedsubdata-stale${mglItestArmLogTag}.log") + endif() # `default-color-blit-shape@P7`'s retirement. TWO ENTRIES OVER ONE CASE, and the second # is the only way its arm is reachable here: every surface this lane creates reports # VK_SURFACE_TRANSFORM_IDENTITY, so the scratch path that exists FOR rotation would diff --git a/scripts/ci/spawn_lane_parity.py b/scripts/ci/spawn_lane_parity.py index 2e48d630..a6243c8e 100644 --- a/scripts/ci/spawn_lane_parity.py +++ b/scripts/ci/spawn_lane_parity.py @@ -72,8 +72,12 @@ MAGMA_INPROC_ONLY = ("MagmaRunAheadScenario.", "MagmaWireCacheScenario.") # These are TAILS, not scenarios - the normaliser above keeps the sub-lane tail for the Magma # tier on purpose, so `.MsResolve1.` names the knob entry and `.MsResolve0.` (the default, which # does keep its tcp entry) is untouched. +# +# P7 wave 2-B3 (ID-P7-34) adds `.StaleSerial.`: MGITEST_MAGMA_FORCE_STALE_BUFFER_SERIAL is read by +# the server too (VkBufferManager.cpp), so the streamed subdata-then-draw red-once has the same +# two arms and the same tcp absence. One list, one mechanism, for every server-side knob. MAGMA_SERVER_ENV_KNOB_NO_TCP = (".ShaderMip1.", ".ShaderMip2.", ".DepthMip.", - ".DefaultBlitShape1.", ".MsResolve1.") + ".DefaultBlitShape1.", ".MsResolve1.", ".StaleSerial.") def lane_names(build_dir, label): @@ -103,6 +107,7 @@ def compare_arms(build_dir, tier, labels, inproc_only=(), no_tcp=()): it on spawn, which is where it does most of its work. Returns True on failure, the way main() below counts them.""" + not_on_arm = not_on_arm or {} sets = {} for arm, label in labels.items(): names = lane_names(build_dir, label) - FIXTURE_ENTRIES