[Docs] (docs/Disaggregated, docs/MobileVA, docs/Performance, MG_Impl/Pipe, MG_IntegrationTest/Scenarios, MG_State/GLState, MG_Test/Buffer, MG_Test/Wire, scripts/ci): name the renderer's new files

This commit is contained in:
2026-10-16 04:28:53 -04:00
parent 98c8e8833c
commit 7f7c596213
11 changed files with 15 additions and 15 deletions
+1 -1
View File
@@ -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.
@@ -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
@@ -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
@@ -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.
+1 -1
View File
@@ -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) {
+2 -2
View File
@@ -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.
+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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) |
+3 -3
View File
@@ -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).
+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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