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:
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user