cfg: d3d9 standalone configurator (#720)

## Description of change
**Configurator (spicecfg.exe)**

- Attempts to create a D3D9 device on startup and uses the hardware
ImGui DX9 path when successful; falls back to the existing software
rasterizer automatically if D3D9 init fails.
- Rewrites the configurator window loop: refresh-rate-aware render
timer, minimize/resize/`WM_DISPLAYCHANGE` handling, direct Win32 ->
ImGui input (keyboard, mouse, wheel), and optimized software painting
via `SetDIBitsToDevice` instead of per-frame GDI `HBITMAP` allocation.

**Overlay / input (scoped to standalone configurator)**

- Skips expensive per-frame rawinput polling in
`ImGui_ImplSpice_NewFrame` when `CONFIGURATOR_STANDALONE` is set (Win32
messages drive input instead).
- Adds software-renderer idle-frame detection (`sw_pixels_dirty` +
draw-data hash) so spicecfg only repaints when pixels actually change.
- Adds `ImGuiWindowFlags_NoScrollWithMouse` on the configurator root
window to prevent scroll jolt on non-scrollable child widgets.
This commit is contained in:
drmext
2026-05-30 19:52:35 +00:00
committed by GitHub
parent 31aabe9786
commit 4c73200f58
8 changed files with 721 additions and 93 deletions
+4
View File
@@ -78,6 +78,10 @@ namespace overlay::windows {
this->flags |= ImGuiWindowFlags_NoTitleBar;
this->flags |= ImGuiWindowFlags_NoCollapse;
this->flags |= ImGuiWindowFlags_NoDecoration;
// prevent the parent window from absorbing wheel events when a hovered
// child has no scrollable content (otherwise the parent's tiny overflow
// causes the whole UI to jolt by a few pixels each tick)
this->flags |= ImGuiWindowFlags_NoScrollWithMouse;
}
this->flags |= ImGuiWindowFlags_MenuBar;