From f4f2bec711b4299baaa84d2d1eca724eda7c4e8c Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Fri, 9 Oct 2026 23:39:55 -0400 Subject: [PATCH] [Perf] (Espryt): drain small partial writes as a whole-store orphan map --- MobileGL/MG_Backend/DirectGLES/Managers.cpp | 30 ++++++++ MobileGL/MG_Backend/DirectGLES/Managers.h | 40 +++++++++++ .../Scenarios/AtomicCounterScenario.cpp | 34 ++++++++++ .../Scenarios/CrossFrameBufferScenario.cpp | 57 ++++++++++++++++ MobileGL/MG_Test/Buffer/SplitBufferTest.cpp | 48 +++++++++++++ docs/Disaggregated/notes/perf-p15/HANDOFF.md | 68 +++++++++++++++++++ scripts/data/skip_census_baseline.json | 45 ++++++++++++ 7 files changed, 322 insertions(+) diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.cpp b/MobileGL/MG_Backend/DirectGLES/Managers.cpp index 6c878dfd..ff866fcb 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.cpp +++ b/MobileGL/MG_Backend/DirectGLES/Managers.cpp @@ -1511,6 +1511,35 @@ namespace MobileGL::MG_Backend::DirectGLES { // this one against a sha pinned at 3e298c9a. Neither ladder may drift, and neither // may drift AWAY FROM THE OTHER without the gate saying so. + // P15: the small-store write rename (WholeStoreRenameApplies, Managers.h), applied to the + // queue BEFORE the drain takes it. The ladder above is pinned and is not touched: it is + // handed one whole-store range, which its own tier 1 already answers with the + // whole-buffer orphan-map. Draw path only - the readback drains keep their exact ranges. + void RenameSmallStoreForDrain(GLESBufferResource& resource, const Uint8* hostBase, SizeT frontendSize) { + const SizeT store = resource.storageSize; + const Bool mapUsable = !MG_Config::Features.EsprytDisableInvalidateFlush && + g_GLESFuncs.glMapBufferRange && g_GLESFuncs.glUnmapBuffer; + const Bool foreignBytes = resource.serverGpuWritten || resource.persistentMapped || + resource.immutableStorage || resource.externalAhb != nullptr; + // The size gate first, with the whole store as the queue: it answers every refusal + // that does not depend on the queue before any lock is taken. + if (!WholeStoreRenameApplies(store, frontendSize, store, hostBase != nullptr, foreignBytes, mapUsable)) + return; + // Under split the host bytes are the server's staged copy, which only holds what the + // content records delivered; monolith's base is the frontend shadow, the whole store. + if (ServerStaged().CopiesIntoServerStorage() && !ServerStaged().IsCovered(&resource, 0, store)) return; + const std::lock_guard lock(resource.pendingMutex); + if (resource.pendingRanges.empty() || !resource.pendingResidentWrites.empty()) return; + SizeT queuedBytes = 0; + for (const auto& range : resource.pendingRanges) { + const SizeT end = std::min(range.end, store); + queuedBytes += end - std::min(range.start, end); + } + if (!WholeStoreRenameApplies(store, frontendSize, queuedBytes, true, false, true)) return; + resource.pendingRanges.clear(); + resource.pendingRanges.Add({0, store}); + } + // Land the app bytes queued for an ADOPTED store on the GPU timeline: staged // into the upload ring and delivered by glCopyBufferSubData. The destination // is the IMMUTABLE persistent store, which the driver can neither rename nor @@ -3555,6 +3584,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } else if (!resource->pendingRanges.empty()) { // Same rule as Ops_H_Readback's, at the draw-time drain: with no frontend object // `hostBase` is the server shadow and every queued range must be staged. + RenameSmallStoreForDrain(*resource, hostBase, size); MGL_SERVER_STAGED_REQUIRE_PENDING(*resource, hostBase, size, "ensure_flush_pending"); FlushPendingRangesFrom(*resource, hostBase, size); resource->syncedChangeSerial = serial; diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.h b/MobileGL/MG_Backend/DirectGLES/Managers.h index 18758269..0239d318 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.h +++ b/MobileGL/MG_Backend/DirectGLES/Managers.h @@ -984,6 +984,46 @@ namespace MobileGL::MG_Backend::DirectGLES { (wholeBuffer ? GL_MAP_INVALIDATE_BUFFER_BIT : GL_MAP_INVALIDATE_RANGE_BIT); } + // P15: WRITE RENAMING FOR A SMALL STORE. The draw-time drain sends a partial range below + // the tier-1 threshold through the upload ring, and every such range is one + // glCopyBufferSubData: a GPU copy job the driver builds on the render thread (FCL MC 1.21.5 + // monolith on Adreno 830: 0.08 of the drain's 0.105 ms/frame) and then runs on the GPU + // timeline. Minecraft's immediate-mode batches rewrite a small per-format vertex buffer from + // offset 0 before each draw, so these ranges are partial writes of tiny stores (the + // 1.21.5 in-world trace: ~122 a frame, 81 of them into 288-byte stores). For such a store + // the drain rewrites the WHOLE store from the host bytes instead, which is tier 1's + // whole-buffer orphan-map: draws already recorded keep the old storage, draws after read the + // new one, and no copy job is recorded - the rename Magma's RenameBusyWireStore makes under + // the same 64 KiB bound. + // + // The bytes the rename moves that the queue did not ask for are bounded by + // kEsprytWholeStoreRenameMaxExtraBytes: a 128-byte write into a 53 KiB index store stays a + // ring copy rather than becoming a 53 KiB memcpy. On that trace the bound keeps 108 of the + // 122 renames for 101 KiB of extra host copying a frame; renaming every store up to 64 KiB + // would copy 811 KiB. + // + // Widening a map past the queued range is the edge that already drew blood (the note on + // InvalidateFlushAccessFor): it is only exact when the host bytes ARE the store, byte for + // byte, outside the queued ranges too. So every way the store can hold bytes the host + // copy does not is a refusal, and the caller passes them in as one flag: a shader write + // since the last whole readback (serverGpuWritten), queued resident writes, a coherent or + // imported store, immutable storage. `hostBytesCoverStore` is the host copy's own extent: + // the frontend shadow on monolith, the staged coverage under split. `mapUsable` is tier 1's + // own gate - without the map the whole range would just be a bigger ring copy. + // + // `queuedBytes` is the sum of the queued ranges clamped to the store (VecRange1D keeps them + // disjoint). + inline constexpr SizeT kEsprytWholeStoreRenameMaxBytes = 64u * 1024u; + inline constexpr SizeT kEsprytWholeStoreRenameMaxExtraBytes = 8u * 1024u; + constexpr Bool WholeStoreRenameApplies(SizeT storageSize, SizeT frontendSize, SizeT queuedBytes, + Bool hostBytesCoverStore, Bool storeHoldsBytesTheHostDoesNot, + Bool mapUsable) { + if (!mapUsable || !hostBytesCoverStore || storeHoldsBytesTheHostDoesNot) return false; + if (storageSize == 0 || storageSize > kEsprytWholeStoreRenameMaxBytes) return false; + if (frontendSize != storageSize || queuedBytes == 0 || queuedBytes > storageSize) return false; + return storageSize - queuedBytes <= kEsprytWholeStoreRenameMaxExtraBytes; + } + // The handle arms of the two draw-path entry points below. IsBufferDrawCleanByHandle // asks the applier the same five questions IsBufferDrawClean asks the frontend object, // with identical semantics (D-A4); EnsureBufferResourceForHandle is the ensure path diff --git a/MobileGL/MG_IntegrationTest/Scenarios/AtomicCounterScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/AtomicCounterScenario.cpp index da6fc5fe..a8d50874 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/AtomicCounterScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/AtomicCounterScenario.cpp @@ -264,4 +264,38 @@ void main() { << "range untouched"; } + // The same partial SubData, but drained by the NEXT DISPATCH rather than by a readback: the + // counter buffer is ensured as a binding, which is the draw-time drain. DirectGLES renames a + // small store there - the whole store is rewritten from the host copy instead of the queued + // range being copied - and a store a shader wrote is exactly the one whose host copy is stale + // outside the range: offset 4 still holds the seed on the CPU side and the first dispatch's + // increments on the GPU. Renaming it would put the seed back and the second dispatch would + // count from there. + TEST_F(AtomicCounterScenario, APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour) { + if (!Ready() || IsSkipped()) return; + + const GLuint zero = MakeCounterBuffer(0, {0u, 0u}); + MakeCounterBuffer(1, {0u}); + ASSERT_EQ(FirstGLError(), 0u); + + Dispatch(); + + const unsigned int reseed = 4242u; + glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, zero); + glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 0, sizeof(reseed), &reseed); + glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, 0); + ASSERT_EQ(FirstGLError(), 0u) << "re-seeding offset 0 raised a GL error"; + + Dispatch(); + + const std::vector values = ReadCounters(zero, 2); + EXPECT_EQ(FirstGLError(), 0u); + EXPECT_EQ(values[0], reseed + kInvocations) + << "offset 0 read back " << values[0] << "; the SubData did not reach the second dispatch"; + EXPECT_EQ(values[1], 4 * kInvocations) + << "offset 4 read back " << values[1] << "; " << 2 * kInvocations + << " means the drain before the second dispatch rewrote the shader-written neighbour from the " + << "stale host copy"; + } + } // namespace MGITest diff --git a/MobileGL/MG_IntegrationTest/Scenarios/CrossFrameBufferScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/CrossFrameBufferScenario.cpp index a82710a0..f4f27edc 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/CrossFrameBufferScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/CrossFrameBufferScenario.cpp @@ -497,6 +497,63 @@ void main() { // ---- a self-test of the assertions, not of MobileGL ------------------ // + // Inside ONE frame: draw, overwrite PART of the vertex buffer, draw again. This is the + // immediate-mode streaming shape (Minecraft rewrites a small per-format vertex buffer from + // offset 0 before every batch), and the first draw is still queued when the write lands - + // it must keep the bytes it was issued with. DirectGLES drains this partial range of a + // small store by renaming the whole store rather than copying the range, so this pins that + // the rename is an orphan the first draw survives and that it carries the bytes OUTSIDE + // the written range (the right quad's vertices) into the new storage. + TEST_F(CrossFrameBufferScenario, APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes) { + ASSERT_NO_FATAL_FAILURE(BuildScene(/*immutable=*/false)); + for (int frame = 0; frame < kWarmupFrames; ++frame) { + BeginFrame(); + DrawScene(); + Gl().EndFrame(); + } + + // The left quad's four vertices moved onto the right half and turned blue: 80 of the + // buffer's 160 bytes. + std::vector moved = SceneVertices(/*leftQuadIsGreen=*/false); + for (int i = 0; i < kLeftQuadVertexCount; ++i) { + moved[i].x += 1.0f; + moved[i].r = 0.0f; + moved[i].g = 0.0f; + moved[i].b = 1.0f; + } + const GLsizeiptr leftQuadBytes = GLsizeiptr(kLeftQuadVertexCount * sizeof(Vertex)); + ASSERT_LT(leftQuadBytes, m_vertexBytes) << "the write must be a partial range of the store"; + + BeginFrame(); + DrawScene(); + glBindBuffer(GL_ARRAY_BUFFER, m_vbo); + glBufferSubData(GL_ARRAY_BUFFER, 0, leftQuadBytes, moved.data()); + glBindBuffer(GL_ARRAY_BUFFER, 0); + ASSERT_EQ(FirstGLError(), GLenum(GL_NO_ERROR)) << "the partial SubData raised a GL error"; + DrawScene(); + const Image frame = ReadFrame(); + Gl().EndFrame(); + + ExpectHalves(frame, "red", "blue", + "a draw queued before a partial SubData must keep its bytes, and the draw after it " + "must see the new ones"); + + // The next frame draws only from the rewritten store: the right quad's vertices + // (outside the written range) must have come along with the rename, so the second + // index set still reaches them. + BeginFrame(); + glBindVertexArray(m_vao); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, m_indexBytes, kIndicesRightQuad); + glBindVertexArray(0); + DrawScene(); + const Image next = ReadFrame(); + Gl().EndFrame(); + ExpectHalves(next, "black", "green", + "the bytes outside the partial write were lost when the store was rewritten"); + EXPECT_EQ(FirstGLError(), GLenum(GL_NO_ERROR)); + } + // Every case above leans on ExpectHalves. ExpectHalves used to sample the // centre pixel of each half - two pixels for a 12288-pixel readback - and // that is measurably too weak to stand behind a claim about buffer diff --git a/MobileGL/MG_Test/Buffer/SplitBufferTest.cpp b/MobileGL/MG_Test/Buffer/SplitBufferTest.cpp index 1be35f3a..dc691f29 100644 --- a/MobileGL/MG_Test/Buffer/SplitBufferTest.cpp +++ b/MobileGL/MG_Test/Buffer/SplitBufferTest.cpp @@ -902,3 +902,51 @@ TEST(EsprytFlushLadder, APartialRangeDoesNotOvertakeAQueuedRingCopy) { static_cast(GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT)) << "the whole-buffer orphan-map rewrites every byte from the shadow the copies were taken from"; } + +// P15: the small-store write rename. A partial range of a small store is drained as the whole +// store - tier 1's orphan-map - instead of one upload-ring copy job per range, but only while the +// host bytes are the store byte for byte, and only while the bytes nobody asked for stay small. +namespace { + using MobileGL::MG_Backend::DirectGLES::BufferImpl::kEsprytWholeStoreRenameMaxBytes; + using MobileGL::MG_Backend::DirectGLES::BufferImpl::kEsprytWholeStoreRenameMaxExtraBytes; + using MobileGL::MG_Backend::DirectGLES::BufferImpl::WholeStoreRenameApplies; +} // namespace + +TEST(EsprytFlushLadder, ASmallStoreWhoseHostBytesAreTheStoreIsRenamedWhole) { + // Minecraft's immediate-mode shape: 96 of a 288-byte vertex store, from offset 0. + EXPECT_TRUE(WholeStoreRenameApplies(288, 288, 96, true, false, true)); + EXPECT_TRUE(WholeStoreRenameApplies(kEsprytWholeStoreRenameMaxBytes, kEsprytWholeStoreRenameMaxBytes, + kEsprytWholeStoreRenameMaxBytes - kEsprytWholeStoreRenameMaxExtraBytes, true, + false, true)); + // And the renamed range is one tier 1 takes as the whole-buffer orphan-map, with or without a + // ring copy still queued on the store. + EXPECT_EQ(InvalidateFlushAccessFor(0, 288, 0, 288, 288, 288, true), + static_cast(GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT)); +} + +TEST(EsprytFlushLadder, ARenameThatWouldMoveTooManyUnaskedBytesKeepsItsQueuedRanges) { + EXPECT_FALSE(WholeStoreRenameApplies(kEsprytWholeStoreRenameMaxBytes + 1, kEsprytWholeStoreRenameMaxBytes + 1, + kEsprytWholeStoreRenameMaxBytes + 1, true, false, true)) + << "above the store bound the queue is drained as it stands"; + // The 1.21.5 trace's other shape: 128 bytes into a 53 KiB index store. + EXPECT_FALSE(WholeStoreRenameApplies(53824, 53824, 128, true, false, true)) + << "rewriting 53 KiB for a 128-byte write moves more bytes than the copy job it saves"; + EXPECT_FALSE(WholeStoreRenameApplies(16384, 16384, 16384 - kEsprytWholeStoreRenameMaxExtraBytes - 1, true, + false, true)); + EXPECT_FALSE(WholeStoreRenameApplies(0, 0, 0, true, false, true)); + EXPECT_FALSE(WholeStoreRenameApplies(288, 288, 0, true, false, true)) << "nothing queued, nothing to rename"; +} + +// The refusals are the widening rule: the rename rewrites bytes outside the queued ranges, which +// is exact only when the host copy holds them. +TEST(EsprytFlushLadder, AStoreHoldingBytesTheHostCopyDoesNotIsNeverRenamed) { + EXPECT_FALSE(WholeStoreRenameApplies(288, 288, 96, true, true, true)) + << "a shader-written (or coherent, imported, resident-written) store would get the stale " + "host bytes back over what the GPU put there"; + EXPECT_FALSE(WholeStoreRenameApplies(288, 288, 96, false, false, true)) + << "under split a staged copy that does not cover the store has no bytes for the rest of it"; + EXPECT_FALSE(WholeStoreRenameApplies(288, 576, 96, true, false, true)) + << "a store the frontend has already resized is a respecify, not a rename"; + EXPECT_FALSE(WholeStoreRenameApplies(288, 288, 96, true, false, false)) + << "without tier 1's map the whole store would only be a bigger ring copy"; +} diff --git a/docs/Disaggregated/notes/perf-p15/HANDOFF.md b/docs/Disaggregated/notes/perf-p15/HANDOFF.md index 61559616..569e793e 100644 --- a/docs/Disaggregated/notes/perf-p15/HANDOFF.md +++ b/docs/Disaggregated/notes/perf-p15/HANDOFF.md @@ -252,6 +252,74 @@ e70925d3, local, not pushed):** - The device lock is released by devjob2 when m2ab ends. - The plugin installs `top.mobilegl.plugin.*.trace` from earlier phases are still on the device. +## Open: Espryt small-store write rename (branch `pmflush`, 2026-10-09, host-verified, needs device) + +**Not a p15 regression.** MONOLITH-DIFF's top Espryt row (`FlushPendingRangesFrom` driver 0.091 + libc +0.025, "dev 0") is the rename the doc's own caveat lists: dev's `FlushPendingRangesNow` costs 0.086 + 0.019 +in the same profiles. Both are the same three-tier ladder, unchanged since dev f973008c. Inclusive: +dev 0.066 / p15 0.078 (feat-esp-1), 0.106 on the newer api29ab e26 run. So the drain is real cost that +dev pays too. + +**What the drain is.** Under it, 0.080 of 0.106 ms/frame is one Adreno driver routine reached from +`glCopyBufferSubData` (dispatch slot 0x670 -> 0x3250c0 -> 0x2ee9d0, with heap allocations inside). +So it is the upload-ring tier: one GPU copy job per queued partial range. The 1.21.5 in-world trace +(5998912 calls, last 252 frames) shows the shape: 162 glBufferSubData a frame. 122 of them are partial +writes from offset 0, mostly 96 or 192 bytes into 288-byte vertex stores, and ~3 KB into 6.7 KB ones. +That is Minecraft's per-format immediate vertex buffer. Magma already renames these stores +(`RenameBusyWireStore`, S0 M4); `WriteWireBuffer` costs 0.031 ms/frame there, so Magma needs nothing. + +**Change.** `RenameSmallStoreForDrain` (Managers.cpp) runs before the draw-time drain. For a store +<= 64 KiB whose unwritten bytes are <= 8 KiB, it replaces the queue with [0, store). The pinned ladder +then takes its tier 1, the whole-buffer orphan-map: no copy job, and recorded draws keep the old +storage. It refuses when the store holds bytes the host copy does not have: `serverGpuWritten`, +queued resident writes, persistent/immutable/imported stores, or split staged coverage short of the +whole store. On the trace this renames 108 of 122 partial writes a frame, at +101 KiB of host memcpy a +frame; a plain 64 KiB bound would cost +811 KiB, because of 128-byte writes into a 53 KiB index store. +The ladder bodies and the G5 pins are untouched. + +**Tests.** EsprytFlushLadder has 3 new unit cases. There are 2 new scenarios, one per backend on every +arm: AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour and +CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes. The skip +census mirrors their siblings' skipped lanes. Red-once: dropping the `serverGpuWritten` refusal reds +the atomic case on DirectGLES.Spawn, which reads back 16 instead of 32; monolith and inproc pass +because the frontend reads GPU writes back before a partial CPU write. + +**Suite results.** WSL archlinux, clang Release, lavapipe, env MOBILEGL_ITEST_REQUIRE_GPU=1, suites run +one at a time: +- unit 2907/2907; +- integration 5300/5300 on the labels gpu, split, magma-all-split, magma-full-split, + monolith-control, cold-start, cpu-mip-split, clientarrays-split and remint-fallback-split; +- 354/354 spawn+TCP buffer, SSBO, atomic, persistent, XFB and index scenarios; +- 18/18 Espryt retraces (OpenRA, 1.21.4-in-world, 1.21.11-main-menu, sodium, create-instancing, Iris + BSL; each monolith, SPLIT and SPAWN); +- both Android arm64 shapes compile (disaggregated ON and OFF, android-26). + +A first run with the dozen ICD (REQUIRE_GPU=ON in the cache) failed 1488 DirectVulkan cases. That is +the ICD, not this change: there were 0 DirectGLES failures. + +**Host blocker for retrace evidence (pre-existing).** Espryt on llvmpipe segfaults in the 1.21.5 fixture +at call 75682 (a glDrawElements right after vertex buffer 8 is deleted and recreated). This happens on +the base tree too. Magma completes (SSIM 0.985 on dozen). So Espryt cannot be checked for SSIM on this +trace on the host. + +**Device ask (Perfetto first, per the 2026-10-09 rule).** FCL MC 1.21.5 vanilla bench scene, monolith, +cpuhunt pinned, base = origin e70925d3 vs pmflush, same LTO settings. Run Espryt (the arm under test) +and Magma (control, expected identical). Capture a Perfetto trace per arm with: +- sched_switch/wakeup, cpu_frequency; +- atrace gfx/view/hal; +- kgsl gpu_frequency and GPU busy/slices; +- dma-fence signals; +- SurfaceFlinger frame timeline. + +Report one typical frame as a timeline: render thread runnable/running/blocked, queueBuffer/dequeueBuffer +waits, the GPU slice and its end against the next frame's throttle wait. The question is whether +removing ~100 copy jobs a frame shortens the GPU slice and with it the ~0.8-1.0 ms queueBuffer wait (a +shorter frame), or only cuts CPU (a longer wait, the same frame). simpleperf zoom: `FlushPendingRangesFrom` +inclusive and its callees, expected to drop from ~0.106 towards ~0.03 ms/frame (the orphan-map plus the +extra memcpy). Also check the driver's map path (slot 0x550 -> 0x1db8a0) does not grow into new +allocations per rename. Correctness: SSIM/golden on the device retrace of minecraft-1.21.5-vanilla-fcl +plus the Iris/BSL cases, Espryt. + ## Earlier (2026-10-09): cuts 1b + 1c, cut 4, pipe-record pieces - **Landed locally (pushed after the BSL gpuhunt check):** diff --git a/scripts/data/skip_census_baseline.json b/scripts/data/skip_census_baseline.json index 94cd22b1..a93a558e 100644 --- a/scripts/data/skip_census_baseline.json +++ b/scripts/data/skip_census_baseline.json @@ -311,6 +311,7 @@ "DirectGLES.AsyncOn.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectGLES.AsyncOn.AsyncCompileScenario.IrisShapedTwoPhaseBatchRendersCorrectly", "DirectGLES.AsyncOn.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectGLES.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -362,6 +363,7 @@ "DirectGLES.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectGLES.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectGLES.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectGLES.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -944,6 +946,7 @@ "DirectGLES.Spawn.AsyncOn.AsyncCompileScenario.CompletionStatusPollingThenForcedJoin", "DirectGLES.Spawn.AsyncOn.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectGLES.Spawn.AsyncOn.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectGLES.Spawn.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Spawn.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Spawn.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Spawn.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -1002,6 +1005,7 @@ "DirectGLES.Spawn.CpuMip.GenerateMipmapServerScenario.Rgb32fUploadedBaseGeneratesItsChain", "DirectGLES.Spawn.CpuMipRefused.GenerateMipmapServerScenario.Rgb16fDrawnBaseWithARefusedReadbackDeclinesByName", "DirectGLES.Spawn.CpuMipRefused.GenerateMipmapServerScenario.Rgb16fUploadedBaseWithARefusedReadbackIsFilteredFromTheStore", + "DirectGLES.Spawn.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.Spawn.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.Spawn.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.Spawn.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -1604,6 +1608,7 @@ "DirectGLES.Split.AsyncOn.AsyncCompileScenario.CompletionStatusPollingThenForcedJoin", "DirectGLES.Split.AsyncOn.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectGLES.Split.AsyncOn.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectGLES.Split.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Split.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Split.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Split.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -1661,6 +1666,7 @@ "DirectGLES.Split.CpuMip.GenerateMipmapServerScenario.Rgb32fUploadedBaseGeneratesItsChain", "DirectGLES.Split.CpuMipRefused.GenerateMipmapServerScenario.Rgb16fDrawnBaseWithARefusedReadbackDeclinesByName", "DirectGLES.Split.CpuMipRefused.GenerateMipmapServerScenario.Rgb16fUploadedBaseWithARefusedReadbackIsFilteredFromTheStore", + "DirectGLES.Split.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.Split.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.Split.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.Split.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -2358,6 +2364,7 @@ "DirectGLES.Tcp.AsyncOn.AsyncCompileScenario.CompletionStatusPollingThenForcedJoin", "DirectGLES.Tcp.AsyncOn.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectGLES.Tcp.AsyncOn.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectGLES.Tcp.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Tcp.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Tcp.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Tcp.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -2409,6 +2416,7 @@ "DirectGLES.Tcp.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectGLES.Tcp.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectGLES.Tcp.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectGLES.Tcp.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.Tcp.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.Tcp.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.Tcp.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -3153,6 +3161,7 @@ "DirectVulkan.AsyncOn.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectVulkan.AsyncOn.AsyncCompileScenario.IrisShapedTwoPhaseBatchRendersCorrectly", "DirectVulkan.AsyncOn.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectVulkan.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectVulkan.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectVulkan.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectVulkan.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -3204,6 +3213,7 @@ "DirectVulkan.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectVulkan.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectVulkan.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectVulkan.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectVulkan.CrossFrameBufferScenario.IndexBufferSubData", "DirectVulkan.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectVulkan.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -3963,6 +3973,7 @@ "names": [ "DirectGLES.AdvertisedLimitsScenario.EveryBufferLimitIsWithinItsAdvertisedRange", "DirectGLES.AdvertisedLimitsScenario.IndexedBufferBindingsAreReportedVerbatimOnBothWidths", + "DirectGLES.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -3982,6 +3993,7 @@ "DirectGLES.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectGLES.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectGLES.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectGLES.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -4138,6 +4150,7 @@ "DirectGLES.Spawn.AdoptTier0.LargeArenaAdoptionScenario.SubDataAfterAnInFlightDrawReachesTheNextDraw", "DirectGLES.Spawn.AdoptTier0.LargeArenaAdoptionScenario.TheArenaLandsInTheTierItsLaneDeclares", "DirectGLES.Spawn.AdvertisedLimitsScenario.IndexedBufferBindingsAreReportedVerbatimOnBothWidths", + "DirectGLES.Spawn.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Spawn.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Spawn.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Spawn.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -4159,6 +4172,7 @@ "DirectGLES.Spawn.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", "DirectGLES.Spawn.CpuMipRefused.GenerateMipmapServerScenario.Rgb16fDrawnBaseWithARefusedReadbackDeclinesByName", "DirectGLES.Spawn.CpuMipRefused.GenerateMipmapServerScenario.Rgb16fUploadedBaseWithARefusedReadbackIsFilteredFromTheStore", + "DirectGLES.Spawn.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.Spawn.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.Spawn.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.Spawn.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -4308,6 +4322,7 @@ "DirectGLES.Split.AdoptTier0.LargeArenaAdoptionScenario.SubDataAfterAnInFlightDrawReachesTheNextDraw", "DirectGLES.Split.AdoptTier0.LargeArenaAdoptionScenario.TheArenaLandsInTheTierItsLaneDeclares", "DirectGLES.Split.AdvertisedLimitsScenario.IndexedBufferBindingsAreReportedVerbatimOnBothWidths", + "DirectGLES.Split.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Split.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Split.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Split.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -4329,6 +4344,7 @@ "DirectGLES.Split.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", "DirectGLES.Split.CpuMipRefused.GenerateMipmapServerScenario.Rgb16fDrawnBaseWithARefusedReadbackDeclinesByName", "DirectGLES.Split.CpuMipRefused.GenerateMipmapServerScenario.Rgb16fUploadedBaseWithARefusedReadbackIsFilteredFromTheStore", + "DirectGLES.Split.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.Split.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.Split.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.Split.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -4501,6 +4517,7 @@ "DirectGLES.Tcp.AdoptTier0.LargeArenaAdoptionScenario.SubDataAfterAnInFlightDrawReachesTheNextDraw", "DirectGLES.Tcp.AdoptTier0.LargeArenaAdoptionScenario.TheArenaLandsInTheTierItsLaneDeclares", "DirectGLES.Tcp.AdvertisedLimitsScenario.IndexedBufferBindingsAreReportedVerbatimOnBothWidths", + "DirectGLES.Tcp.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Tcp.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Tcp.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Tcp.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -4520,6 +4537,7 @@ "DirectGLES.Tcp.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectGLES.Tcp.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectGLES.Tcp.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectGLES.Tcp.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.Tcp.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.Tcp.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.Tcp.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -4677,6 +4695,7 @@ "DirectVulkan.AdvertisedLimitsScenario.EveryBufferLimitIsWithinItsAdvertisedRange", "DirectVulkan.AdvertisedLimitsScenario.IndexedBufferBindingsAreReportedVerbatimOnBothWidths", "DirectVulkan.ArenaArm.LargeArenaAdoptionScenario.TheArenaLandsInTheTierItsLaneDeclares", + "DirectVulkan.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectVulkan.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectVulkan.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectVulkan.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -4696,6 +4715,7 @@ "DirectVulkan.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectVulkan.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectVulkan.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectVulkan.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectVulkan.CrossFrameBufferScenario.IndexBufferSubData", "DirectVulkan.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectVulkan.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -5412,6 +5432,7 @@ "DirectGLES.Split.AsyncOn.AsyncCompileScenario.CompletionStatusPollingThenForcedJoin", "DirectGLES.Split.AsyncOn.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectGLES.Split.AsyncOn.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectGLES.Split.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Split.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Split.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Split.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -5463,6 +5484,7 @@ "DirectGLES.Split.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectGLES.Split.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectGLES.Split.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectGLES.Split.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.Split.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.Split.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.Split.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -5987,6 +6009,7 @@ "DirectGLES.Split.StreamedArenaScenario.StreamedIndexDataSurvivesArenaRecycling", "DirectGLES.Split.StreamedArenaScenario.StreamedVertexDataSurvivesArenaRecycling", "DirectGLES.Split.StrictArming.TriangleScenario.TheServerStampedAVerbBoundaryOnThisDrawingFrame", + "DirectGLES.Split.StrictProgramArm.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Split.StrictProgramArm.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Split.StrictProgramArm.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Split.StrictProgramArm.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -6151,6 +6174,7 @@ "DirectVulkan.Split.Band.BandedReadbackScenario.GetTexImageLargerThanAReplySlotIsWindowed", "DirectVulkan.Split.Band.BandedReadbackScenario.RenderbufferReadOfExactlyTwoMiBIsBandedNotRefused", "DirectVulkan.Split.Band.BandedReadbackScenario.TwoMiBPlusOneRowIsBanded", + "DirectVulkan.Split.Buffers.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectVulkan.Split.Buffers.CrossFrameBufferScenario.IndexBufferSubData", "DirectVulkan.Split.Buffers.CrossFrameBufferScenario.IndexOrphanAndReupload", "DirectVulkan.Split.Buffers.CrossFrameBufferScenario.VertexBufferSubData", @@ -6415,6 +6439,7 @@ "junit-integration-split-strict/magma-buffers": { "skipped": [], "names": [ + "DirectVulkan.Split.Buffers.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectVulkan.Split.Buffers.CrossFrameBufferScenario.IndexBufferSubData", "DirectVulkan.Split.Buffers.CrossFrameBufferScenario.IndexOrphanAndReupload", "DirectVulkan.Split.Buffers.CrossFrameBufferScenario.VertexBufferSubData", @@ -6447,6 +6472,7 @@ "junit-integration-split-strict/magma-buffers-spawn": { "skipped": [], "names": [ + "DirectVulkan.Spawn.Buffers.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectVulkan.Spawn.Buffers.CrossFrameBufferScenario.IndexBufferSubData", "DirectVulkan.Spawn.Buffers.CrossFrameBufferScenario.IndexOrphanAndReupload", "DirectVulkan.Spawn.Buffers.CrossFrameBufferScenario.VertexBufferSubData", @@ -6479,6 +6505,7 @@ "junit-integration-split-strict/magma-buffers-tcp": { "skipped": [], "names": [ + "DirectVulkan.Tcp.Buffers.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectVulkan.Tcp.Buffers.CrossFrameBufferScenario.IndexBufferSubData", "DirectVulkan.Tcp.Buffers.CrossFrameBufferScenario.IndexOrphanAndReupload", "DirectVulkan.Tcp.Buffers.CrossFrameBufferScenario.VertexBufferSubData", @@ -6632,6 +6659,7 @@ "DirectGLES.Split.AsyncOn.AsyncCompileScenario.CompletionStatusPollingThenForcedJoin", "DirectGLES.Split.AsyncOn.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectGLES.Split.AsyncOn.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectGLES.Split.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Split.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Split.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Split.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -6683,6 +6711,7 @@ "DirectGLES.Split.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectGLES.Split.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectGLES.Split.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectGLES.Split.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.Split.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.Split.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.Split.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -7207,6 +7236,7 @@ "DirectGLES.Split.StreamedArenaScenario.StreamedIndexDataSurvivesArenaRecycling", "DirectGLES.Split.StreamedArenaScenario.StreamedVertexDataSurvivesArenaRecycling", "DirectGLES.Split.StrictArming.TriangleScenario.TheServerStampedAVerbBoundaryOnThisDrawingFrame", + "DirectGLES.Split.StrictProgramArm.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Split.StrictProgramArm.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Split.StrictProgramArm.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Split.StrictProgramArm.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -10992,6 +11022,7 @@ "DirectGLES.Split.AsyncOn.AsyncCompileScenario.CompletionStatusPollingThenForcedJoin", "DirectGLES.Split.AsyncOn.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectGLES.Split.AsyncOn.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectGLES.Split.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Split.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Split.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Split.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -11043,6 +11074,7 @@ "DirectGLES.Split.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectGLES.Split.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectGLES.Split.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectGLES.Split.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.Split.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.Split.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.Split.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -11567,6 +11599,7 @@ "DirectGLES.Split.StreamedArenaScenario.StreamedIndexDataSurvivesArenaRecycling", "DirectGLES.Split.StreamedArenaScenario.StreamedVertexDataSurvivesArenaRecycling", "DirectGLES.Split.StrictArming.TriangleScenario.TheServerStampedAVerbBoundaryOnThisDrawingFrame", + "DirectGLES.Split.StrictProgramArm.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Split.StrictProgramArm.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Split.StrictProgramArm.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Split.StrictProgramArm.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -11747,6 +11780,7 @@ "DirectGLES.Spawn.AsyncOn.AsyncCompileScenario.CompletionStatusPollingThenForcedJoin", "DirectGLES.Spawn.AsyncOn.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectGLES.Spawn.AsyncOn.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectGLES.Spawn.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Spawn.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Spawn.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Spawn.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -11798,6 +11832,7 @@ "DirectGLES.Spawn.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectGLES.Spawn.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectGLES.Spawn.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectGLES.Spawn.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.Spawn.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.Spawn.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.Spawn.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -12439,6 +12474,7 @@ "DirectGLES.Tcp.AsyncOn.AsyncCompileScenario.CompletionStatusPollingThenForcedJoin", "DirectGLES.Tcp.AsyncOn.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectGLES.Tcp.AsyncOn.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectGLES.Tcp.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Tcp.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Tcp.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Tcp.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -12490,6 +12526,7 @@ "DirectGLES.Tcp.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectGLES.Tcp.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectGLES.Tcp.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectGLES.Tcp.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.Tcp.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.Tcp.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.Tcp.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -13266,6 +13303,7 @@ "DirectGLES.VerifySplit.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectGLES.VerifySplit.AsyncCompileScenario.IrisShapedTwoPhaseBatchRendersCorrectly", "DirectGLES.VerifySplit.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectGLES.VerifySplit.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.VerifySplit.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.VerifySplit.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.VerifySplit.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -13317,6 +13355,7 @@ "DirectGLES.VerifySplit.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectGLES.VerifySplit.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectGLES.VerifySplit.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectGLES.VerifySplit.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.VerifySplit.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.VerifySplit.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.VerifySplit.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -13947,6 +13986,7 @@ "DirectVulkan.VerifySplit.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectVulkan.VerifySplit.AsyncCompileScenario.IrisShapedTwoPhaseBatchRendersCorrectly", "DirectVulkan.VerifySplit.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectVulkan.VerifySplit.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectVulkan.VerifySplit.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectVulkan.VerifySplit.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectVulkan.VerifySplit.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -13998,6 +14038,7 @@ "DirectVulkan.VerifySplit.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectVulkan.VerifySplit.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectVulkan.VerifySplit.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectVulkan.VerifySplit.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectVulkan.VerifySplit.CrossFrameBufferScenario.IndexBufferSubData", "DirectVulkan.VerifySplit.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectVulkan.VerifySplit.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -16887,6 +16928,7 @@ "DirectGLES.Verify.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectGLES.Verify.AsyncCompileScenario.IrisShapedTwoPhaseBatchRendersCorrectly", "DirectGLES.Verify.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectGLES.Verify.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectGLES.Verify.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectGLES.Verify.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectGLES.Verify.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -16938,6 +16980,7 @@ "DirectGLES.Verify.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectGLES.Verify.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectGLES.Verify.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectGLES.Verify.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectGLES.Verify.CrossFrameBufferScenario.IndexBufferSubData", "DirectGLES.Verify.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectGLES.Verify.CrossFrameBufferScenario.IndexMapWriteUnmap", @@ -17519,6 +17562,7 @@ "DirectVulkan.Verify.AsyncCompileScenario.ExtensionStringMatchesTheConfiguration", "DirectVulkan.Verify.AsyncCompileScenario.IrisShapedTwoPhaseBatchRendersCorrectly", "DirectVulkan.Verify.AsyncCompileScenario.ZeroCompilerThreadsSettlesEverythingImmediately", + "DirectVulkan.Verify.AtomicCounterScenario.APartialSubDataBetweenDispatchesKeepsTheShaderWrittenNeighbour", "DirectVulkan.Verify.AtomicCounterScenario.CountersAccumulateAcrossDispatchesAndFollowAReseed", "DirectVulkan.Verify.AtomicCounterScenario.DispatchIncrementsTheBoundCounterBuffers", "DirectVulkan.Verify.AtomicCounterScenario.SubDataAfterDispatchSurvivesAnImmediateReadback", @@ -17570,6 +17614,7 @@ "DirectVulkan.Verify.CopyImageStoreReadbackScenario.APartialUploadAfterTheCopyKeepsTheCopiedWindow", "DirectVulkan.Verify.CopyImageStoreReadbackScenario.ARenderbufferSourceLandsInTheTexture", "DirectVulkan.Verify.CopyImageStoreReadbackScenario.AnUploadedLevelReadsBackExactly", + "DirectVulkan.Verify.CrossFrameBufferScenario.APartialSubDataBetweenTwoDrawsOfOneFrameKeepsTheFirstDrawsBytes", "DirectVulkan.Verify.CrossFrameBufferScenario.IndexBufferSubData", "DirectVulkan.Verify.CrossFrameBufferScenario.IndexCopyBufferSubData", "DirectVulkan.Verify.CrossFrameBufferScenario.IndexMapWriteUnmap",