diff --git a/MobileGL/MG_Impl/Pipe/Verb/GpuWriteSet.h b/MobileGL/MG_Impl/Pipe/Verb/GpuWriteSet.h index d899f3ea..0b0ae8ca 100644 --- a/MobileGL/MG_Impl/Pipe/Verb/GpuWriteSet.h +++ b/MobileGL/MG_Impl/Pipe/Verb/GpuWriteSet.h @@ -49,7 +49,7 @@ namespace MobileGL::MG_Record { // make the next map wait on - and then re-read - a dispatch that could not have // changed a byte of it. WritableImageBufferTexture, - // WireDraw.inc's BeginWireXfbCaptureForDraw, which VulkanRenderer::BeginXfbCaptureForDraw + // WireDraw.cpp's BeginWireXfbCaptureForDraw, which VulkanRenderer::BeginXfbCaptureForDraw // calls: the capture targets, because the capture is a GPU write like any shader's. TransformFeedbackCapture, // P5, new: glReadPixels into a bound GL_PIXEL_PACK_BUFFER. diff --git a/MobileGL/MG_IntegrationTest/Scenarios/DepthStencilReadbackMatrixScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/DepthStencilReadbackMatrixScenario.cpp index 6e0b2e13..dab46c22 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/DepthStencilReadbackMatrixScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/DepthStencilReadbackMatrixScenario.cpp @@ -258,7 +258,7 @@ namespace MGITest { // The claim is read off the SERVER's private log (the backend runs on the apply thread, // the server role, on every arm), where ResolveWireDepthStencil says once per arm which // one ran and ArmWireDepthResolveOrder states the verdict; keep the phrases in step with - // WireFramebuffer.inc and VulkanRenderer.cpp. Every other entry asserts nothing here. + // WireFramebuffer.cpp and VulkanRenderer.cpp. Every other entry asserts nothing here. // // Red once (executed, reverted): EvaluateWireDepthResolveProbe answering Clean for every // measurement fails the four Bug entries here (the render-pass line is in the log and diff --git a/MobileGL/MG_IntegrationTest/Scenarios/F1WireScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/F1WireScenario.cpp index 4296ff5b..7b15f43e 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/F1WireScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/F1WireScenario.cpp @@ -1781,7 +1781,7 @@ void MakeSingleSampleTarget(int width, int height, const GLfloat (&clear)[4], GL // assertion. // // Red once (executed, reverted): restore the two `width != |dx1-dx0|` clauses in -// WireFramebuffer.inc's colour resolve arm and both blits die as +// WireFramebuffer.cpp's colour resolve arm and both blits die as // Fatal{UnmigratedVerb, "Magma:multisample-resolve-region"}. TEST_F(F1WireScenario, MultisampleColorBlitScalesAndFlipsThroughTheResolveScratch) { if (!Ready()) return; @@ -1942,7 +1942,7 @@ TEST_F(F1WireScenario, MultisampleBlitOntoAMultisampleDestinationDeclinesAndKeep // // The half WITH an arm is ResolveWireDepthStencil's: a multisample depth or stencil source now // reaches a single-sample destination on every device - through VK_KHR_depth_stencil_resolve -// where it exists, through WireMultisampleResolve.inc's baked pass where it does not - and the +// where it exists, through WireMultisampleResolve.cpp's baked pass where it does not - and the // two MsResolve entries on each arm are its reading. This is the half with none. // // ONE SAMPLE INTO FOUR, with rectangles that MATCH so the shape decline next door is not what diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramArtifacts.h b/MobileGL/MG_State/GLState/ProgramState/ProgramArtifacts.h index 50b6be6b..1d734e3e 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramArtifacts.h +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramArtifacts.h @@ -104,7 +104,7 @@ namespace MobileGL::MG_State::GLState { // from its OWN reflect pass over the same modules). This vector IS that space, built once. // // WHAT IT COSTS AND WHAT IT BUYS. MagmaProgramSource is a BORROWED VIEW constructed afresh - // for every wire draw (WireDraw.inc's WireProgramSource), so its lazy + // for every wire draw (WireDraw.cpp's WireProgramSource), so its lazy // `EnsureStorageBlocks` re-ran spvReflectCreateShaderModule over every stage module of // every program on every draw that touched an SSBO. Reading it out of the archive instead // takes the SPIR-V reflector off the wire draw path entirely. diff --git a/MobileGL/MG_Test/Buffer/SplitBufferTest.cpp b/MobileGL/MG_Test/Buffer/SplitBufferTest.cpp index 9ed37e90..8fe8749f 100644 --- a/MobileGL/MG_Test/Buffer/SplitBufferTest.cpp +++ b/MobileGL/MG_Test/Buffer/SplitBufferTest.cpp @@ -246,7 +246,7 @@ TEST_F(SplitBufferSet, Row2TheSweepIsBoundedByTheImageUnitHighWaterMark) { binding = MG_State::GLState::ImageTextureBinding{}; } -// Row 3 - BeginWireXfbCaptureForDraw() in WireDraw.inc, which VulkanRenderer::BeginXfbCaptureForDraw() +// Row 3 - BeginWireXfbCaptureForDraw() in WireDraw.cpp, which VulkanRenderer::BeginXfbCaptureForDraw() // calls. With no capture active there is nothing to mark, and that gate is the half worth pinning: a mark // taken with no active capture would mark whatever the binding points happened to hold from a previous one. TEST_F(SplitBufferSet, Row3TransformFeedbackTargetsAreOnlyMarkedWhileACaptureIsActive) { diff --git a/MobileGL/MG_Test/Wire/FatalFamilyTest.cpp b/MobileGL/MG_Test/Wire/FatalFamilyTest.cpp index bcd158f2..fcbaf13e 100644 --- a/MobileGL/MG_Test/Wire/FatalFamilyTest.cpp +++ b/MobileGL/MG_Test/Wire/FatalFamilyTest.cpp @@ -136,7 +136,7 @@ TEST(FatalFunnelSeam, TheMagmaWireVerbDeathReachesSessionFailAndBumpsTheFaultCou "reason MG_Test/Wire's spawn cases are POSIX only"; #else using namespace MobileGL; - // WireFramebuffer.inc's MagmaWireFatal, character for character - the funnel eleven of the + // WireFramebuffer.cpp's MagmaWireFatal, character for character - the funnel eleven of the // fifteen P7-marked refusals die through. EXPECT_EXIT( { @@ -159,7 +159,7 @@ TEST(FatalFunnelSeam, TheSeamHandsTheInstalledHookItsFamilyAndItsLineVerbatim) { GTEST_SKIP() << "POSIX only, as above"; #else using namespace MobileGL; - // WireDraw.inc's WireBufferLegacyFatal, character for character. Through a hook of the test's + // WireDraw.cpp's WireBufferLegacyFatal, character for character. Through a hook of the test's // own rather than MG_Remote's, so what is under test is the SEAM - that the family enum and // the fully formatted line cross intact - and not what SessionFail then does with them. The // hook returns; MGPipeSessionFail must still abort, which is why this is an exit assertion. diff --git a/docs/Disaggregated/pwait/README.md b/docs/Disaggregated/pwait/README.md index f0d906ab..7f092524 100644 --- a/docs/Disaggregated/pwait/README.md +++ b/docs/Disaggregated/pwait/README.md @@ -45,7 +45,7 @@ every arm (pairs.py), before and after. only the final window pass waits for the release. - Magma, 168451bc. `VulkanRenderer::SubmitAheadOfAcquiredImage` submits the recording without the acquire - wait when the frame first reaches the acquired image (through `WireFramebuffer.inc`). + wait when the frame first reaches the acquired image (through `WireFramebuffer.cpp`). `SubmitPendingCommandBuffer` attaches the image-available semaphore only to a submission that references the image (`FrameContext::FrameData::acquiredImageReferenced`). Always on; it logs "a frame's off-screen work goes to the queue ahead of its window pass" once. diff --git a/docs/MobileVA/plan.md b/docs/MobileVA/plan.md index bc697205..9424841c 100644 --- a/docs/MobileVA/plan.md +++ b/docs/MobileVA/plan.md @@ -72,7 +72,7 @@ that MobileGL owns. Decoded frames then reach GL with **zero CPU copies on any A |---|---|---| | P1 | Device: Lenovo TB321FU (Y700), Adreno 750, Android 15, kernel 6.1. Container: Arch Linux ARM, glibc. libva headers in the cross sysroot are **VA-API 1.24** (`~/sysroots/arch-kde-mgl/usr/include/va`). | **[verified]** | | P2 | Server YUV shared images are AHBs: `Y8Cb8Cr8_420` / `YCbCr_P010`, usage `GPU_SAMPLED_IMAGE \| CPU_WRITE_OFTEN \| CPU_READ_RARELY`. Plane offsets come from `AHardwareBuffer_lockPlanes`. They are exported with modifier `DRM_FORMAT_MOD_INVALID`. A returning fd is identified by `(st_dev, st_ino)`, so a re-import of our own buffer is **zero-copy** (no foreign path). | **[verified]** (`MG_Remote/Server/SharedImageRegistry.cpp`, yuvprobe GBM NV12 case) | -| P3 | Espryt converts YUV to RGBA with `GL_EXT_YUV_target` (Adreno 750 has it). Magma converts with `VkSamplerYcbcrConversion` on the AHB external format. Both convert once per reader frame epoch. | **[verified]** (`DirectGLES.cpp ConvertYuvForSampling`, `WireYuvImage.inc`) | +| P3 | Espryt converts YUV to RGBA with `GL_EXT_YUV_target` (Adreno 750 has it). Magma converts with `VkSamplerYcbcrConversion` on the AHB external format. Both convert once per reader frame epoch. | **[verified]** (`DirectGLES.cpp ConvertYuvForSampling`, `WireYuvImage.cpp`) | | P4 | The foreign-copy fallback is labelled. Its first use logs "a foreign ... dma-buf is sampled through image N, refreshed by a CPU copy", and `Image::ForeignSource::Copies` counts each copy. That is the proof hook for "our buffers never take the fallback". | **[verified]** (code) | | P5 | The YUV conversion paths call `RefreshForeign` but, from a read of the code, do **not** wait on the image's write fence (`DupWriteFence`) the way the RGBA shared-image path does. | **[unverified]**: code read only; confirm before relying on write fences for YUV | | P6 | The client shared-image C ABI (`MG_Impl/SharedImageApi.h`) makes its round trips on the **process's GL client session**, the same ring its GL calls ride, so "like any GL call they must not race the GL calls of another thread". A VA driver therefore **cannot** use it from a decode thread. It needs its own connection. | **[verified]** (header comment) | diff --git a/docs/Performance/glmark2-baseline.md b/docs/Performance/glmark2-baseline.md index dd8aaf1c..f008a1bb 100644 --- a/docs/Performance/glmark2-baseline.md +++ b/docs/Performance/glmark2-baseline.md @@ -410,7 +410,7 @@ glmark2-specific. ### Magma (DirectVulkan) -1. **A VkRenderPass per draw.** `VulkanRenderer::SetupWireDraw` (`WireDraw.inc`) calls +1. **A VkRenderPass per draw.** `VulkanRenderer::SetupWireDraw` (`WireDraw.cpp`) calls `RetireWireDrawPass()` unconditionally, which ends the active render pass, and begins a new one at the end of setup, for every draw. In ideas (305 draws/frame) `SetupWireDraw` is 41% of the apply thread and End/BeginRenderPass ~19%; on a tiler every pass also loads and stores its @@ -431,7 +431,7 @@ glmark2-specific. 3. **Allocation churn.** scudo malloc/free with lock contention (`__aarch64_cas4_acq` 20% + scudo ~15% of the ideas apply thread): per-draw vectors (`BeginRenderPass` clear values, vertex input state objects, retired wire objects). **Fix:** per-frame arenas / small vectors. **Gain:** 10-20%. -4. **A VkRenderPass + VkFramebuffer created per clear** (`WireFramebuffer.inc` ~306-311): 7% of +4. **A VkRenderPass + VkFramebuffer created per clear** (`WireFramebuffer.cpp`, `ClearWireFramebuffer`): 7% of texture fullscreen, and the objects pile up when nothing retires them (C2). ### Correctness found on the way @@ -440,7 +440,7 @@ glmark2-specific. for the server to apply (`WaitForApplyToCatchUp`). Off-screen glmark2 then reports 6846 / 12117 and nothing bounds the GPU queue. It must reach the backend (driver finish / fence wait) and reply. - **C2 Magma server crash** under `glmark2-wayland --off-screen`: `VK_ERROR_OUT_OF_HOST_MEMORY` FATAL - at `WireFramebuffer.inc:311` (`vkCreateFramebuffer` in `ClearWireFramebuffer`), then SIGSEGV in + at `vkCreateFramebuffer` in `ClearWireFramebuffer` (`WireFramebuffer.cpp`), then SIGSEGV in `vkCmdBeginRenderPass` (two server crashes in a row); the per-clear objects accumulate when the client runs ahead with no backpressure (C1). - **C3** ES extension parity (Espryt item 2). diff --git a/scripts/ci/fatal_census.py b/scripts/ci/fatal_census.py index ae9c06da..0b646fb0 100644 --- a/scripts/ci/fatal_census.py +++ b/scripts/ci/fatal_census.py @@ -66,7 +66,7 @@ prose is why that map reads the way it does. WHAT THE SAME PACKAGE RETIRED, so the numbers above can be checked: StagedShadow.h:115 and StagedTextureStore.h:344 now call SessionFail, and the three Magma wire funnels -(WireFramebuffer.inc, UniformManager.cpp, WireDraw.inc) - through which all fifteen `@P7` +(WireFramebuffer.cpp, UniformManager.cpp, WireDraw.cpp) - through which all fifteen `@P7` refusals die - go through MG_Pipe's MGPipeSessionFail seam. Those fifteen are now visible to every consumer of the funnel: a SessionFault frame for the peer, a SessionFaultCount() for exit gate S8, and a family word that FatalFamilies.def projects. diff --git a/scripts/ci/spawn_lane_parity.py b/scripts/ci/spawn_lane_parity.py index 706f3719..f04f9ac8 100644 --- a/scripts/ci/spawn_lane_parity.py +++ b/scripts/ci/spawn_lane_parity.py @@ -85,7 +85,7 @@ MAGMA_INPROC_ONLY = ("MagmaRunAheadScenario.", "MagmaWireCacheScenario.", "Descr # P7 wave 2-B2: THE SANCTIONED ASYMMETRY THAT IS NOT INPROC-ONLY - these exist on split AND # spawn and cannot exist on tcp. Every MGITEST_MAGMA_FORCE_* knob is read BY THE SERVER -# (WireFramebuffer.inc's getenv readers run on the apply thread), and a ctest ENVIRONMENT +# (WireFramebuffer.cpp's getenv readers run on the apply thread), and a ctest ENVIRONMENT # property only reaches the process ctest starts, the CLIENT. Under inproc the server is a # thread of that process and under spawn ServerSpawn.cpp copies ::environ into the child, so # both see it; under tcp the server is the LANE-WIDE TcpServer.Start fixture, started once from