graphics: move captures off-thread when streaming (#885)
## Link to GitHub Issue or related Pull Request, if one exists #0 ## Description of change Moves the API capture readback off the game's Present thread while a video stream client is connected. The readback is a `LockRect` plus a memcpy of the whole back buffer, roughly 635us at 720p and 1270us at 1080p. On the Present thread that comes out of the game's frame budget: TDJ (at 120Hz) dropped to 117fps with a 60fps stream running, and reading on a pool thread instead gave the full 120 back. Only streaming takes the off-thread path, gated on a new `capture_pump::screen_claimed()`. Screenshots, one-off API captures, and `THREAD_BAN` games all keep the existing inline read for compat reasons. A pool thread in `LockRect` while the Present thread sat inside `GetRenderTargetData` deadlocks DDR X2 for example. `CLAIMED[]` becomes `std::atomic<bool>` so the capture path does not take a lock on the Present thread. The read pool has a single worker so frames cannot be enqueued out of order, and both capture pools are never destroyed so a late read cannot queue onto a torn-down pool. The capture pipeline itself is unchanged: `GetRenderTargetData` is still synchronous on the Present thread. ## Testing DDR X2 World IIDX TDJ SDVX VM
This commit is contained in:
@@ -1745,7 +1745,7 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
||||
},
|
||||
{
|
||||
// APIStreamEnable
|
||||
.title = "API Video Stream Server Enable",
|
||||
.title = "API Video Stream Server Enable (EXPERIMENTAL)",
|
||||
.name = "apistream",
|
||||
.desc = "Serves the mirrored screen as a video stream, on the API port plus two; "
|
||||
"alternative to API screen capture. Requires -api.\n\n"
|
||||
@@ -1754,7 +1754,8 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
||||
"Parameters: screen (0-3), fps (1-60, default 30), q (1-100, default 70).\n\n"
|
||||
"Example with -api 1337: http://host:1339/stream.h264?fps=30&q=70\n\n"
|
||||
"VIEW ONLY - touch input still requires -api. "
|
||||
"No password protection or encryption of any kind; video sent in the clear!",
|
||||
"No password protection or encryption of any kind; video sent in the clear!\n\n"
|
||||
"Streaming is known to cause older games to hang and crash.",
|
||||
.type = OptionType::Bool,
|
||||
.category = "Companion & API",
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user