test(screencast): assert the shared renderer capture path allocates less than once per frame
- commit
- fe541faf7b965903ff045fc809847a41784f3493
- author
- brice · · 2026-10-14 20:58 UTC
- committer
- brice · · 2026-10-14 21:39 UTC
- parent
- 3213e44
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
1 file · +12 -2
M internal/app/screencast_test.go +12 -2
| @@ -244,8 +244,11 @@ func TestScreencastStreamsMonitor(t *testing.T) { | |||
| 244 | 244 | // Steady state: 5 seconds after the stream warmed up. Every allocation is | |
| 245 | 245 | // recorded (MemProfileRate 1) and attributed by its stack: the cast path | |
| 246 | 246 | // (screencast, wayland casts, purego-pipewire, zerobus) must allocate | |
| 247 | - | // less than once per frame. The renderer's capture path is shared with | |
| 248 | - | // ext-image-copy-capture and is reported, not asserted. | |
| 247 | + | // less than once per frame, and so must the renderer capture path it | |
| 248 | + | // shares with ext-image-copy-capture (BeginCapture, EndCapture and the | |
| 249 | + | // pipeline worker). The headless output's own display frame (Render's | |
| 250 | + | // sync file, the flip report, injected input) allocates whether or not | |
| 251 | + | // a cast runs: it is reported in the whole-process figure, not asserted. | |
| 249 | 252 | time.Sleep(2 * time.Second) | |
| 250 | 253 | runtime.MemProfileRate = 1 | |
| 251 | 254 | f0 := frames.Load() | |
| @@ -354,6 +357,13 @@ var castPath = []string{ | |||
| 354 | 357 | "wayland.(*Server).forwardCaptured", | |
| 355 | 358 | "wayland.postRing", | |
| 356 | 359 | "outputkit/capture.writeFrame", | |
| 360 | + | // The renderer capture path, shared with ext-image-copy-capture and | |
| 361 | + | // screencopy: lease, copy, read, return. | |
| 362 | + | "vulkan.(*Renderer).BeginCapture", | |
| 363 | + | "vulkan.(*Renderer).EndCapture", | |
| 364 | + | "outputkit/capture.(*Pipeline).SubmitScoped", | |
| 365 | + | "outputkit/capture.(*Pipeline).process", | |
| 366 | + | "outputkit/capture.(*Pipeline).Recycle", | |
| 357 | 367 | } | |
| 358 | 368 | ||
| 359 | 369 | // allocs counts profiled allocation objects by stack, for the cast path and | |
| @@ -244,8 +244,11 @@ func TestScreencastStreamsMonitor(t *testing.T) { | |||||
| 244 | // Steady state: 5 seconds after the stream warmed up. Every allocation is | 244 | // Steady state: 5 seconds after the stream warmed up. Every allocation is | ||
| 245 | // recorded (MemProfileRate 1) and attributed by its stack: the cast path | 245 | // recorded (MemProfileRate 1) and attributed by its stack: the cast path | ||
| 246 | // (screencast, wayland casts, purego-pipewire, zerobus) must allocate | 246 | // (screencast, wayland casts, purego-pipewire, zerobus) must allocate | ||
| 247 | - | // less than once per frame. The renderer's capture path is shared with | 247 | + | // less than once per frame, and so must the renderer capture path it |
| 248 | - | // ext-image-copy-capture and is reported, not asserted. | 248 | + | // shares with ext-image-copy-capture (BeginCapture, EndCapture and the |
| 249 | + | // pipeline worker). The headless output's own display frame (Render's | |||
| 250 | + | // sync file, the flip report, injected input) allocates whether or not | |||
| 251 | + | // a cast runs: it is reported in the whole-process figure, not asserted. | |||
| 249 | time.Sleep(2 * time.Second) | 252 | time.Sleep(2 * time.Second) | ||
| 250 | runtime.MemProfileRate = 1 | 253 | runtime.MemProfileRate = 1 | ||
| 251 | f0 := frames.Load() | 254 | f0 := frames.Load() | ||
| @@ -354,6 +357,13 @@ var castPath = []string{ | |||||
| 354 | "wayland.(*Server).forwardCaptured", | 357 | "wayland.(*Server).forwardCaptured", | ||
| 355 | "wayland.postRing", | 358 | "wayland.postRing", | ||
| 356 | "outputkit/capture.writeFrame", | 359 | "outputkit/capture.writeFrame", | ||
| 360 | + | // The renderer capture path, shared with ext-image-copy-capture and | |||
| 361 | + | // screencopy: lease, copy, read, return. | |||
| 362 | + | "vulkan.(*Renderer).BeginCapture", | |||
| 363 | + | "vulkan.(*Renderer).EndCapture", | |||
| 364 | + | "outputkit/capture.(*Pipeline).SubmitScoped", | |||
| 365 | + | "outputkit/capture.(*Pipeline).process", | |||
| 366 | + | "outputkit/capture.(*Pipeline).Recycle", | |||
| 357 | } | 367 | } | ||
| 358 | 368 | ||||
| 359 | // allocs counts profiled allocation objects by stack, for the cast path and | 369 | // allocs counts profiled allocation objects by stack, for the cast path and | ||