From 45077e6608545958eccfe2d8bd932b7b6cddf688 Mon Sep 17 00:00:00 2001 From: Elena Torro Date: Mon, 28 Sep 2026 13:20:55 +0200 Subject: [PATCH] :tada: Add cross-engine GPU memory harness for render-wasm --- .gitignore | 2 + frontend/playwright.config.js | 28 + frontend/playwright/perf/README.md | 57 ++ frontend/playwright/perf/gpu-memory.spec.js | 205 +++++++ .../playwright/perf/gpu-memory/os-sampler.js | 162 +++++ .../playwright/perf/gpu-memory/report.mjs | 572 ++++++++++++++++++ .../perf/gpu-memory/webgl-tracker.js | 423 +++++++++++++ 7 files changed, 1449 insertions(+) create mode 100644 frontend/playwright/perf/README.md create mode 100644 frontend/playwright/perf/gpu-memory.spec.js create mode 100644 frontend/playwright/perf/gpu-memory/os-sampler.js create mode 100644 frontend/playwright/perf/gpu-memory/report.mjs create mode 100644 frontend/playwright/perf/gpu-memory/webgl-tracker.js diff --git a/.gitignore b/.gitignore index 7d4f91e50b..72afa2e0cc 100644 --- a/.gitignore +++ b/.gitignore @@ -112,3 +112,5 @@ opencode.json /.ci-logs /.codex/ /tools/__pycache__ +/frontend/playwright/perf/results*/ +/frontend/playwright/perf/report.html diff --git a/frontend/playwright.config.js b/frontend/playwright.config.js index 1e74d525eb..d8461a040c 100644 --- a/frontend/playwright.config.js +++ b/frontend/playwright.config.js @@ -11,6 +11,33 @@ const userAgent = platform === 'darwin' ? "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" : undefined; +// GPU memory harness (playwright/perf). Never run in CI: select it with +// `--project gpu-memory-`. Headed, since headless Chromium falls +// back to SwiftShader and measures nothing real. +function gpuMemoryProjects() { + const engines = { + chromium: { + ...devices["Desktop Chrome"], + launchOptions: { args: ["--enable-gpu", "--ignore-gpu-blocklist"] }, + }, + firefox: devices["Desktop Firefox"], + webkit: devices["Desktop Safari"], + }; + return Object.entries(engines).map(([engine, use]) => ({ + name: `gpu-memory-${engine}`, + testDir: "./playwright/perf", + timeout: 15 * 60 * 1000, + use: { + ...use, + // The global clipboard permissions only exist in Chromium. + permissions: [], + viewport: { width: 1920, height: 1080 }, + deviceScaleFactor: Number(process.env.PERF_DPR ?? 2), + headless: false, + }, + })); +} + /** * @see https://playwright.dev/docs/test-configuration */ @@ -93,6 +120,7 @@ export default defineConfig({ }, }, }, + ...gpuMemoryProjects(), ], /* Run your local dev server before starting the tests */ diff --git a/frontend/playwright/perf/README.md b/frontend/playwright/perf/README.md new file mode 100644 index 0000000000..17cdb28e34 --- /dev/null +++ b/frontend/playwright/perf/README.md @@ -0,0 +1,57 @@ +# GPU memory harness + +Measures how much GPU memory the render-wasm workspace uses during a long +edit session, in Chromium, Firefox and WebKit, and compares builds. + +Not part of CI. Needs the compiled frontend and wasm bundle that +`scripts/e2e-server.js` serves, and a display: the projects run headed, +since headless Chromium falls back to SwiftShader. + +## Run + +From `frontend/`: + +```sh +# one engine, labelled run +PERF_LABEL=develop npx playwright test --project gpu-memory-chromium + +# after rebuilding with a change +PERF_LABEL=cache-limit npx playwright test --project gpu-memory-chromium + +# compare and write playwright/perf/report.html +node playwright/perf/gpu-memory/report.mjs +``` + +Projects: `gpu-memory-chromium`, `gpu-memory-firefox`, `gpu-memory-webkit`. + +| Variable | Default | Meaning | +|---|---|---| +| `PERF_LABEL` | `git describe --dirty` | Name of the build under test; results go to `results/