Evan's Blog
EvanZhu0721 / 公开仓库

SBMS

镜像已同步

SBMS complete the calculation rules for the default logical desktop topology relationship and the physical dimensions of the displays in the Windows multi-screen collaboration system.

上游 GitHub
READ-ONLY MIRROR

README、源码与 Release 已保存到本站;源码视图固定到 commit a37d6c4b。

docs/architecture.md
来源 commit a37d6c4b 阅读模式 查看源码

Architecture

SBMS keeps policy in Rust and limits the C++ driver to the WDF/IddCx boundary.

tray / CLI
  -> mapping plan lifecycle
  -> protected multi-output session gate
  -> software display device
  -> minimal UMDF indirect-display driver (one stable connector per group)
  -> mirror groups: Desktop Duplication -> D3D11 scaling -> target window
  -> stream-only groups: virtual desktop stays available to an external capturer

The v7 gate contains up to sixteen connector-indexed modes. Its ACL permits the launching user, SYSTEM, LocalService and Administrators. One IDD adapter publishes every requested connector and drains their IddCx swap chains; it does not copy frames into shared memory. Connector indexes are stable identities and must not be inferred from Windows enumeration order.

Pixels remain on the GPU in the Rust renderer. For reductions up to 2:1 per axis, the shader integrates source-pixel area and suppresses high-frequency subpixel colour fringing. Other ratios use bilinear sampling.

The whole plan starts and stops as one transaction. Startup creates and confirms every virtual source before any mirror renderer starts. Shutdown releases all input capture and rendering, restores migrated windows, closes the single software-device handle, waits for every planned connector to disappear, and restores the saved physical topology once.

User configuration is stored as at most three named profiles in %LOCALAPPDATA%\SBMS\config-profiles-v1.json. The collection, active profile and per-profile revisions are committed atomically under a cross-process lock. On first use, the existing config-v2.json is preserved and imported as the default profile. The tray supports revision-checked live reloads without changing a mapping that is already running. See configuration.md for the storage, CLI, JSON and Rust API contracts.

An overwrite upgrade first asks the installed tray to exit cleanly so its in-memory edits are persisted. Setup then copies the current configuration and display overrides into a SHA-256-verified timestamped snapshot under %LOCALAPPDATA%\SBMS\upgrade-backups. Failure to stop the tray or verify the snapshot cancels the overwrite; normal uninstall remains responsible for removing user data.

See mapping-plan.md for the Rust and JSON interfaces.