From 82a8fb816efd2ad740b6b4be299cc4a64eb50c64 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Sat, 17 Oct 2026 23:16:00 -0400 Subject: [PATCH] [Test] (MG_IntegrationTest/Harness, MG_IntegrationTest/Scenarios, MG_Test/Wire, scripts/data): add in-test controls for the map push and the wait probe - PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer - RemoteWaitBoundaryControl.AnUnwaitedPublishIsSeenAsNoWait --- .../Harness/PersistentMapPeek.cpp | 24 ++++++++++ .../Harness/PersistentMapPeek.h | 9 ++++ .../Harness/SplitLogPaths.cmake.in | 5 +++ .../PersistentCoherentMapScenario.cpp | 44 +++++++++++++++++++ .../MG_Test/Wire/RemoteClientE1Controls.inc | 34 ++++++++++++-- scripts/data/skip_census_baseline.json | 33 ++++++++++++++ 6 files changed, 145 insertions(+), 4 deletions(-) diff --git a/MobileGL/MG_IntegrationTest/Harness/PersistentMapPeek.cpp b/MobileGL/MG_IntegrationTest/Harness/PersistentMapPeek.cpp index 54ce9b77..b7236eae 100644 --- a/MobileGL/MG_IntegrationTest/Harness/PersistentMapPeek.cpp +++ b/MobileGL/MG_IntegrationTest/Harness/PersistentMapPeek.cpp @@ -103,4 +103,28 @@ namespace MGITest { #endif } + bool ForgetLivePersistentMap(unsigned int bufferName) { +#if defined(MGITEST_PERSISTENT_MAP_TRACKER_LIVE) + MobileGL::MG_State::GLState::BufferObject* buffer = FrontendBuffer(bufferName); + if (buffer == nullptr) return false; + MobileGL::MG_Record::PersistentMapTracker::Instance().Forget(*buffer); + return true; +#else + (void)bufferName; + return false; +#endif + } + + bool ReannounceLivePersistentMap(unsigned int bufferName) { +#if defined(MGITEST_PERSISTENT_MAP_TRACKER_LIVE) + MobileGL::MG_State::GLState::BufferObject* buffer = FrontendBuffer(bufferName); + if (buffer == nullptr) return false; + buffer->NotePersistentMapStateChanged(); + return true; +#else + (void)bufferName; + return false; +#endif + } + } // namespace MGITest diff --git a/MobileGL/MG_IntegrationTest/Harness/PersistentMapPeek.h b/MobileGL/MG_IntegrationTest/Harness/PersistentMapPeek.h index 117cea86..bd5cc7d2 100644 --- a/MobileGL/MG_IntegrationTest/Harness/PersistentMapPeek.h +++ b/MobileGL/MG_IntegrationTest/Harness/PersistentMapPeek.h @@ -58,6 +58,15 @@ namespace MGITest { // Same contract as above: false means "could not look". bool PeekBufferIsLivePersistentMap(unsigned int bufferName, bool* outLive); + // The two production calls that take a buffer out of the tracker's set and put it back: + // PersistentMapTracker::Forget, which an unmap or a destroy reaches, and + // BufferObject::NotePersistentMapStateChanged, which every map-state change makes. They let + // a scenario show the push is the only route a coherent write takes to the server. + // + // Same contract: false means "could not reach the tracker", and nothing was changed. + bool ForgetLivePersistentMap(unsigned int bufferName); + bool ReannounceLivePersistentMap(unsigned int bufferName); + // Separate-process clients own these counters; the remote Present window // belongs to the server and cannot report client map acquisitions or bytes. bool PeekSeparateClientMapStats(unsigned long long* acquisitions, unsigned long long* pushedBytes); diff --git a/MobileGL/MG_IntegrationTest/Harness/SplitLogPaths.cmake.in b/MobileGL/MG_IntegrationTest/Harness/SplitLogPaths.cmake.in index 2d61c1ec..84187fde 100644 --- a/MobileGL/MG_IntegrationTest/Harness/SplitLogPaths.cmake.in +++ b/MobileGL/MG_IntegrationTest/Harness/SplitLogPaths.cmake.in @@ -25,6 +25,9 @@ foreach(listName IN ITEMS @MGL_SPLIT_ARM_TEST_LISTS@) elseif(entry MATCHES "PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares$") set_tests_properties("${entry}" PROPERTIES ENVIRONMENT "MGITEST_PMAP_LANE=1;MGITEST_PERSISTENT_MAP_ARM=emulated;MOBILEGL_PIPE_STATS=1;MOBILEGL_PIPE_STATS_PERIOD=1") + elseif(entry MATCHES "PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer$") + # The case takes the push away, which only the emulated arm has (R-6: every split arm). + set_tests_properties("${entry}" PROPERTIES ENVIRONMENT "MGITEST_PERSISTENT_MAP_ARM=emulated") elseif(entry MATCHES "LargeArenaAdoptionScenario.TheArenaLandsInTheTierItsLaneDeclares$") # P11 A2: every split arm runs T2, so the arena is declared emulated. set_tests_properties("${entry}" PROPERTIES ENVIRONMENT "MGITEST_PERSISTENT_MAP_ARM=emulated") @@ -89,6 +92,8 @@ foreach(scenario @MGL_SPLIT_SMALL_RING_SCENARIOS@) elseif(entry MATCHES "PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares$") set_tests_properties("${entry}" PROPERTIES ENVIRONMENT "MGITEST_PMAP_LANE=1;MGITEST_PERSISTENT_MAP_ARM=emulated;MOBILEGL_PIPE_STATS=1;MOBILEGL_PIPE_STATS_PERIOD=1") + elseif(entry MATCHES "PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer$") + set_tests_properties("${entry}" PROPERTIES ENVIRONMENT "MGITEST_PERSISTENT_MAP_ARM=emulated") endif() endforeach() endforeach() diff --git a/MobileGL/MG_IntegrationTest/Scenarios/PersistentCoherentMapScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/PersistentCoherentMapScenario.cpp index cff262c9..a77eb738 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/PersistentCoherentMapScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/PersistentCoherentMapScenario.cpp @@ -445,6 +445,50 @@ void main() { oColor = vec4(vColor, 1.0); } Gl().EndFrame(); } + // E3(a): the push is the ONLY route a coherent write takes to the server. The cases above go + // green just as well if something else delivered the bytes - an unmap or flush record, a + // whole-buffer re-sync, the live-host-writes state record, an inproc server reading client + // memory - so this one takes the push away and requires the next draw to miss the write. + // Forget is what an unmap or a destroy calls and leaves the mapping itself alone; the + // re-announce is the call every map-state change makes, and the next draw must see the write. + TEST_F(PersistentCoherentMapScenario, ThePushIsTheOnlyRouteAWriteTakesToTheServer) { + if (!Ready() || IsSkipped()) return; + if (!SplitLane::IsSplitLane() || SplitLane::DeclaredPersistentMapArm() != "emulated") { + GTEST_SKIP() << "the push exists only on the emulated arm of a split transport, and this lane " + "declares no such arm (MGITEST_PERSISTENT_MAP_ARM=emulated, set per entry by " + "Harness/SplitLogPaths.cmake.in); monolith adopts the store and has no push"; + } + if (!PersistentMapTrackerAvailable()) { + GTEST_SKIP() << "Harness/PersistentMapPeek cannot reach the tracker in this build, so the push " + "cannot be taken away"; + } + ArmTheDrawState(); + + WriteThroughTheMapThenDraw(m_map, 0.0f, 1.0f, 0.0f); + const Image pushed = ReadPixels(Gl().Width(), Gl().Height()); + EXPECT_EQ(FirstGLError(), 0u); + ASSERT_TRUE(WholeSurfaceIs(pushed, "green", "the write the push carries, before it is taken away")); + + ASSERT_TRUE(ForgetLivePersistentMap(m_vbo)) << "no frontend BufferObject behind GL buffer " << m_vbo; + WriteThroughTheMapThenDraw(m_map, 1.0f, 0.0f, 0.0f); + const Image unpushed = ReadPixels(Gl().Width(), Gl().Height()); + EXPECT_EQ(FirstGLError(), 0u); + EXPECT_TRUE(WholeSurfaceIs(unpushed, "green", + "a write through a mapping the tracker has forgotten: red here means " + "something other than the persistent-map push delivered it, and the " + "two cases above would stay green without the push")); + + ASSERT_TRUE(ReannounceLivePersistentMap(m_vbo)) << "no frontend BufferObject behind GL buffer " << m_vbo; + glDrawArrays(GL_TRIANGLES, 0, 6); + const Image repushed = ReadPixels(Gl().Width(), Gl().Height()); + EXPECT_EQ(FirstGLError(), 0u); + EXPECT_TRUE(WholeSurfaceIs(repushed, "red", + "the same write after the map is announced again: the tracker must " + "push the whole mapping once, or the green above proves nothing")); + AssertOrRecordArm(m_vbo, "after the push was taken away and given back"); + Gl().EndFrame(); + } + // E3(c) and the black-box half of E3(d). ONE reading case, in a lane of its own, for the // reason PipeStatsWindow.h gives: the library truncates its log per process, so two readers // in one lane race under `ctest -j`. diff --git a/MobileGL/MG_Test/Wire/RemoteClientE1Controls.inc b/MobileGL/MG_Test/Wire/RemoteClientE1Controls.inc index 682bae30..607eace1 100644 --- a/MobileGL/MG_Test/Wire/RemoteClientE1Controls.inc +++ b/MobileGL/MG_Test/Wire/RemoteClientE1Controls.inc @@ -35,7 +35,13 @@ struct E1BoundaryPeer : Codec::WireVerbSink { } }; -void CheckE1Boundary(Bool serverCap, MGPWireOp op, Bool expectWait, const char* diagnostic) { +// How the probe's record leaves the client. Rule is EmitAndWait, whose wait rule the cases +// test. PublishOnly encodes through the session's own encoder and publishes with no wait at all, +// so a case can show the probe reads a missing wait as one. +enum class E1Emit { Rule, PublishOnly }; + +void CheckE1Boundary(Bool serverCap, MGPWireOp op, Bool expectWait, const char* diagnostic, + E1Emit emit = E1Emit::Rule) { const auto child = RunInChild([=] { ::alarm(15); const char* barrier = std::getenv("MOBILEGL_IPC_VERB_BARRIER"); @@ -59,10 +65,17 @@ void CheckE1Boundary(Bool serverCap, MGPWireOp op, Bool expectWait, const char* producer.*PeerMember(ProducerBellTag{}) = &bell; const MGPApplierReset reset{}; const MGPClear clear{}; + const void* payload = op == MGPWireOp::ApplierReset ? static_cast(&reset) : &clear; + const Uint64 payloadBytes = op == MGPWireOp::ApplierReset ? sizeof(reset) : sizeof(clear); // P15: applier_reset is the one kWaitApplied row left (generate_mipmap went async). - const Uint64 seq = op == MGPWireOp::ApplierReset - ? session.EmitAndWait(op, &reset, sizeof(reset), nullptr, 0, nullptr, 0, nullptr) - : session.EmitAndWait(op, &clear, sizeof(clear), nullptr, 0, nullptr, 0, nullptr); + Uint64 seq = Codec::kInvalidSeq; + if (emit == E1Emit::PublishOnly) { + seq = session.Encoder().EncodeRecord(op, payload, payloadBytes); + if (seq == Codec::kInvalidSeq) ::_exit(87); + producer.PublishAndNotify(seq); + } else { + seq = session.EmitAndWait(op, payload, payloadBytes, nullptr, 0, nullptr, 0, nullptr); + } // Observe BEFORE allowing the peer to complete a non-waiting emission. const Bool parked = bell.entered.load(); const Bool appliedBeforeReturn = session.Control()->Progress.appliedSeq.load() >= seq; @@ -97,6 +110,19 @@ TEST(RemoteWaitBoundaryControl, AppliedClassWaitsWithRunAheadCap) { #endif } +// The control for the case above: the same ApplierReset, published with no wait. The probe has +// to read it as not parked, or a wait that never happened would pass the cases that must wait. +TEST(RemoteWaitBoundaryControl, AnUnwaitedPublishIsSeenAsNoWait) { +#if MGTEST_HAVE_FORK + ASSERT_EQ(MGPipeWaitClassFor(MGPWireOp::ApplierReset), kWaitApplied); + CheckE1Boundary(true, MGPWireOp::ApplierReset, false, + "E1 control: an ApplierReset published without a wait was observed as a wait", + E1Emit::PublishOnly); +#else + GTEST_SKIP() << "E1 requires POSIX child isolation"; +#endif +} + TEST(RemoteWaitBoundaryControl, MissingServerCapKeepsClearLockstep) { #if MGTEST_HAVE_FORK ASSERT_EQ(MGPipeWaitClassFor(MGPWireOp::Clear), kWaitNone); diff --git a/scripts/data/skip_census_baseline.json b/scripts/data/skip_census_baseline.json index 81097051..a130bb67 100644 --- a/scripts/data/skip_census_baseline.json +++ b/scripts/data/skip_census_baseline.json @@ -63,6 +63,7 @@ "DirectGLES.MagmaWireReclaimScenario.RespecifiesWithNoDrawBetweenKeepTheLiveStoreCountBounded", "DirectGLES.MagmaWireReclaimScenario.RespecifyAndDrawEachStoreInOneFrameStaysWithinTheDeferredBudget", "DirectGLES.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.PointSizeDemotionScenario.ACaptureSurvivesAStageThatOnlyReadsThePointSize", "DirectGLES.PointSizeDemotionScenario.TheDemotionIsActuallyArmedWhenTheEnvironmentPinsItOn", "DirectGLES.PrimitivesGeneratedNoXfbScenario.APausedSpanCountsACpuPricedDrawExactlyOnce", @@ -138,6 +139,7 @@ "DirectVulkan.P4aSeamAuditScenario.ATextureRespecifiedWhileAttachedReachesTheFramebufferRecord", "DirectVulkan.PartialUploadOverGpuContentScenario.OneDimensionalArraySubImageKeepsTheGpuClearedLayer", "DirectVulkan.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectVulkan.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectVulkan.PointSizeDemotionScenario.TheDemotionIsActuallyArmedWhenTheEnvironmentPinsItOn", "DirectVulkan.PrimitivesGeneratedNoXfbScenario.TheRerouteIsActuallyArmedWhenTheEnvironmentPinsItOn", "DirectVulkan.SnormAttachmentScenario.SignedNormalizedAttachmentsRoundTripTheirChannelValues", @@ -660,6 +662,7 @@ "DirectGLES.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectGLES.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.PipelineFailureScenario.SamplerArrayInAStructDrawsWithoutKillingTheProcess", "DirectGLES.PipelineFailureScenario.TheSameDrawRepeatsIdenticallyWithNoPoisonedPipelineCache", @@ -1372,6 +1375,7 @@ "DirectVulkan.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectVulkan.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectVulkan.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectVulkan.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectVulkan.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectVulkan.PipelineFailureScenario.SamplerArrayInAStructDrawsWithoutKillingTheProcess", "DirectVulkan.PipelineFailureScenario.TheSameDrawRepeatsIdenticallyWithNoPoisonedPipelineCache", @@ -1697,6 +1701,7 @@ "DirectGLES.ObjectSubsystemControlScenario.ClearingTheP4aBitsStopsTheEmissionsAndNotThePixels", "DirectGLES.ObjectSubsystemControlScenario.TheAppliersNoConsumerBeltNeverFiresBehindTheClientsGate", "DirectGLES.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.PipeVerifyArmingScenario.Armed", "DirectGLES.PipeVerifyArmingScenario.CorruptedFieldIsReported", "DirectGLES.PipeVerifyArmingScenario.CorruptedFieldIsReportedOnTheServerRead", @@ -1871,6 +1876,7 @@ "DirectVulkan.P4aSeamAuditScenario.ATextureRespecifiedWhileAttachedReachesTheFramebufferRecord", "DirectVulkan.PartialUploadOverGpuContentScenario.OneDimensionalArraySubImageKeepsTheGpuClearedLayer", "DirectVulkan.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectVulkan.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectVulkan.PipeVerifyArmingScenario.Armed", "DirectVulkan.PipeVerifyArmingScenario.CorruptedFieldIsReported", "DirectVulkan.PipeVerifyArmingScenario.CorruptedFieldIsReportedOnTheServerRead", @@ -2478,6 +2484,7 @@ "DirectGLES.ObjectSubsystemControlScenario.TheAppliersNoConsumerBeltNeverFiresBehindTheClientsGate", "DirectGLES.PackBufferReadbackScenario.APackBufferReadPostsNoReplyAndMarksTheBuffer", "DirectGLES.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.PipeVerifyArmingScenario.Armed", "DirectGLES.PipeVerifyArmingScenario.CorruptedFieldIsReported", "DirectGLES.PipeVerifyArmingScenario.CorruptedFieldIsReportedOnTheServerRead", @@ -2729,6 +2736,7 @@ "DirectVulkan.PackBufferReadbackScenario.APackBufferReadPostsNoReplyAndMarksTheBuffer", "DirectVulkan.PartialUploadOverGpuContentScenario.OneDimensionalArraySubImageKeepsTheGpuClearedLayer", "DirectVulkan.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectVulkan.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectVulkan.PipeVerifyArmingScenario.Armed", "DirectVulkan.PipeVerifyArmingScenario.CorruptedFieldIsReported", "DirectVulkan.PipeVerifyArmingScenario.CorruptedFieldIsReportedOnTheServerRead", @@ -3310,6 +3318,7 @@ "DirectGLES.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectGLES.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.PersistentMapArm.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", "DirectGLES.PipeVerifyArmingScenario.Armed", @@ -3845,6 +3854,7 @@ "DirectGLES.Spawn.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectGLES.Spawn.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.Spawn.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.Spawn.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.Spawn.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.Spawn.PipelineFailureScenario.SamplerArrayInAStructDrawsWithoutKillingTheProcess", "DirectGLES.Spawn.PipelineFailureScenario.TheSameDrawRepeatsIdenticallyWithNoPoisonedPipelineCache", @@ -4571,6 +4581,7 @@ "DirectGLES.Split.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectGLES.Split.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.Split.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.Split.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.Split.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.Split.PersistentMapArm.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", "DirectGLES.Split.PipelineFailureScenario.SamplerArrayInAStructDrawsWithoutKillingTheProcess", @@ -4636,6 +4647,7 @@ "DirectGLES.Split.SmallRing.ClearThenReadPixelsScenario.ClearWithNoDrawIsVisibleToDefaultFramebufferReadPixels", "DirectGLES.Split.SmallRing.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.Split.SmallRing.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.Split.SmallRing.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.Split.SmallRing.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.Split.SmallRing.TriangleScenario.AVboBackedTriangleReachesReadPixels", "DirectGLES.Split.SmallRing.TriangleScenario.TheSameVboAndVaoRedrawAcrossAFrameBoundary", @@ -5256,6 +5268,7 @@ "DirectGLES.Tcp.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectGLES.Tcp.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.Tcp.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.Tcp.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.Tcp.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.Tcp.PipelineFailureScenario.SamplerArrayInAStructDrawsWithoutKillingTheProcess", "DirectGLES.Tcp.PipelineFailureScenario.TheSameDrawRepeatsIdenticallyWithNoPoisonedPipelineCache", @@ -6131,6 +6144,7 @@ "DirectVulkan.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectVulkan.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectVulkan.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectVulkan.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectVulkan.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectVulkan.PipeVerifyArmingScenario.Armed", "DirectVulkan.PipeVerifyArmingScenario.CorruptedFieldIsReported", @@ -7907,6 +7921,7 @@ "DirectGLES.Split.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectGLES.Split.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.Split.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.Split.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.Split.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.Split.PersistentMapArm.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", "DirectGLES.Split.PipelineFailureScenario.SamplerArrayInAStructDrawsWithoutKillingTheProcess", @@ -7968,6 +7983,7 @@ "DirectGLES.Split.SmallRing.ClearThenReadPixelsScenario.ClearWithNoDrawIsVisibleToDefaultFramebufferReadPixels", "DirectGLES.Split.SmallRing.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.Split.SmallRing.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.Split.SmallRing.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.Split.SmallRing.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.Split.SmallRing.TriangleScenario.AVboBackedTriangleReachesReadPixels", "DirectGLES.Split.SmallRing.TriangleScenario.TheSameVboAndVaoRedrawAcrossAFrameBoundary", @@ -9128,6 +9144,7 @@ "DirectGLES.Split.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectGLES.Split.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.Split.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.Split.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.Split.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.Split.PersistentMapArm.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", "DirectGLES.Split.PipelineFailureScenario.SamplerArrayInAStructDrawsWithoutKillingTheProcess", @@ -9189,6 +9206,7 @@ "DirectGLES.Split.SmallRing.ClearThenReadPixelsScenario.ClearWithNoDrawIsVisibleToDefaultFramebufferReadPixels", "DirectGLES.Split.SmallRing.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.Split.SmallRing.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.Split.SmallRing.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.Split.SmallRing.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.Split.SmallRing.TriangleScenario.AVboBackedTriangleReachesReadPixels", "DirectGLES.Split.SmallRing.TriangleScenario.TheSameVboAndVaoRedrawAcrossAFrameBoundary", @@ -11192,6 +11210,7 @@ "RemoteRunAhead.ClearingTheVerbBarrierDisarmsRunAheadEvenWithTheCapBit", "RemoteRunAhead.OnlyTheTextureHalfOfResourceSubDataWantsItsReply", "RemoteRunAhead.TheKnobAloneDoesNotArmRunAheadWithoutTheServersCapBit", + "RemoteWaitBoundaryControl.AnUnwaitedPublishIsSeenAsNoWait", "RemoteWaitBoundaryControl.AppliedClassWaitsWithRunAheadCap", "RemoteWaitBoundaryControl.MissingServerCapKeepsClearLockstep", "RemoteWaitBoundaryControl.ServerCapAllowsClearToRunAhead", @@ -12327,6 +12346,7 @@ "DirectGLES.ObjectSubsystemControlScenario.ClearingTheP4aBitsStopsTheEmissionsAndNotThePixels", "DirectGLES.ObjectSubsystemControlScenario.TheAppliersNoConsumerBeltNeverFiresBehindTheClientsGate", "DirectGLES.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.PipeVerifyArmingScenario.Armed", "DirectGLES.PipeVerifyArmingScenario.CorruptedFieldIsReported", "DirectGLES.PipeVerifyArmingScenario.CorruptedFieldIsReportedOnTheServerRead", @@ -12501,6 +12521,7 @@ "DirectVulkan.P4aSeamAuditScenario.ATextureRespecifiedWhileAttachedReachesTheFramebufferRecord", "DirectVulkan.PartialUploadOverGpuContentScenario.OneDimensionalArraySubImageKeepsTheGpuClearedLayer", "DirectVulkan.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectVulkan.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectVulkan.PipeVerifyArmingScenario.Armed", "DirectVulkan.PipeVerifyArmingScenario.CorruptedFieldIsReported", "DirectVulkan.PipeVerifyArmingScenario.CorruptedFieldIsReportedOnTheServerRead", @@ -12676,6 +12697,7 @@ "DirectGLES.ObjectSubsystemControlScenario.TheAppliersNoConsumerBeltNeverFiresBehindTheClientsGate", "DirectGLES.PackBufferReadbackScenario.APackBufferReadPostsNoReplyAndMarksTheBuffer", "DirectGLES.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.PipeVerifyArmingScenario.Armed", "DirectGLES.PipeVerifyArmingScenario.CorruptedFieldIsReported", "DirectGLES.PipeVerifyArmingScenario.CorruptedFieldIsReportedOnTheServerRead", @@ -12927,6 +12949,7 @@ "DirectVulkan.PackBufferReadbackScenario.APackBufferReadPostsNoReplyAndMarksTheBuffer", "DirectVulkan.PartialUploadOverGpuContentScenario.OneDimensionalArraySubImageKeepsTheGpuClearedLayer", "DirectVulkan.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectVulkan.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectVulkan.PipeVerifyArmingScenario.Armed", "DirectVulkan.PipeVerifyArmingScenario.CorruptedFieldIsReported", "DirectVulkan.PipeVerifyArmingScenario.CorruptedFieldIsReportedOnTheServerRead", @@ -13430,6 +13453,7 @@ "DirectGLES.Spawn.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectGLES.Spawn.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.Spawn.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.Spawn.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.Spawn.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.Spawn.PipelineFailureScenario.SamplerArrayInAStructDrawsWithoutKillingTheProcess", "DirectGLES.Spawn.PipelineFailureScenario.TheSameDrawRepeatsIdenticallyWithNoPoisonedPipelineCache", @@ -14124,6 +14148,7 @@ "DirectGLES.Tcp.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectGLES.Tcp.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.Tcp.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.Tcp.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.Tcp.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.Tcp.PipelineFailureScenario.SamplerArrayInAStructDrawsWithoutKillingTheProcess", "DirectGLES.Tcp.PipelineFailureScenario.TheSameDrawRepeatsIdenticallyWithNoPoisonedPipelineCache", @@ -14424,6 +14449,7 @@ "DirectGLES.VerifySplit.MagmaWireReclaimScenario.RespecifiesWithNoDrawBetweenKeepTheLiveStoreCountBounded", "DirectGLES.VerifySplit.MagmaWireReclaimScenario.RespecifyAndDrawEachStoreInOneFrameStaysWithinTheDeferredBudget", "DirectGLES.VerifySplit.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.VerifySplit.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.VerifySplit.PointSizeDemotionScenario.ACaptureSurvivesAStageThatOnlyReadsThePointSize", "DirectGLES.VerifySplit.PointSizeDemotionScenario.TheDemotionIsActuallyArmedWhenTheEnvironmentPinsItOn", "DirectGLES.VerifySplit.PrimitivesGeneratedNoXfbScenario.APausedSpanCountsACpuPricedDrawExactlyOnce", @@ -14498,6 +14524,7 @@ "DirectVulkan.VerifySplit.P4aSeamAuditScenario.ATextureRespecifiedWhileAttachedReachesTheFramebufferRecord", "DirectVulkan.VerifySplit.PartialUploadOverGpuContentScenario.OneDimensionalArraySubImageKeepsTheGpuClearedLayer", "DirectVulkan.VerifySplit.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectVulkan.VerifySplit.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectVulkan.VerifySplit.PointSizeDemotionScenario.TheDemotionIsActuallyArmedWhenTheEnvironmentPinsItOn", "DirectVulkan.VerifySplit.PrimitivesGeneratedNoXfbScenario.TheRerouteIsActuallyArmedWhenTheEnvironmentPinsItOn", "DirectVulkan.VerifySplit.SnormAttachmentScenario.SignedNormalizedAttachmentsRoundTripTheirChannelValues", @@ -14981,6 +15008,7 @@ "DirectGLES.VerifySplit.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectGLES.VerifySplit.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.VerifySplit.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.VerifySplit.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.VerifySplit.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.VerifySplit.PipelineFailureScenario.SamplerArrayInAStructDrawsWithoutKillingTheProcess", "DirectGLES.VerifySplit.PipelineFailureScenario.TheSameDrawRepeatsIdenticallyWithNoPoisonedPipelineCache", @@ -15667,6 +15695,7 @@ "DirectVulkan.VerifySplit.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectVulkan.VerifySplit.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectVulkan.VerifySplit.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectVulkan.VerifySplit.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectVulkan.VerifySplit.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectVulkan.VerifySplit.PipelineFailureScenario.SamplerArrayInAStructDrawsWithoutKillingTheProcess", "DirectVulkan.VerifySplit.PipelineFailureScenario.TheSameDrawRepeatsIdenticallyWithNoPoisonedPipelineCache", @@ -18014,6 +18043,7 @@ "DirectGLES.Verify.ObjectSubsystemControlScenario.TheAppliersNoConsumerBeltNeverFiresBehindTheClientsGate", "DirectGLES.Verify.PackBufferReadbackScenario.APackBufferReadPostsNoReplyAndMarksTheBuffer", "DirectGLES.Verify.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.Verify.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.Verify.PipeVerifyArmingScenario.Armed", "DirectGLES.Verify.PipeVerifyArmingScenario.CorruptedFieldIsReported", "DirectGLES.Verify.PipeVerifyArmingScenario.CorruptedFieldIsReportedOnTheServerRead", @@ -18113,6 +18143,7 @@ "DirectVulkan.Verify.PackBufferReadbackScenario.APackBufferReadPostsNoReplyAndMarksTheBuffer", "DirectVulkan.Verify.PartialUploadOverGpuContentScenario.OneDimensionalArraySubImageKeepsTheGpuClearedLayer", "DirectVulkan.Verify.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectVulkan.Verify.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectVulkan.Verify.PipeVerifyArmingScenario.Armed", "DirectVulkan.Verify.PipeVerifyArmingScenario.CorruptedFieldIsReported", "DirectVulkan.Verify.PipeVerifyArmingScenario.CorruptedFieldIsReportedOnTheServerRead", @@ -18552,6 +18583,7 @@ "DirectGLES.Verify.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectGLES.Verify.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectGLES.Verify.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectGLES.Verify.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectGLES.Verify.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectGLES.Verify.PipeVerifyArmingScenario.Armed", "DirectGLES.Verify.PipeVerifyArmingScenario.CorruptedFieldIsReported", @@ -19185,6 +19217,7 @@ "DirectVulkan.Verify.PartialUploadOverGpuContentScenario.TwoDistantSubImagesKeepTheGpuClearBetweenThem", "DirectVulkan.Verify.PersistentCoherentMapScenario.AWriteAfterAFrameBoundaryReachesTheNextFramesDraw", "DirectVulkan.Verify.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares", + "DirectVulkan.Verify.PersistentCoherentMapScenario.ThePushIsTheOnlyRouteAWriteTakesToTheServer", "DirectVulkan.Verify.PersistentCoherentMapScenario.TwoWritesThroughTheCoherentPointerEachReachTheirOwnDraw", "DirectVulkan.Verify.PipeVerifyArmingScenario.Armed", "DirectVulkan.Verify.PipeVerifyArmingScenario.CorruptedFieldIsReported",