mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 01:53:24 +09:00
[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:
@@ -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.
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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) |
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user