swung0x48
771e8e06a1
[Fix] (Pipe, State): take the texture and framebuffer families through the contract own birth hooks, wire the texture subsystem bit, hand the applier the region tail it was promised and clear a level dirty flag only where the record was accepted
2026-09-08 16:52:11 -04:00
swung0x48
2d2090cf1c
[Feat, Test] (Pipe): wire the framebuffer subsystem bit and pin the resolved read surface, the sticky bind mask, the level-shadow strides and the union-box/region-list invariant
2026-09-08 16:52:11 -04:00
swung0x48
a11a5eb2af
[Feat] (Pipe): push the bound framebuffers with a resolved read surface, inline attachment formats and a content hash that covers the draw-buffer array
2026-09-08 16:52:10 -04:00
swung0x48
612dbac44f
[Feat] (Pipe, State): mint a {slot, gen} handle for every texture and renderbuffer and publish its create, respecify, parameters and accumulated sub-data as pipe calls
2026-09-08 16:52:10 -04:00
swung0x48
92dffb81b4
[Test] (Pipe): drive the sampler cache's two unaccountable-release counters - a handle it never handed out and a second release of a reference only one holder owed
2026-09-08 15:57:24 -04:00
swung0x48
79b581984b
[Fix, Test] (Pipe): read a forked refusal drive's log from the offset it had instead of unlinking the file - once a case initialises the library the log is already open, so the child was writing into a deleted inode and the parent read nothing
2026-09-08 15:41:13 -04:00
swung0x48
d6e52f75c3
[Fix] (Pipe): count the sampler cache's unaccountable releases and its referenced evictions rather than asserting them, and state what a shared reference count, an over-capacity cache and the per-unit reconciliation really cost
2026-09-08 15:33:42 -04:00
swung0x48
ac09e5b37a
[Fix] (Pipe): key the composite resolver's memo on the context as well as the pipeline's GL name - the resolver is a process singleton while GL names are per context, so a make-current released the other context's live composite
2026-09-08 15:33:42 -04:00
swung0x48
820d1a60b9
[Fix] (Pipe): stop a make-current disarming the composite resolver's release path - the memo's freshness and the slot's release obligation were one flag, so after the first Reset no signature move ever spoke a delete
2026-09-08 15:24:22 -04:00
swung0x48
f0f8cab682
[Fix] (Pipe): give the program family its birth-hook entry point and publication latch, invalidate the global-constants key whenever a create_shader_state is re-issued, and count a truncated module tail instead of asserting it
2026-09-08 15:24:22 -04:00
swung0x48
b2edca2728
[Fix] (Pipe): give the sampler family the birth-hook entry points the contract declares, take the publication latch where its creates go out, and reference-count cache entries so an LRU eviction can never take a handle a standing record still names
2026-09-08 15:24:22 -04:00
swung0x48
ccde29064a
[Test] (Pipe): wire the sampler and program subsystems and pin the padding-proof CSO identity, the program-resolved unit sets, the linked-snapshot stage mask and the composite band's single release
2026-09-08 15:24:22 -04:00
swung0x48
bc2aad2176
[Feat] (Pipe): resolve a program pipeline into one shader CSO out of the reserved composite band and release it exactly once
2026-09-08 15:20:36 -04:00
swung0x48
5a3e9f0857
[Feat] (Pipe): publish a program's per-stage SPIR-V and reflection archive as a shader CSO and its default uniform block as global constants
2026-09-08 15:20:36 -04:00
swung0x48
1534cf3784
[Feat] (Pipe): content-address sampler states, mint one sampler view per texture and push the three unit sets behind their own content hashes
2026-09-08 15:20:36 -04:00
swung0x48
712c946744
[Fix] (Pipe): retire wire's local Named constant now that the contract mints MGPipeFramebufferTarget::Named
2026-09-08 15:08:22 -04:00
swung0x48
8f1eaafa79
[Test] (Pipe): pin what a Named framebuffer record does and does not move, the stale-generation refusal on the per-object table, the two handles it will not store, and that a respecify which redefines no storage carries the mask without eating the texels
2026-09-08 15:07:23 -04:00
swung0x48
08922b6f78
[Fix] (Pipe): read a sub-data record's target halves through the contract's own accessors, answer the emitter whether a create or a respecify was accepted, and apply a respecify that restates the stored storage as a metadata update rather than a redefinition
2026-09-08 15:07:23 -04:00
swung0x48
711d5c61ba
[Feat] (Pipe): key the framebuffer record by the framebuffer handle and resolve the two bindings through it, so a framebuffer that is named but bound to neither can still be described
2026-09-08 15:07:23 -04:00
swung0x48
5ab90dec24
[Test] (Pipe): pin a respecify's per-level scope, the sub-data acceptance signal, the upload targets that name no texture and what a release of the object records clears
2026-09-08 15:07:23 -04:00
swung0x48
4299acd9c1
[Docs] (Pipe): correct the refusal counter's family list - set_framebuffer_state resolves no record and can only fault - and warn that a texture's built-in sampler handle may outlive its CSO
2026-09-08 15:07:23 -04:00
swung0x48
953d73f111
[Fix] (Pipe): give unmap_persistent's kind check the verdict resource_destroy's has, and say why the other three buffer-only calls have nothing to check
2026-09-08 15:07:23 -04:00
swung0x48
d01439d846
[Fix] (Pipe): release the framebuffer records and the three unit windows with the object records whose handles they hold
2026-09-08 15:07:23 -04:00
swung0x48
c9958075e8
[Fix] (Pipe): scope a respecify's pending-upload clear to the level it redefines, answer the emitter whether a sub-data record was accepted, and refuse a resource target that names no texture
2026-09-08 15:07:23 -04:00
swung0x48
ae1a1c503f
[Test] (Pipe): pin every P4a record's lifecycle, its bounds gate and what a make-current does and does not clear
2026-09-08 15:07:23 -04:00
swung0x48
a02f1571f5
[Feat] (Pipe): apply the shader CSO's artefacts and the default uniform block without ever re-linking on the server
2026-09-08 15:07:23 -04:00
swung0x48
dca3eb868e
[Feat] (Pipe): apply sampler states, sampler views and the three unit sets into the server's own working state
2026-09-08 15:07:23 -04:00
swung0x48
7408bad9fd
[Feat] (Pipe): apply the framebuffer record per bound target and the texture and renderbuffer resource calls into their own slot-indexed records
2026-09-08 15:07:23 -04:00
swung0x48
e8502a6100
[Fix] (Pipe): key the framebuffer record to the object it names - a fourth Target value for every DSA entry point that hands a framebuffer over by name, and the metadata-only respecify the sticky bind mask needs
2026-09-08 14:50:30 -04:00
swung0x48
9ea44389e7
[Fix, Test] (Pipe): widen the two shutters that cannot see their own subject rather than gate their emitters on a second bit - glBindSampler moves only bit 12's generation, and GetCurrentProgram() is null for the whole life of a bound separable pipeline, so bind_sampler_states and the entire program family under-fired
2026-09-08 14:30:03 -04:00
swung0x48
17db759891
[Fix] (Pipe): state the four seam encodings the packages were each inventing - the sub-data target packing, the depth-stencil aspect numbers, the surface kind constants and the texture target the surface record grew where its padding was
2026-09-08 13:51:39 -04:00
swung0x48
2cb44039b5
[Fix] (Pipe): stop the include-closure gate going green on a compiler it could not find or on a probe count nobody asked for
2026-09-08 13:13:21 -04:00
swung0x48
32033d6993
[Fix] (Pipe): land the birth half of the P4a client API behind a publication latch both halves read, gate every emitter on its family's wired constant, raise the sampler view's death notice and count the shader composite band apart from the ordinary slots
2026-09-08 13:13:21 -04:00
swung0x48
08192d7266
[Feat] (Pipe): land the P4a contract - the resource target enum, the framebuffer target byte, the texture params' builtin sampler, the sampler-parameter field table, four subsystem bits, seven dirty arms and the program archive codec
2026-09-08 12:18:29 -04:00
swung0x48
37da3c3a07
[Docs] (Disaggregated): record the P3a landing - the five-part gate on the finished tree, the three seam defects the real-path round found, the Track H census, the two-device three-arm A/B on Release APKs (pull / P2-only 0x7f / P3a) with the P2 -O0 erratum, DriverBench T1/T2 against the 0x7f arm, the exit-order UAF closure, and the rulings (ID-13/15/17)
2026-09-08 10:23:59 -04:00
swung0x48
fde5fda3b5
[Fix] (MG_Impl): never destroy the four remaining MGPipe singletons - the vertex-input emitter is on ~VertexArrayObject own death path since C-1 and answered RecordIsPublished out of a freed latch vector
2026-09-08 08:20:55 -04:00
swung0x48
6515c8e6ae
[Fix] (MG_Backend, MG_Impl): give the MGPipe input blocks leak-at-exit storage - gPipeInputs and the two verify blocks held the last SharedPtr to a deleted-but-bound vertex array, so __run_exit_handlers ran ~VertexArrayObject and ~BufferObject into a pipe and a backend that were already torn down
2026-09-08 08:20:55 -04:00
swung0x48
c20e2f2b67
[Fix] (scripts): attribute G7 trip over the failing assertion BLOCKS - gtest prints the field name among the compared expressions, so a per-line match calls a real trip inconclusive
2026-09-08 07:21:19 -04:00
swung0x48
680ea63360
[Test] (MG_IntegrationTest): baseline the CSO slot leak case after two warm-up rounds so it measures growth with the churn, not the first draws one-off slots
2026-09-08 07:09:25 -04:00
swung0x48
959ca30810
[Test] (MG_Test): declare the new respecify-repair case in ResourceEmitTest pull-skip list so the pull and push ctest name sets stay identical (G2)
2026-09-08 07:09:25 -04:00
swung0x48
0bff6875b3
[Fix] (MG_Impl, DirectGLES, scripts): take the cheap review minors - the stale validate-point comment, G7's whole-log trip grep and missing INT/TERM traps, G5's CRLF stdout, and the dangling-twin invariant at its member
2026-09-08 07:04:20 -04:00
swung0x48
707bced438
[Fix] (MG_Impl, MG_Pipe, MG_IntegrationTest): close the four cross-package rows nobody claimed - symmetric vertex-input pairing asserts, the counter G10 reads, and the buffer ABA's Magma-only evidence
2026-09-08 07:04:19 -04:00
swung0x48
83c8101a9b
[Fix] (DirectGLES): record the fp64 narrowing's dropped SyncGpuWrites as a ruled P3a deviation at the site, with its blast radius
2026-09-08 07:00:28 -04:00
swung0x48
2a5e0195b8
[Fix] (DirectGLES): stop on an armless P3a subsystem verdict now that every LEGACY_MEMOS=0 lane pins an explicit 0x1ff arm - warning and continuing drew through an unconfigured driver VAO
2026-09-08 07:00:28 -04:00
swung0x48
afda613bd9
[Fix] (DirectGLES): publish GLESBufferResource::hostBytes under pendingMutex - it was the one member the off-thread SubData/FlushRange arm wrote with neither a lock nor an atomic
2026-09-08 07:00:28 -04:00
swung0x48
433f51a065
[Fix] (MG_Impl, MG_Test): publish the create a respecify's handle never got - a buffer born while the resource op table was unregistered had every later respecify refused and drew through id 0 with no diagnostic
2026-09-08 07:00:06 -04:00
swung0x48
9ba5d7ba1e
[CI] (scripts, test.yml, DirectGLES): hash FlushPendingRangesFrom as G5's eleventh row - a push build compiles no FlushPendingRangesNow, so the tenth row protected text the shipping build never sees
2026-09-08 06:54:25 -04:00
swung0x48
f0beefa85c
[Test] (MG_Test, MG_IntegrationTest): assert a destroyed vertex array returns its CSO slot, on the client allocator and on the DirectVulkan lane where it leaked
2026-09-08 06:49:59 -04:00
swung0x48
78ff014547
[Fix] (MG_Impl, MG_State, DirectGLES): give the vertex-elements CSO a backend-neutral death path - the client minted every VAO's slot and only Espryt ever freed one, so under Magma each VAO leaked a slot and a 1.3 KB applier record for the life of the process
2026-09-08 06:49:59 -04:00
swung0x48
3e298c9ad1
[CI] (Pipe): add FlushPendingRangesNow's three-tier drain to G5's byte-identical set
2026-09-08 06:02:36 -04:00
swung0x48
fd6b5bdbf2
[Fix] (Pipe): restore and rebuild on every exit path of the vertex-input negative control, and keep its logs out of the repository
2026-09-08 06:02:36 -04:00
swung0x48
8d3cd67b94
[CI] (Pipe): select the P3a subsystem and map-persistent lanes in the only job that unpacks a push build
2026-09-08 06:02:36 -04:00
swung0x48
f6c7dcd1b6
[Fix] (Pipe): raise the four CSO stats lanes to the P3a subsystem mask so they stop asserting on a configuration nothing ships
2026-09-08 06:02:36 -04:00
swung0x48
4ad88214cd
[Test] (Pipe): count the map-persistent round trips over a re-specified adopted arena in both arms, now that the VAO rebind fix is in the branch
2026-09-08 06:02:36 -04:00
swung0x48
4412cef00c
[CI] (Pipe): gate that the buffer pool, the deferred-release drain and the three rings did not move
2026-09-08 06:02:36 -04:00
swung0x48
6e9943b36e
[Test] (Pipe): assert a regrown adopted store costs one map-persistent round trip per storage definition, not one per draw
2026-09-08 06:02:36 -04:00
swung0x48
0cb46fe2bd
[Test] (Pipe): reproduce the buffer handle ABA through public GL and prove the pre-rekey guards are what stops it
2026-09-08 06:02:36 -04:00
swung0x48
83302ca247
[Test] (MG_Test): scope the pipe resource op table in BufferTest's fixture the way it scopes BufferBackendOps - a push build installs both at bring-up, and these 86 cases are the BufferBackendOps arm's
2026-09-08 06:00:46 -04:00
swung0x48
3c55e02797
[Fix] (Espryt): republish the live shadow base on the ensure path so a lazily twinned store is not left with none for the readers that hold no frontend object
2026-09-08 05:27:19 -04:00
swung0x48
75ea7ee2df
[Fix] (Espryt): ask the frontend object whether the shadow the ensure path is about to upload holds bytes, instead of a descriptor no content call refreshes
2026-09-08 05:27:03 -04:00
swung0x48
13b380feda
[Fix] (Espryt): resolve an attribute's pushed vertex buffer by its attribute index, not by the GL binding point the wire attribute carries
2026-09-08 05:26:48 -04:00
swung0x48
ed83424c75
[Fix, Test] (Espryt): pin that a live host map keeps the handle arm's draw probe dirty and that a backwards generation is refused
2026-09-08 04:52:15 -04:00
swung0x48
df055eab13
[Fix] (Espryt): treat an unbound vertex-elements record as a memo miss and record the applier-reset serial rule the twin's gate depends on
2026-09-08 04:52:15 -04:00
swung0x48
511b3752c0
[Fix] (Espryt): make the vertex-input bit require the resource bit and give both new subsystems a named verdict when the knobs leave no arm
2026-09-08 04:52:15 -04:00
swung0x48
b28058f37c
[Fix] (Espryt): walk all 32 attribute slots so a vertex-elements record that shrinks still disables the arrays it dropped
2026-09-08 04:52:15 -04:00
swung0x48
14137bc9a6
[Fix] (Espryt): refuse a backwards generation and an out-of-range slot in the handle-keyed GetOrCreate instead of adopting them
2026-09-08 04:52:15 -04:00
swung0x48
39933613ae
[Fix] (Espryt): re-read the client's shadow base at every use and forget it at the two events that free the allocation it names
2026-09-08 04:52:15 -04:00
swung0x48
816373ffd9
[Fix] (Espryt): keep the live-map question in the handle arm's draw-clean probe instead of a record field P3a pins false
2026-09-08 04:52:15 -04:00
swung0x48
7047331a41
[Fix] (Espryt): clamp the handle readback to the backend store past its offset, memoise the buffer handle lookup, and write down the two contracts the ops owed their callers
2026-09-08 04:52:15 -04:00
swung0x48
7ef8cb93fc
[Fix] (Espryt): leave FlushPendingRangesNow as this file's only definition and call the one shared range ladder from both arms
2026-09-08 04:52:15 -04:00
swung0x48
b97a228cea
[Fix] (Espryt): carry the adopted-store respecify's buffer-id generation bump into the handle arm as well
2026-09-08 04:52:15 -04:00
swung0x48
3840cf734b
[Test] (Espryt): extend the slot-table suite to the buffer kind and pin that its death crosses as resource_destroy
2026-09-08 04:52:15 -04:00
swung0x48
68db6db7f8
[Refactor] (Espryt): key the narrowed fp64 vertex stream on the buffer's handle instead of its lifetime id
2026-09-08 04:52:15 -04:00
swung0x48
cd05de504e
[Refactor] (Espryt): drive the driver VAO from the pushed vertex-elements record and retire the wrapping index-slot version and its identity patch
2026-09-08 04:52:15 -04:00
swung0x48
ce24e2a734
[Refactor] (Espryt): answer a readback through the reverse channel and bump the mutation epoch after it, never before
2026-09-08 04:52:15 -04:00
swung0x48
4e44650199
[Refactor] (Espryt): take the buffer ops by handle and payload instead of by frontend object reference
2026-09-08 04:52:15 -04:00
swung0x48
9951961d9c
[Refactor] (Espryt): give the buffer resource its own {slot, gen} table instead of hanging it off the frontend object
2026-09-08 04:52:15 -04:00
swung0x48
31e370bed5
[Test] (Pipe): pin the base instance across a make-current and both of the validate point's exits, the record surviving one, the draw-time bind mask, the create-destroy pairing latch, and the bind-mask table against literals
2026-09-08 04:47:51 -04:00
swung0x48
0c55560510
[Fix] (Pipe, State): look the resource handle up on the content paths instead of minting it, publish the bind mask from the two draw-time emitters, pair the destroy with the create's own latch, and state the record-lifetime rule the applier now holds
2026-09-08 04:47:51 -04:00
swung0x48
f11e78b0a4
[Feat] (Pipe, GLImpl): set the pending base instance from the three glDraw*BaseInstance entry points, through a pull-safe macro beside MGP_FILL
2026-09-08 04:47:51 -04:00
swung0x48
d9bde13127
[Fix] (Pipe): stop the tracker's context Reset eating the pending base instance the same call is about to read, and clear it on the validate point's no-context exit too
2026-09-08 04:47:51 -04:00
swung0x48
cc427ec4de
[Test] (Pipe): pin the buffer and vertex-input emitters - every attribute field survives the wire, a bare baseInstance change still emits, and the index-buffer bit ignores unrelated writes
2026-09-08 04:47:51 -04:00
swung0x48
b11bb9650a
[Feat] (Pipe): widen the dirty-surface scan to MG_State so the MGP_NOTE_MUTATION sites stop being outside the gate
2026-09-08 04:47:51 -04:00
swung0x48
14efd6eb24
[Feat] (Pipe): push the bound VAO's format, its vertex buffers with an explicit baseInstance, and its index binding as their own calls
2026-09-08 04:47:51 -04:00
swung0x48
874d1ee77d
[Feat] (Pipe, State): mint a {slot, gen} handle for every buffer object and publish its create, respecify, sub-data, flush, readback and destroy as pipe calls
2026-09-08 04:47:51 -04:00
swung0x48
b9eaa47480
[Build] (Config): bump CoreVersion to 26.9 so GL_VERSION, the POST stamp and the Magma pipeline-cache key follow the 26.09 plugin version
2026-09-08 04:42:02 -04:00
swung0x48
42d43af25b
[Build] (Android): bump the plugin version to 26.09 - versionCode 26090000 + this month's revision count, versionName 26.09.<hash>
2026-09-08 04:41:03 -04:00
swung0x48
12e6bfcf14
[Fix, Test] (Pipe): a make-current is not a teardown - the applier keeps its object records across one, counts every call refused on a record it does not have, advances the two vertex-input serials instead of restarting them at 0, and bounds the slot it grows a record table on
2026-09-08 03:51:21 -04:00
swung0x48
e6452ce948
[Fix] (Pipe): give both blob-carrying record families one Blob rule, and name the wire views the vertex-elements blob actually carries
2026-09-08 03:51:21 -04:00
swung0x48
56366331dc
[Fix] (Pipe): account for DispatchIndirect and Query in Coverage.def's target-by-target split, re-sort the new emitted row, and name the P3a default mask in ConfigLoader's include comment
2026-09-08 03:51:21 -04:00
swung0x48
355c60b901
[Test] (Pipe): pin the resource record's lifecycle and the buffer sub-data range encoding at both of its bounds
2026-09-08 03:51:21 -04:00
swung0x48
6eb0e675ad
[Feat] (Pipe): apply vertex elements, vertex buffers and the index buffer into the server's own working state
2026-09-08 03:51:21 -04:00
swung0x48
45c8f1a8be
[Feat] (Pipe): apply the resource calls into a per-context slot-indexed record and dispatch them to the backend by handle
2026-09-08 03:51:21 -04:00
swung0x48
5cb826b01e
[Merge] (dev): bring dev@9eae9858 into feat/disaggregated - the adopted-store respecify VAO rebind fix ( d7655247) and the persistent-buffer ordering POST probe
2026-09-08 03:15:31 -04:00
swung0x48
e01c0ccc53
[Feat] (Pipe): land the P3a contract - the handle-shaped resource op table, the applier's resource and vertex-elements records, the two vertex wire views, an explicit baseInstance on set_vertex_buffers, and the first kNeedsAck
2026-09-08 02:43:19 -04:00
swung0x48
c036900d72
[Docs] (Disaggregated): add the Oppo Mali half of the P2 paired A/B - 16 rows per device, Espryt +8-18% and Magma +10-11% per-thread CPU over the pull baseline, plus the harness single-sample pidof kill recorded as a dev-side follow-up
2026-09-08 02:20:24 -04:00
swung0x48
44c2b5cf3a
[Docs] (Disaggregated): record the P2 landing - the five-part gate results, the two-device paired A/B protocol with all 16 Xiaomi rows, DriverBench T1/T2 with the CSO control, the push-side counters, and the 2026-09-08 rule that performance is recorded against the pull baseline rather than gated
2026-09-08 01:40:51 -04:00
swung0x48
738b289df8
[Fix] (Magma, MG_IntegrationTest): drop the fourth ABA-control consumer, which was unreachable, and the scenario comment its own body contradicts
...
- VulkanRenderer::LookupVaoDrawMemo's legacy arm read MG_Config::Features.PipeHandleAbaControl
a fourth time, bypassing the one-question accessor MagmaPipeAbaControlDefeatsIdentity that
55d2af9b's own message says all the control's sites go through. It could never be false
there: the control's early return fires ahead of BOTH arms, so a run that reaches the legacy
compare has the knob off. The compare is unconditional again, with a note saying where the
question is answered and to route through the accessor if that early return is ever narrowed
- which is the trap the dead line was, since narrowing it would have silently restored D18's
retired semantics at this one site.
- HandleRecycleScenario's vertex-array case still said "BOTH the VAO and the buffer are
recycled here so that a key built out of raw addresses matches", which the body has
contradicted since 55d2af9b : both buffers are created before the ABA window and neither is
deleted inside it, deliberately, so that no buffer traffic moves VkBufferManager's
slice-epoch counter inside the window. Only the VAO is recycled, and only its GL name - the
heap block is not handed back, which is why the knob rather than the allocator constructs the
AbaControl arms' collision.
2026-09-08 01:08:51 -04:00
swung0x48
a9778eaabe
[Fix, Test] (Magma, MG_Test): cover the {slot, gen} generation in a unit test that forces a real slot reuse, and stop claiming the ABA lanes do
...
- 55d2af9b claimed - in its message, in MagmaPipeArms.h, in VertexInputStateFactory.cpp and
in MG_IntegrationTest/CMakeLists.txt - that the AbaControlHandles lane defeats the
GENERATION in {slot, gen}. It does not, and no lane of that shape can. Magma's mint has no
death notification (nothing in MG_Backend/DirectVulkan consumes NotifyStateObjectDestroyed)
and returns a slot only through OnFrameBoundary's age sweep, kSweepInterval 256 /
kRetireAgeBoundaries 1024; HandleRecycleScenario issues five frame boundaries, so the
replacement VAO acquires against an empty free list and gets a BRAND-NEW slot at Gen 1
(measured: redVao slot=2 gen=1, greenVao slot=3 gen=1). The knob-off FRESH verdict there is
decided by the SLOT alone, and deleting ++m_entries[index].Gen leaves all 32 HandleRecycle
entries green - re-measured this round.
- What the lane does defeat is the object identity that SELECTS the slot, which IS the key the
handle arm ships, and that is what the three code sites now say. The two requirements are
mutually exclusive for the pixel-visible memo: a genuine slot reuse needs >= 1024 idle
boundaries after the dead object's last draw, which necessarily puts the two draws in
different frames, and ResolvedVertexBindings - the only memo carrying a GPU slice rather
than a layout - declines across frames by design.
- So the generation is covered where it IS expressible. MG_Test/Pipe/MagmaPipeIdentityTest.cpp
drives the mint's real retire -> reuse (1280 boundaries, with a keep-alive object holding the
first allocatable slot so the reuse is not the slot the control aliases onto) and asserts
four things: the retired slot comes back with Gen+1; with the knob OFF a memo stamped at
{slot, gen=N} is NOT served at {slot, gen=N+1}; with the knob ON it IS, out of one uncleared
and unclaimed entry; and a live object keeps its slot, its generation and its memo across two
sweeps, so the generation cannot be "fixed" by bumping it on every acquisition.
- The claim rule itself moves into MagmaPipeArms.h as MagmaPipeClaimSlotMemos so the suite
exercises production code rather than a copy of it. VertexInputStateFactory::MemosFor is now
one call to it and is otherwise unchanged, on both the knob-on and the knob-off path.
- Load-bearing, measured: with ++m_entries[index].Gen commented out, ctest -L unit in
build-push goes 1563/1566 - three of the four new cases red, one of them naming the inherited
0xDEAD payload out of the same slot - while ctest -R HandleRecycle stays 32/32. Restored, all
four pass in build-push and build-verify and skip visibly in the pull build, so the ctest name
sets stay identical (G2).
2026-09-08 01:08:51 -04:00
swung0x48
c73ae7d443
[Test] (MG_IntegrationTest): pin MOBILEGL_PIPE_PUSH in the handle-arm lanes
...
- an ENVIRONMENT property overrides only the variables it names, so the gate's all-pull control
arm (MOBILEGL_PIPE_PUSH=0 over the whole integration-gpu label) leaked into the Handles and
AbaControlHandles lanes, turned their LEGACY_MEMOS=0 into D14's armless combination and made
the bring-up abort by design; the lanes now pin the P2 default bitmask themselves
2026-09-08 00:40:47 -04:00