swung0x48
9c773182bb
[Feat] (MGPipe): land the interface skeleton - the complete call catalogue, the payload PODs and the seven generators
...
- Plan B section 4 makes the frontend/backend boundary explicit and gives the backend its
own state machine. This is the P0 deliverable of section 11: the whole catalogue exists
from day one, placeholders included, because the wire opcode is a call's position in
PipeCalls.def and record numbering must never churn.
- MG_Pipe/PipeCalls.def is the single source of truth: 68 unique calls as
X(Name, Payload, Class, Flags). Its header reconciles that number with the plan's
headline counts (section 4.4, appendix A), which double count - "CSO 15" names
bind_sampler_states and set_sampler_views that the "set_* 17" list also names, "screen
14" tabulates the query family that section 4.3 assigns to the context, and the
"transfer 12" row enumerates 11 calls. Each reconciliation is written down next to the
count rather than resolved silently.
- MGPipeHandles.h: the 8-byte {slot, gen} pair, dense per-kind slots, the reserved null
and default-framebuffer handles, and the ShaderCso composite band (sections 4.2, 5.6.3).
The two generations are documented as strictly separate, with the interface rule that no
call may require the client to know MGGen.
- MGPipeTypes.h: every payload of section 4.5 as a flat POD with explicit padding, a
trivial-copyability assertion and an exact sizeof assertion, because the wire records are
memcpy'd and a field silently changing width is a protocol break no test would see.
MGPCaps embeds DynamicBackendParameters by inclusion so a caps field added there needs no
second edit here; its assertion is stated as a composition because that struct still
carries SizeT. ResidualValueBlock is pinned at MGL_RESIDUAL_BLOCK_SIZE 1248, the ratchet
that only ever goes down and reaches static_assert(... == 0) in P13 (section 6.3).
- MGPipeHostSpan.h keeps the one shape that changes with the transport isolated behind one
predictable branch, with the kFromServerIndexMirror sentinel D-B7 needs.
- MGPipeCallbacks.h names the reverse channel as ten callbacks plus the forward terminator
in the context table, replacing 95 poke sites across 17 methods (section 7.1).
- scripts/gen_pipe.py runs G1-G7 off those .def files. G1 asserts each table is EXACTLY its
call count of function pointers; G3 pads every wire record to the stream's 8-byte
granularity and checks size >= sizeof && size <= remaining && size % 8 == 0 before
dispatch, fatally; G4 compares field by field (padding excluded, floats by bits) because
a comparator with false positives is one nobody reads - DirectGLES.cpp says the same
thing about its own memcmp of RenderStateParameters; G5 turns the accessor list into
per-verb poison generations rather than a written-once bitmap, which is the only version
that can see a field left over from the previous draw (section 6.2.2); G6 joins the 477
read points of the vendored backend_read_inventory.md against Coverage.def and reports
0 UNMAPPED (299 to a call, 167 signatures that become handle parameters, 6 reverse
channel, 5 client-resolved); G7 pins the pipeline subset BY MEMBER NAME from what
VulkanRenderer::ComputePipelineStateHash hashes today, computing no offsets in python.
- The generated files are committed so the build never depends on python; CI regenerates
and diffs them.
2026-09-05 20:16:49 -04:00
swung0x48
8349babe90
[Docs] (Disaggregated): consolidate into a single MGPipe plan and drop the replica plan
...
- docs/Disaggregated/PLAN.md is now the one plan: the MGPipe design with the transport, control-plane, present, threading, EGL/process, monolith/build chapters inlined as real chapters (7-13) instead of references, sections renumbered 0-17 + appendices, every internal citation updated
- the replica-GLContext plan and its review record are removed at the user's request; REVIEW.md is the MGPipe design-competition and adversarial-review record only, with the comparison verdicts dropped and the remaining finding text reworded to the new section numbers
- day-43 GO/NO-GO now names its two outcomes (continue / shrink to headless tooling or re-evaluate) without any rollback path
2026-09-05 14:06:24 -04:00
swung0x48
1794ac94b1
[Docs] (Disaggregated): land plan B - MGPipe, a gallium-style explicit frontend/backend interface with a backend-owned state machine (client-allocated {slot,gen} handles, CSOs keyed on the pipeline subset with dynamic state pushed separately, set_* catalogue derived from the twins the two backends already keep, per-verb validate with aggregate generations, reverse channel as ten named callbacks plus a pull terminator, strangler migration behind PipeInputs with per-verb poison and a field-wise verify harness, three purity gates replacing byte identity), the item-by-item comparison against the replica plan A (memory, copies, drift surface, monolith benefit vs 4x effort and 7x later first frame) with a day-43 GO/NO-GO hedge, and the round-2 design-competition and adversarial-review record; mark plan A as superseded except for its inherited transport sections
2026-09-05 13:05:43 -04:00
swung0x48
8b31de2f8d
[Docs] (Disaggregated): land the two-process split plan - server runs the unchanged backends against a replica GLContext driven by mutator replay, the client is the sole originator of every implicit-publish semantic (persistent-map push, MarkGpuWritten, texture dirty clear, XFB accounting, generated-mip allocation), SPSC shm ring with FlatBuffers structs on the hot path and tables on the control socket, two-way doorbells, present credit 1, spawn-only shipping build with an inproc CI variant, and a P0-P9 schedule gated on the existing unit/integration/retrace/CTS suites; plus the design-competition and adversarial-review record
2026-09-05 09:21:58 -04:00
swung0x48
50fb13430f
[Merge] (MG_State, ShaderTranspiler, tools/cts): land the write-map landing and open-ended fp64 storage block fixes that take KHR-Single-GL45.subgroups to 100% on Magma
2026-09-05 05:43:34 -04:00
swung0x48
d4f8adcf6d
[Tools, Test] (tools/cts, MG_Test): make the CTS runner's chunk timeout idle-based so a healthy 20-minute invocation is no longer killed and its in-flight case mis-recorded as a crash, and link MSVC test executables with /WHOLEARCHIVE so the dllimport gl* references in GetProcAddress.cpp resolve
2026-09-05 05:36:50 -04:00
swung0x48
795e08f7e6
[Fix, Test] (ShaderTranspiler): flatten fp64 storage blocks whose last member is a runtime array - the pass declined them, so the fp64 demotion re-derived ArrayStride 4 over the application's 8/16/32-byte double buffer and every double/dvecN data[] SSBO read raw words
2026-09-05 05:36:49 -04:00
swung0x48
1e7ecab4db
[Fix, Test] (MG_State, BufferObject): land a non-persistent write map's staged bytes into a GPU-resident store at unmap and explicit flush instead of dropping them - SSBO binding and large-store adoption make resident stores reachable through glMapBufferRange, so every per-draw re-initialisation was silently lost
2026-09-05 05:36:48 -04:00
swung0x48
81b17c0b75
[Test] (ShaderTranspiler, Integration): pin the five reworked shapes - the read-only capture stage through the real link, the seeded carrier's ESSL declaration, the metadata-driven block redeclaration and its decline, the control-stage-less evaluation decline, and a carrier clearing an i64vec4
2026-08-28 06:22:12 -04:00
swung0x48
d1edf765f5
[Fix] (Link, Async): carry the resolved gl_PointSize capture request into the SPIR-V handoff and let a deferred verdict name its own severity - the demotion read the request off a reflection slice phase A never fills it into, so its forced carrier was dead code, and its decline reason replayed at a level no shipped build keeps
2026-08-28 06:22:12 -04:00
swung0x48
97e07190ac
[Fix] (ShaderTranspiler): seed a forced point-size carrier nothing writes and decline a control stage whose live clip/cull distance would still print gl_PointSize - an ES front end deletes a never-written output, and SPIRV-Cross redeclares that block from member decorations rather than access
2026-08-28 06:22:11 -04:00
swung0x48
a4dcdf989e
[Fix] (ShaderTranspiler): stop the point-size carrier landing on a location a live varying owns, and decline the evaluation stage a synthesized pass-through control stage cannot feed - an i64vec4 counted as one location, and a located input carrier trips both backends' pass-through guard
2026-08-28 06:22:11 -04:00
swung0x48
1c113e4b26
[Fix] (ShaderTranspiler): count a 64-bit integer vector as two locations in the XFB flattener's LocationSpan - it read 64-bitness off the element's float type alone, so an i64vec3/4 member packed the members after it onto locations it already owns
2026-08-28 06:22:11 -04:00
swung0x48
bf9cfb3079
[Test] (Integration): PointSizeDemotionScenario - the demoted value chain is client-invisible in both configurations, with pinned per-backend lanes and a log-latch arming guard
2026-08-28 06:22:10 -04:00
swung0x48
e1818d497a
[Test] (ShaderTranspiler): pin the point-size demotion's shapes - capability stripped, carriers named and located past the program's varyings, byte-identical no-ops, whole-struct-copy decline, and the two new L1 key bits
2026-08-28 06:21:31 -04:00
swung0x48
d7f66722d1
[Fix] (ShaderTranspiler, Link, DirectGLES, DirectVulkan): demote tessellation/geometry gl_PointSize to an ordinary varying where the device cannot host the built-in - the value survives for gl_in reads and by-name capture, both backends' declines stay for shapes the pass refuses, and the verdict rides the L1 key
2026-08-28 06:21:30 -04:00
swung0x48
92dc41ebf9
[Test] (DirectVulkan, SelfTest): pin the probe's fence-timeout teardown against a fake driver, the never-worse arming refusal, and paused-span patch/instanced counting against an unpaused control
2026-08-28 06:19:41 -04:00
swung0x48
feea131d8b
[Fix] (DirectVulkan, SelfTest): honour the primitives-generated probe's leak-on-timeout contract in both of its callers, count paused-span draws the frontend cannot price, refuse a substitute measured worse than the stream query, and derive the POST row's failure clause from the measurement
2026-08-28 06:19:40 -04:00
swung0x48
19f4402fbf
[Test] (DirectVulkan): pin the primitives-generated probe's verdict and override mapping, and hold the reroute's GL answers and arming observable on the integration lane
2026-08-28 06:19:40 -04:00
swung0x48
1350031368
[Fix] (DirectVulkan): count GL_PRIMITIVES_GENERATED for transform-feedback-inactive draws - a bring-up probe measures the silent stream query and reroutes such draws through the dedicated primitives-generated query or a clipping-statistics pool, reported from the Vulkan POST
2026-08-28 06:19:39 -04:00
swung0x48
0ee3384b22
[Fix] (Espryt): land a SubData into an adopted store as a GPU-ordered copy - the in-place coherent write tore the frames still reading the old section bytes
2026-08-28 04:50:07 -04:00
swung0x48
ba3f8d6774
[Test] (Integration): pin the adopted mesh-arena store - cross-frame SubData visibility, readback identity, and the GPU-written readback
2026-08-28 04:19:11 -04:00
swung0x48
3327784fd0
[Fix] (Espryt): adopt mesh-arena-sized stores into coherent persistent maps at definition, and stop the flush tiers from re-synchronizing them
2026-08-28 04:19:11 -04:00
swung0x48
ff426da3a9
[Fix, Test] (MG_State, DirectVulkan): order host writes to an adopted store after recorded GPU work - a SubData issued after a dispatch landed in coherent memory before the deferred dispatch executed, so its increments overwrote the newer bytes; un-skip the DirectVulkan half of the SubData-after-dispatch scenario
2026-08-28 03:01:15 -04:00
swung0x48
08419a1fe6
[Chore] (Config): point the two stale comments at the renamed feature fields
2026-08-28 00:47:35 -04:00
swung0x48
5d51372c44
[Chore] (Config): triage backend-scoped env toggles under MOBILEGL_ESPRYT_ and MOBILEGL_MAGMA_ prefixes
2026-08-28 00:38:17 -04:00
swung0x48
7fd4550968
[Fix] (Espryt): copy before any FBO attach in the packed16 probe - attaching the array relayouts it to the plain order and was neutralizing the subject
2026-08-28 00:22:16 -04:00
swung0x48
971537058e
[Fix] (Espryt): probe every allocation recipe of the packed16 shape - the Mali layout heuristic inverts between contexts, so one recipe cannot speak for the storage
2026-08-28 00:22:16 -04:00
swung0x48
dd98c450ad
[Test] (SelfTest): model the params-before-upload escape so a params-first probe regression reads as a red test
2026-08-28 00:22:15 -04:00
swung0x48
5dbbbbd7eb
[Fix] (Espryt): allocate the packed16 probe's textures uploads-first, the order a minted backend texture performs and the one the Mali layout choice keys on
2026-08-28 00:22:15 -04:00
swung0x48
5d140a41ce
[Fix] (Espryt): re-arm the packed16 probe on the allocation-scoped mirror the device actually has and let any mirrored level trigger the widening
2026-08-28 00:22:15 -04:00
swung0x48
bf376b230f
[CI] (Integration): rerun the buffer scenarios with the map flush disabled so the upload-ring tier keeps coverage
2026-08-28 00:15:15 -04:00
swung0x48
29599dcf90
[Fix] (DirectGLES): flush queued buffer ranges through a range-invalidating map first, so a partial write into a busy store is priced by the range
2026-08-27 23:54:19 -04:00
swung0x48
734fab9f90
[Test] (Integration): scope the SubData-after-dispatch readback case to DirectGLES, naming the DirectVulkan upload-ordering gap it exposed
2026-08-27 23:04:52 -04:00
swung0x48
2cd1809c29
[Fix] (Review): rebuild the packed16 probe on the CTS's three-level chains and let the POST row answer for the widening knob actually in force
2026-08-27 22:46:13 -04:00
swung0x48
faed498476
[Test] (IntegrationTest): shield the packed16 renderbuffer clear from an inherited scissor
2026-08-27 22:46:13 -04:00
swung0x48
8282eecbfa
[Fix] (Espryt): store RGB565/RGB5_A1/RGBA4 as 8-bit channels where a POST probe measures the Mali packed16 array-mip field-order mirror
2026-08-27 22:46:12 -04:00
swung0x48
f4f3afb0b6
[Test] (Integration): pin that a queued SubData survives an immediate readback of a GPU-written buffer
2026-08-27 22:19:45 -04:00
swung0x48
a28da07641
[Fix] (DirectGLES): queue app buffer updates and flush them through a staged-copy upload ring instead of stalling in glBufferSubData
2026-08-27 22:19:44 -04:00
swung0x48
200c21336f
[Fix] (Readback): size a cube-face pack buffer by one face, and give a cube view's face its owner layer
2026-08-27 22:05:23 -04:00
swung0x48
2c3fc583d5
[Test] (Readback): pin the one-face pixel pack buffer and a cube view's per-face layers
2026-08-27 21:58:51 -04:00
swung0x48
645a12d8bc
[Fix] (Readback): read the cube face a readback names, and let glGetTextureSubImage name one
2026-08-27 21:54:47 -04:00
swung0x48
8e6acc5528
[Test] (Readback): pin that a cube map's readback answers the face it was asked for
2026-08-27 21:54:46 -04:00
swung0x48
525ffe0f14
[Test] (Review): pin the inverted override mapping, the probe's controls, and that the pinned-on lane is really armed
2026-08-27 21:06:01 -04:00
swung0x48
ad28d2b744
[Fix, Test] (Review): strip a block's member-level locations too, restore the probe's colour mask, and let the POST verdict follow the override
2026-08-27 20:15:31 -04:00
swung0x48
eab622388f
[Test] (TranslationCache): pin the two interface-block location-strip flags as L2 key material
2026-08-27 20:07:49 -04:00
swung0x48
75e573c923
[Fix] (SelfTest): give the located-interface-block probe its own entry-point gate instead of the storage probe's
2026-08-27 19:56:26 -04:00
swung0x48
0d0ef13619
[Fix] (DirectGLES): run the interface-block location strip last, where its deliberately Vulkan-invalid module reaches no validator
2026-08-27 19:44:18 -04:00
swung0x48
23565fcacd
[Fix, Test] (DirectGLES, SelfTest, MG_Test): probe the located-interface-block defect with its controls and cover the strip in both gates
2026-08-27 19:38:39 -04:00
swung0x48
5dc26e3e2c
[Fix] (DirectGLES, ShaderTranspiler): drop the location qualifier from inter-stage interface blocks on a driver that loses their payload
2026-08-27 19:18:35 -04:00