graphics: exclude overlay from screenshots (#865)

## Link to GitHub Issue or related Pull Request, if one exists
#0

## Description of change

Adds the `-screenshotoverlay` option.

By default, file screenshots exclude the Spice overlay. Enabling this
option captures screenshots after the overlay is rendered.

Also updates DX11 backend to allow screenshots even when overlay is
disabled.

## Testing
This commit is contained in:
bicarus
2026-08-13 23:21:46 -07:00
committed by GitHub
parent 82e0c053d0
commit c6cd72c528
9 changed files with 156 additions and 60 deletions
@@ -348,43 +348,43 @@ static void dispatch_surface_save(
}
}
static std::optional<ImageRequest> consume_image_request() {
if (graphics_screenshot_consume()) {
return ImageRequest {
.kind = ImageRequestKind::Screenshot,
.screen = 0,
};
}
int capture_screen = 0;
if (graphics_capture_consume(&capture_screen)) {
return ImageRequest {
.kind = ImageRequestKind::Capture,
.screen = capture_screen,
};
}
return std::nullopt;
}
void graphics_d3d9_process_screenshot_and_capture(
static void process_image_request(
IDirect3DDevice9 *device,
IDirect3DSwapChain9 *sub_swap_chain) {
const auto request = consume_image_request();
if (!request.has_value()) {
return;
}
IDirect3DSwapChain9 *sub_swap_chain,
const ImageRequest &request) {
auto copy = acquire_backbuffer_copy(
device,
sub_swap_chain,
request->screen);
request.screen);
if (!copy.has_value()) {
if (request->kind == ImageRequestKind::Capture) {
graphics_capture_skip(request->screen);
if (request.kind == ImageRequestKind::Capture) {
graphics_capture_skip(request.screen);
}
return;
}
dispatch_surface_save(*request, std::move(*copy));
dispatch_surface_save(request, std::move(*copy));
}
void graphics_d3d9_process_screenshot(
IDirect3DDevice9 *device,
IDirect3DSwapChain9 *sub_swap_chain) {
if (graphics_screenshot_consume()) {
process_image_request(device, sub_swap_chain, ImageRequest {
.kind = ImageRequestKind::Screenshot,
.screen = 0,
});
}
}
void graphics_d3d9_process_capture(
IDirect3DDevice9 *device,
IDirect3DSwapChain9 *sub_swap_chain) {
int screen = 0;
if (graphics_capture_consume(&screen)) {
process_image_request(device, sub_swap_chain, ImageRequest {
.kind = ImageRequestKind::Capture,
.screen = screen,
});
}
}