From cb81610b2bb5c6c935ea7509b23c780800c93d8f Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Tue, 6 Oct 2026 11:58:18 -0400 Subject: [PATCH] [Refactor] (P13 W5 S3): the record arm's definitions and its depth-resolve probe source follow the record-arm guard. --- CMakeLists.txt | 30 +++++++++++-------- MobileGL/MG_Backend/DirectGLES/Managers.cpp | 2 +- MobileGL/MG_Backend/DirectGLES/Utils.cpp | 2 +- .../BackendObject_DirectVulkan.cpp | 2 +- .../MG_Backend/DirectVulkan/DirectVulkan.cpp | 4 +-- .../DirectVulkan/Renderer/UniformManager.cpp | 2 +- .../DirectVulkan/Renderer/VkBufferManager.cpp | 2 +- .../DirectVulkan/Renderer/VkBufferObject.cpp | 2 +- .../Renderer/VkTextureManager.cpp | 4 +-- .../DirectVulkan/Renderer/VulkanRenderer.cpp | 2 +- .../DirectVulkan/Renderer/WireDraw.inc | 2 +- MobileGL/MG_Backend/MGPipe/PipeInputs.cpp | 4 +-- .../GLState/BufferState/BufferObject.cpp | 2 +- .../notes/p13/tools/s3-ops-2.txt | 21 +++++++++++++ .../notes/p13/tools/w5_regate.py | 15 ++++++++-- 15 files changed, 66 insertions(+), 30 deletions(-) create mode 100644 docs/Disaggregated/notes/p13/tools/s3-ops-2.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index d54463be..bcc22001 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -553,6 +553,17 @@ if (MOBILEGL_BUILD_DISAGGREGATED AND set(MOBILEGL_BUILD_DISAGGREGATED_INPROC OFF) endif() +# P13 W5 (notes/p13/W5-DESIGN.md): THE RECORD ARM'S OWN GUARD. A plain variable, not an option and +# not a cache entry, so no build tree can keep a stale value (W3a's lesson): it equals +# MOBILEGL_BUILD_DISAGGREGATED while the record arm's guards are reclassified one by one - every +# such commit leaves both library shapes byte-identical - and one later commit sets it on for every +# build (the library without MG_Remote then runs the record arm). Always defined, to 0 or 1. +if (MOBILEGL_BUILD_DISAGGREGATED) + set(MOBILEGL_BUILD_RECORD_ARM ON) +else() + set(MOBILEGL_BUILD_RECORD_ARM OFF) +endif() + message(STATUS "MobileGL: PipeInputs push ON, appending the MGPipe fill sources") list(APPEND SOURCE_FILES MobileGL/MG_Backend/MGPipe/PipeInputs.cpp @@ -673,10 +684,15 @@ if (MOBILEGL_BUILD_DISAGGREGATED) MobileGL/MG_Remote/Server/ServerDisplay.cpp # Package-neutral C ABI for an APK that owns the server and its ANativeWindow. MobileGL/MG_Remote/Server/EmbeddedServer.cpp + ) +endif() + +# P13 W5: the record arm's own sources, compiled wherever the record arm is (MG_Remote or not). +if (MOBILEGL_BUILD_RECORD_ARM) + list(APPEND SOURCE_FILES # P7 gate 5 (g5-msprobe): the Magma wire arm's two multisample depth/stencil resolve # arms and the probe that measures the first against the second, shared by the - # renderer's bring-up and the Vulkan POST. Wire-only - the monolith records neither arm - - # so it stays out of the pull build (gate G1). + # renderer's bring-up and the Vulkan POST. MobileGL/MG_Backend/DirectVulkan/Renderer/WireDepthResolveProbe.cpp ) endif() @@ -743,16 +759,6 @@ if (MOBILEGL_BUILD_DISAGGREGATED) list(APPEND MOBILEGL_COMPILE_DEF -DMOBILEGL_BUILD_DISAGGREGATED=1) endif() -# P13 W5 (notes/p13/W5-DESIGN.md): THE RECORD ARM'S OWN GUARD. A plain variable, not an option and -# not a cache entry, so no build tree can keep a stale value (W3a's lesson): it equals -# MOBILEGL_BUILD_DISAGGREGATED while the record arm's guards are reclassified one by one - every -# such commit leaves both library shapes byte-identical - and one later commit sets it on for every -# build (the library without MG_Remote then runs the record arm). Always defined, to 0 or 1. -if (MOBILEGL_BUILD_DISAGGREGATED) - set(MOBILEGL_BUILD_RECORD_ARM ON) -else() - set(MOBILEGL_BUILD_RECORD_ARM OFF) -endif() if (MOBILEGL_BUILD_RECORD_ARM) list(APPEND MOBILEGL_COMPILE_DEF -DMOBILEGL_BUILD_RECORD_ARM=1) else() diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.cpp b/MobileGL/MG_Backend/DirectGLES/Managers.cpp index 03561d6e..f902c6f3 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.cpp +++ b/MobileGL/MG_Backend/DirectGLES/Managers.cpp @@ -3512,7 +3512,7 @@ namespace MobileGL::MG_Backend::DirectGLES { return twin ? twin->get() : nullptr; } -#if MOBILEGL_BUILD_DISAGGREGATED +#if MOBILEGL_BUILD_RECORD_ARM void RequireStagedCoverage(GLESBufferResource& resource, const Uint8* hostBase, SizeT start, SizeT end, const char* site) { ServerStaged().RequireCoverage(&resource, hostBase, start, end, site); diff --git a/MobileGL/MG_Backend/DirectGLES/Utils.cpp b/MobileGL/MG_Backend/DirectGLES/Utils.cpp index 6fb6fd8e..b169ba5e 100644 --- a/MobileGL/MG_Backend/DirectGLES/Utils.cpp +++ b/MobileGL/MG_Backend/DirectGLES/Utils.cpp @@ -46,7 +46,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } #endif -#if MOBILEGL_BUILD_DISAGGREGATED +#if MOBILEGL_BUILD_RECORD_ARM const FormatCapabilityCache* ActiveBackendFormatCaps() { // Under a live split session the SERVER's private backend is what owns the context on the // apply thread (and these reads all run there), so its cache is the authoritative one. diff --git a/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp b/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp index eb7e6b8f..ce8b92a5 100644 --- a/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp @@ -602,7 +602,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { Bool BackendObject_DirectVulkan::ExportNativeFence(int* fence) { *fence = -1; -#if MOBILEGL_BUILD_RECORD_ARM +#if MOBILEGL_BUILD_DISAGGREGATED const std::lock_guard lock(m_eglStateMutex); return pVulkanRenderer ? pVulkanRenderer->ExportNativeFence(fence) : true; #else diff --git a/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp b/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp index 936b67cb..ea9acb96 100644 --- a/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp @@ -68,7 +68,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { SessionLocal g_rendererGeneration; } // namespace -#if MOBILEGL_BUILD_DISAGGREGATED +#if MOBILEGL_BUILD_RECORD_ARM namespace { // P7 wave 2 package C, CONTRACT-P7 ยง5.5: MAGMA'S MIRROR OF g_glesStateObjectDeathOps // (DirectGLES/Managers.cpp:335), and the one arm of that table Magma has any work in. @@ -126,7 +126,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { Bool StateObjectDeathOpsInstalled() { return MG_State::GLState::GetStateObjectDeathOps() == &g_magmaStateObjectDeathOps; } -#endif // MOBILEGL_BUILD_DISAGGREGATED && MOBILEGL_PIPE_PUSH +#endif // MOBILEGL_BUILD_RECORD_ARM && MOBILEGL_PIPE_PUSH Uint64 GetRendererGeneration() { return g_rendererGeneration->value.load(std::memory_order_acquire); diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/UniformManager.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/UniformManager.cpp index c11c0e32..8cdda031 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/UniformManager.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/UniformManager.cpp @@ -2627,7 +2627,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { return true; } -#if MOBILEGL_BUILD_DISAGGREGATED +#if MOBILEGL_BUILD_RECORD_ARM Bool UniformManager::ResolveWireUniformBufferPayload(const MagmaProgramSource& program, Uint32 blockIndex, Uint32 bindingPoint, UboBindResult& out) const { if (bindingPoint >= MG_Pipe::kMGPipeMaxBufferBindingPoints) diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp index 92f48ca8..de499189 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp @@ -240,7 +240,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { #endif } // namespace -#if MOBILEGL_BUILD_DISAGGREGATED +#if MOBILEGL_BUILD_RECORD_ARM void VkBufferManager::RegisterWireResourceOps() { if (MG_Config::DataArmIsRecord()) { MG_Pipe::MGPipeSetResourceOps(&g_vulkanWireResourceOps); diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferObject.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferObject.cpp index 01eda918..b166bc69 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferObject.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferObject.cpp @@ -13,7 +13,7 @@ #endif namespace MobileGL::MG_Backend::DirectVulkan { -#if MOBILEGL_BUILD_DISAGGREGATED +#if MOBILEGL_BUILD_RECORD_ARM void VkBufferObject::MoveExternalFrom(VkBufferObject& other) { m_device = other.m_device; m_externalMemory = other.m_externalMemory; diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp index 7a4c68c2..a573dabc 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp @@ -1868,7 +1868,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { return prunedCount; } -#if MOBILEGL_BUILD_DISAGGREGATED +#if MOBILEGL_BUILD_RECORD_ARM // --------------------------------------------------------------------------------- // P5f (fm): THE HANDLE-KEYED TEXTURE ARM // --------------------------------------------------------------------------------- @@ -3265,7 +3265,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { std::construct_at(&resource, Move(grown)); return true; } -#endif // MOBILEGL_BUILD_DISAGGREGATED +#endif // MOBILEGL_BUILD_RECORD_ARM Bool VkTextureManager::SyncTexture(MG_State::GLState::ITextureObject &texture, TextureResource &outResource) { diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index 98f3e572..7d7f87fd 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -14155,7 +14155,7 @@ void main() { return m_deviceLost; } -#if MOBILEGL_BUILD_DISAGGREGATED +#if MOBILEGL_BUILD_RECORD_ARM Bool VulkanRenderer::LatchWireDeviceLoss(const char* site) { if (!IsDeviceLost()) return false; if (!m_deviceLossLatched) { diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/WireDraw.inc b/MobileGL/MG_Backend/DirectVulkan/Renderer/WireDraw.inc index e5ea0767..d82411f9 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/WireDraw.inc +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/WireDraw.inc @@ -1,5 +1,5 @@ // Server-owned draw/dispatch setup. The legacy setup remains the monolith implementation. -#if MOBILEGL_BUILD_DISAGGREGATED +#if MOBILEGL_BUILD_RECORD_ARM static MagmaProgramSource WireProgramSource(MG_Pipe::MGPipeHandle handle) { auto& state = MG_Pipe::MGPipeApplier(); const Bool composite = handle.Slot >= MG_Pipe::kMGPipeShaderCsoCompositeSlotBase; diff --git a/MobileGL/MG_Backend/MGPipe/PipeInputs.cpp b/MobileGL/MG_Backend/MGPipe/PipeInputs.cpp index 80b56129..89236b7c 100644 --- a/MobileGL/MG_Backend/MGPipe/PipeInputs.cpp +++ b/MobileGL/MG_Backend/MGPipe/PipeInputs.cpp @@ -47,7 +47,7 @@ namespace MobileGL::MG_Pipe { return std::nullopt; } -#if MOBILEGL_BUILD_DISAGGREGATED +#if MOBILEGL_BUILD_RECORD_ARM // ================================================================================ // P5: the server's verb stamp, the residual-pull counter, and the four-way read verdict // ================================================================================ @@ -594,7 +594,7 @@ namespace MobileGL::MG_Pipe { if (ownership == MGPipeFieldOwnership::kBarrierPulled) CountBarrierPull(field, gPipeInputs.CurrentVerb()); } -#endif // MOBILEGL_BUILD_DISAGGREGATED +#endif // MOBILEGL_BUILD_RECORD_ARM #if MOBILEGL_PIPE_VERIFY namespace { diff --git a/MobileGL/MG_State/GLState/BufferState/BufferObject.cpp b/MobileGL/MG_State/GLState/BufferState/BufferObject.cpp index 56c9cbbd..1f1872c0 100644 --- a/MobileGL/MG_State/GLState/BufferState/BufferObject.cpp +++ b/MobileGL/MG_State/GLState/BufferState/BufferObject.cpp @@ -440,7 +440,7 @@ namespace MobileGL::MG_State::GLState { NotifySubData(m_mappedRange.start, m_mappedRange.end - m_mappedRange.start); } -#if MOBILEGL_BUILD_DISAGGREGATED +#if MOBILEGL_BUILD_RECORD_ARM void BufferObject::PushMappedSpanBlock(SizeT offset, SizeT size) { // NotifySubData and not MGPipeEmitResourceSubData directly: the serial bump, the // defined-content promotion and the legacy-ops fallback are what the monolith span diff --git a/docs/Disaggregated/notes/p13/tools/s3-ops-2.txt b/docs/Disaggregated/notes/p13/tools/s3-ops-2.txt new file mode 100644 index 00000000..ad22c801 --- /dev/null +++ b/docs/Disaggregated/notes/p13/tools/s3-ops-2.txt @@ -0,0 +1,21 @@ +# P13 W5 S3, round 2: the definitions the record arm links against (from the trial flip's undefined symbols). +open | MobileGL/MG_Backend/DirectGLES/Managers.cpp | Bool ResourceContentIsDeclared( +open | MobileGL/MG_Backend/DirectGLES/Utils.cpp | ActiveBackendFormatCaps() +open | MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferObject.cpp | ::MoveExternalFrom( +open | MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp | ::LatchIfGpuHung( +open | MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp | ::LatchWireDeviceLoss( +open | MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp | ::AcquireWireSlice( +open | MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp | ::RegisterWireResourceOps( +open | MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp | ::MarkWireBufferGpuWritten( +open | MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp | ::SweepDeferredWireReleases( +open | MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp | ::DestroyAllDeferredWireReleases( +open | MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp | ::ReadUnbackedWireLevel( +open | MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp | ::GrowWireTextureMipChain( +open | MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp | ::MarkWireTextureGpuWritten( +open | MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp | ::ResolveWireTextureStorage( +open | MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp | ::SyncTextureResourceByHandle( +open | MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp | void InstallStateObjectDeathOps() +open | MobileGL/MG_Backend/MGPipe/PipeInputs.cpp | MGPipeStickyForwardPull( +open | MobileGL/MG_State/GLState/BufferState/BufferObject.cpp | ::NotePersistentMapStateChanged( +open | MobileGL/MG_State/GLState/BufferState/BufferObject.cpp | ::HasLiveHostWritesForWire( +open | MobileGL/MG_Backend/DirectVulkan/Renderer/UniformManager.cpp | ::ResolveWireUniformBufferPayload( diff --git a/docs/Disaggregated/notes/p13/tools/w5_regate.py b/docs/Disaggregated/notes/p13/tools/w5_regate.py index b7badc58..d6d45177 100644 --- a/docs/Disaggregated/notes/p13/tools/w5_regate.py +++ b/docs/Disaggregated/notes/p13/tools/w5_regate.py @@ -81,12 +81,24 @@ def main(): ops = [l for l in pathlib.Path(sys.argv[1]).read_text(encoding='utf-8').splitlines() if l.strip() and not l.lstrip().startswith('#')] files = {} + failed = 0 for op in ops: parts = [p.strip() for p in op.split(' | ')] kind, path = parts[0], parts[1] if path not in files: files[path] = load(path) crlf, lines = files[path] + try: + apply_one(kind, lines, parts) + except SystemExit as failure: + print('FAILED:', op, '->', failure) + failed += 1 + for path, (crlf, lines) in files.items(): + save(path, crlf, lines) + print('applied', len(ops) - failed, 'of', len(ops), 'op(s) to', len(files), 'file(s)') + + +def apply_one(kind, lines, parts): if kind == 'open': op_open(lines, parts[2]) elif kind == 'nest': @@ -99,9 +111,6 @@ def main(): lines[a] = parts[3] else: raise SystemExit('unknown op ' + kind) - for path, (crlf, lines) in files.items(): - save(path, crlf, lines) - print('applied', len(ops), 'op(s) to', len(files), 'file(s)') if __name__ == '__main__':