Commit Graph

4351 Commits

Author SHA1 Message Date
Geoffrey McRae
5dcfad9bb0 [idd] network: add transport session foundation 2026-11-06 14:37:37 +11:00
Geoffrey McRae
5ba1bda0c8 [common] network: define transport wire protocol 2026-11-06 14:37:37 +11:00
Geoffrey McRae
536516be19 [idd] postprocess: accept effective output alignment
Ignore the driver-selected texture alignment when validating external
compute-effect destinations.

Keep layout and resource flags in the comparison.
2026-11-06 14:37:37 +11:00
Geoffrey McRae
ca0738ec0d [client] windows: add WASAPI audio support 2026-11-06 14:34:25 +11:00
Geoffrey McRae
eabc56a6de [common/client] platform: abstract runtime services 2026-11-06 14:34:25 +11:00
Geoffrey McRae
a7d2e4592f [client] windows: add native display and input 2026-11-06 14:34:25 +11:00
Geoffrey McRae
18541865f0 [client] egl: add portable texture upload fallback 2026-11-06 14:34:25 +11:00
Geoffrey McRae
7ea69f3d1c [client] input: add platform-neutral keycodes 2026-11-06 14:34:25 +11:00
Geoffrey McRae
382f35e503 [common/client] ivshmem: add portable external frames 2026-11-06 14:34:25 +11:00
Geoffrey McRae
6d367d4ab2 [common/client] platform: make filesystem access portable 2026-11-06 14:34:25 +11:00
Geoffrey McRae
a60da36420 [common] windows: add native path and UTF support 2026-11-06 14:34:25 +11:00
Geoffrey McRae
62a8786fe2 [common/client] platform: add portable worker primitives 2026-11-06 14:34:25 +11:00
Geoffrey McRae
9c8343df96 [common/client] platform: make timing waits portable 2026-11-06 14:34:25 +11:00
Geoffrey McRae
d045ac6ba7 [client] build: add Windows platform composition 2026-11-06 14:34:25 +11:00
Geoffrey McRae
17e416c3f2 [obs] audio: capture guest playback
Subscribe the OBS source as a playback-only LGMP audio client. Decode
the advertised formats and channel maps, then resample into the OBS
clock domain without participating in driver clock feedback.

Keep queue and resampler storage fixed in the packet path.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
36e170d93a [client/idd] audio: support multiple playback clients
Replace the single-owner PCM queues with one shared LGMP SPMC stream.
Give each admitted client reliable state and an independent playback
cursor, while clients without clock authority resample locally.

Extend the audio protocol with per-client epochs and barriers.
Keep capture exclusive and bound authority backpressure so slow
secondary readers cannot affect the disciplined low-latency path.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
95234cea86 [client] audio: fall back when feedback is unavailable 2026-11-06 14:34:25 +11:00
Geoffrey McRae
56f3305fe8 [client/idd] audio: prevent recording transport stalls
Give microphone data priority over replaceable clock feedback and
reduce feedback traffic on the shared client-to-host FIFO.

Retry short FIFO stalls outside the realtime thread and coalesce
consecutive packets in the existing fixed Windows buffers.

Avoid one broker write per tiny PipeWire quantum without adding
allocations or intentional capture latency.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
efc9952e74 [idd] audio: support 32-bit and common channel layouts
Advertise signed and floating-point 32-bit formats across mono,
stereo, quad, surround, 5.1, and 7.1 at every supported rate.

Carry sample encoding through the broker and LGMP protocol so integer
and floating-point streams remain distinct.

Expand packet, shared-memory, and ring capacity for eight-channel
32-bit audio.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
5681dcdbe7 [idd] audio: discipline playback clock from client
Forward coalesced feedback through the broker to the render clock.

Keep capture independent and apply the rate to WaveRT timing.

Bound and slew targets, then restore unity when feedback stalls.

Withdraw feedback after the watchdog makes fallback safe.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
f7b1133785 [client] audio: poll LGMP streams at 25 microseconds
Use the active polling floor as the maximum wait and advertised
playback delivery reserve. Keep learned scheduling jitter adaptive.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
bf7c76c8db [idd] audio: stop paused streams after playback
Keep initial playback prewarming, but announce STOP when a stream that
has already run enters PAUSE or ACQUIRE. Restart it when RUN returns.

Keep RUN history across owner changes so a paused stream is not
mistaken for a new prewarm generation.

Only announce capture while it is running. Derive active status flags
from the stream generations successfully announced to the client.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
25d87e1c6d [client] lgmp: test same-generation audio restart
Queue playback STOP, START, and DATA for the same wire generation.
Verify that the client creates a fresh local generation and delivers the
first restarted packet.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
c162d760a1 [idd] audio: configure kernel driver debugging
Persist hardware-ID installation for the LGAudio WDK project and
enable deployment in every existing solution configuration.

This allows LGAudio to run as the kernel-debugger startup project.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
b8ab04507e [client] audio: complete LGMP shutdown release
Treat the binding phase as the authoritative shutdown state after
graceful stream release.

Cover disconnect while the host drains and unbinds both streams.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
f2f3787aec [client] audio: reduce LGMP poll reserve
Reduce the active LGMP poll bound and matching playback reserve from
250 us to 125 us.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
b75b90ff1d [idd] audio: publish render data promptly
Publish committed WaveRT render frames on a 4 kHz timer while keeping
packet completion and notification semantics unchanged.

Serialize clock sampling with position updates to prevent concurrent
queries from replaying elapsed time.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
4c395bb488 [client] audio: minimize LGMP playback latency
Scope the legacy latency offset to classic SPICE and use the LGMP
poll bound as its fixed arrival reserve. Keep learned jitter additive.

Select provider clock feedback only when the current remote endpoint
advertises it, avoiding a failed startup attempt on broker v1.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
2fa376b31b [client] audio: reduce LGMP stream latency
Poll active audio streams every 25 to 250 microseconds and reset the
adaptive delay whenever records arrive.
2026-11-06 14:34:25 +11:00
Geoffrey McRae
405233bfb9 [idd] audio: poll LGMP streams at low latency
Move audio ingress and playback-credit recovery off the display timer.
Poll through a dedicated MMCSS worker at sub-millisecond intervals.

Wake capture retries immediately and drain queued client records during
release so backpressure cannot stall recording or shutdown.
2026-11-06 14:32:15 +11:00
Geoffrey McRae
3cd005ac74 [client] audio: add optional LGMP transport 2026-11-06 14:32:14 +11:00
Geoffrey McRae
348f92d8b6 [idd] audio: bridge broker packets over LGMP streams
Add optional playback and capture streams to the LGMP transport.
Negotiate ownership over the existing control path and keep audio
availability isolated from display transport readiness.

Route broker packets through public LGMP stream APIs without changing
the LGMP queue table or shared-memory mapping.
2026-11-06 14:32:04 +11:00
Geoffrey McRae
947f03ede6 [idd] audio: add the mediated device connector
Open the optional audio broker from a passive worker and move bounded
playback and capture packets through a transport-neutral audio hub.

Attach audio sources after transport initialization without making audio
driver availability part of display transport readiness.
2026-11-06 14:01:34 +11:00
Geoffrey McRae
5e07786468 [idd] audio: add the mediated PCM data plane
Expose cancel-safe direct-I/O queues for reading rendered frames and
writing captured frames through the private broker endpoint.

Separate render and capture storage, publish format and state
generations, and preserve local loopback while no broker is bound.
2026-11-06 14:01:34 +11:00
Geoffrey McRae
e55cb8bd61 [common] audio: define the mediated LGMP stream protocol
Advertise optional audio mediation separately from runtime driver
availability, then negotiate ownership through the existing LGMP
client-control path.

Define fixed playback and capture stream records for packed PCM,
endpoint state, clock feedback, and targeted descriptor discovery.
Keep the LGMP queue table, recovery sidecar, and submodule unchanged.
2026-11-06 14:01:34 +11:00
Geoffrey McRae
c261fa053f [idd] audio: add mediated broker control endpoint
Expose a private, versioned control device that lets the IDD discover
and claim the active audio adapter without using the public PortCls
endpoints.

Restrict access to SYSTEM and UMDF hosts, track adapter and binding
generations, and keep broker failure optional. Reserve data-plane
capabilities without advertising them until PCM queues are available.
2026-11-06 14:01:34 +11:00
Geoffrey McRae
7c24b585af [idd] audio: add virtual playback and capture driver
Add a WaveRT adapter with render and capture endpoints backed by a
local ring buffer and shared presentation clock.

Advertise PCM formats through 192 kHz, eight channels, and packed
24-bit samples. Register LGAudio in the IDD solution and package it as
Looking Glass Audio.
2026-11-06 14:01:34 +11:00
Geoffrey McRae
1b485305d9 [release] B8-rc1
Some checks failed
build / client (Debug, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client (Debug, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client (Debug, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client (Debug, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / client (Release, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client (Release, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client (Release, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client (Release, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / module (push) Has been cancelled
build / host-linux (push) Has been cancelled
build / host-windows-cross (push) Has been cancelled
build / host-windows-native (push) Has been cancelled
build / idd (push) Has been cancelled
build / obs (clang) (push) Has been cancelled
build / obs (gcc) (push) Has been cancelled
build / docs (push) Has been cancelled
After many months of hard work from our team, I am pleased to announce
Beta 8 Release Candidate 1.

B8 is a major update that introduces the Looking Glass Indirect Display
Driver, direct input and clipboard transport, a new USB audio path,
end-to-end HDR support, and extensive latency and reliability
improvements.

As this is a release candidate, please report any regressions or other
issues encountered during testing.

If you like this project, find it useful, and would like to help support
its continued development, you can do so using the following platforms:

* [GitHub][github]
* [Ko-Fi][kofi]
* [Patreon][patreon]
* [PayPal][paypal]
* BTC: `14ZFcYjsKPiVreHqcaekvHGL846u3ZuT13`
* ETH: `0x6f8aEe454384122bF9ed28f025FBCe2Bce98db85`
* XMR: `47xM4zG7b2tEj4mnSywHve4ydZzn3wzhf22snDRB7aSEcXrgUBpoT2Z4phTnyFMi1sMyQtHbdufMYRQ2PzMn3PGUJAE1dpc`

[github]: https://github.com/sponsors/gnif
[kofi]: https://ko-fi.com/lookingglass
[patreon]: https://www.patreon.com/gnif
[paypal]: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick& hosted_button_id=ESQ72XUPGKXRY

B8 introduces protocol changes that are not compatible with B7. The
Looking Glass client, IDD, and OBS plugin must use matching versions.

The legacy Host Application remains available as a B7 workflow. Users
who require it should retain the complete B7 client, Host Application,
and OBS stack rather than mixing B7 and B8 components.

B8 requires Windows 10 version 1903 or newer. HDR and wide-color support
normally require compatible Windows 11 IddCx interfaces. Windows 10
continues to use the SDR-compatible path.

The Looking Glass Indirect Display Driver is now the recommended Windows
server. It creates its own virtual monitor, eliminating the need for a
physical display or dummy plug.

The IDD uses Direct3D 12 for accelerated capture and processing when a
suitable GPU is available. An SDR software fallback supports systems
without a usable render GPU.

A new installer includes the display driver, direct-input driver, tray
helper, and optional IVSHMEM driver installation. It can also disable
the legacy Host Application during migration.

The configuration interface supports custom resolutions, fractional
refresh rates up to 1000 Hz, preferred and default modes, dynamic guest
resolution, configuration reload and rollback, processing status, and
workarounds for problematic GPU drivers.

Keyboard and mouse input can now travel directly over LGMP using the
Looking Glass virtual HID device. This supports absolute desktop input,
relative captured input, media keys, up to 32 mouse buttons, and
keyboard lock-state synchronization.

Clipboard synchronization also runs directly over LGMP and supports
bidirectional text, images, and file transfers on both X11 and Wayland.
Transfers are streamed and pipelined to keep clipboard control
responsive while large files are being copied.

SPICE remains available as a fallback, but is no longer required for
primary IDD input or clipboard operation.

Looking Glass can now present an emulated USB Audio Class 2 device to
Windows through a SPICE USB-redirection channel.

It supports stereo, quadraphonic, 5.1, and 7.1 playback using 24-bit PCM
at up to 192 kHz, along with microphone recording and asynchronous clock
feedback. Classic SPICE audio remains available as a compatibility
fallback.

Audio buffering, synchronization, underrun recovery, and microphone
privacy handling have also been substantially improved.

B8 adds end-to-end HDR and wide-color support. The IDD transports HDR
metadata and the Windows display color transform, while the EGL renderer
can either present native HDR or tone-map it for an SDR display.

Native Linux HDR requires Wayland, an HDR-capable output, and compositor
support for `color-management-v1`. The OBS plugin can also capture the
HDR stream directly.

The IDD, client, and OBS plugin now coordinate frame delivery around
presentation deadlines. Superseded frames can be discarded before
transport, static regions avoid unnecessary copies, and different
consumers can operate at independent cadences.

Expanded timing graphs expose capture, GPU processing, shared-memory
transport, rendering, and presentation latency.

* Added the Looking Glass IDD as the recommended Windows server.
* Added a virtual monitor that does not require a dummy plug.
* Added accelerated Direct3D 12 capture and processing.
* Added an SDR software fallback for guests without a suitable GPU.
* Added a unified IDD, input driver, helper, and IVSHMEM installer.
* Added a tray configuration interface for display modes and status.
* Added custom resolutions and fractional refresh rates up to 1000 Hz.
* Added preferred modes, default refresh rates, and dynamic resolution.
* Added selectable direct-copy and indirect-copy GPU workarounds.
* Added filtering and sizing guidance for modes too large for IVSHMEM.
* Added direct keyboard and mouse input over LGMP.
* Added absolute and captured-relative mouse input modes.
* Added media-key, extended mouse-button, and keyboard LED support.
* Improved automatic keyboard capture and X11/Wayland input parity.
* Completed evdev hotplug, capture, mouse, and LED handling.
* Added direct bidirectional clipboard synchronization over LGMP.
* Added clipboard support for text, images, and files.
* Added seamless clipboard file handling for X11 and Wayland.
* Improved Caja, MATE, and Nautilus clipboard interoperability.
* Added streamed and pipelined clipboard transfers.
* Added the emulated Looking Glass USB Audio Class 2 device.
* Added multichannel 24-bit playback at up to 192 kHz.
* Added USB microphone recording and asynchronous clock feedback.
* Improved audio synchronization, jitter handling, and underrun
  recovery.
* Added HDR metadata and Windows display color-transform transport.
* Added native Wayland HDR using `color-management-v1`.
* Improved HDR-to-SDR tone mapping and SDR white-level handling.
* Added HDR support to the OBS plugin.
* Added presentation-aware frame scheduling across IDD, client, and OBS.
* Added damage-aware GPU copies and software texture uploads.
* Added independent scheduling for multiple frame consumers.
* Added expanded capture, transport, rendering, and presentation graphs.
* Added automatic SPICE fallback and session recovery.
* Added forced display recovery using the configured escape key plus
  `Shift+R`—`Scroll Lock+Shift+R` by default.
* Added mpv-compatible custom GLSL shader loading.
* Improved Wayland fractional scaling, pointer confinement, and warping.
* Improved DMA-BUF ownership, import performance, and damage handling.
* Added layout-independent hotkeys with translated key labels.
* Added non-Latin text support to the client overlay.
* Hardened shared-memory frame, cursor, queue, and clipboard validation.
* Retained aliases for settings moved from `app:*` to `lgmp:*`.
* Made RGB24 packing opt-in due to regressions on some integrated GPUs.
* Reworked the documentation around the current IDD workflow.
* Set Windows 10 version 1903 as the minimum supported guest.
B8-rc1
2026-11-06 13:39:17 +11:00
Geoffrey McRae
432f4a0c9a [idd] installer: require Windows 10 1903 or newer 2026-11-06 12:57:28 +11:00
Jonathan Rubenstein
fbf2607f4b [doc] Correct misspelled verison (not venison, but version!) 2026-11-06 12:38:55 +11:00
Jonathan Rubenstein
efd80d431b [doc] host_usage: Touchup 2026-11-06 12:38:55 +11:00
Jonathan Rubenstein
d9a27b6070 [doc] build_host: Touchup 2026-11-06 12:38:55 +11:00
Jonathan Rubenstein
c6beae30bf [doc] install_host: Touchup 2026-11-06 12:38:54 +11:00
Jonathan Rubenstein
ff1698e383 [doc] install_host: Remove toctree as it is already in legacy_host 2026-11-06 12:38:54 +11:00
Jonathan Rubenstein
9882358630 [doc] legacy_host: Touchup 2026-11-06 12:38:54 +11:00
Jonathan Rubenstein
5cc3eea120 [doc] tech_faq: Touchup 2026-11-06 12:38:54 +11:00
Jonathan Rubenstein
8c13203b8d [doc] faq: Touchup 2026-11-06 12:38:54 +11:00
Jonathan Rubenstein
f15d1bde4b [doc] obs: Touchup 2026-11-06 12:38:54 +11:00
Jonathan Rubenstein
3fb757fefd [doc] troubleshooting: Touchup 2026-11-06 12:38:54 +11:00
Jonathan Rubenstein
4d980d81b9 [doc] Move Client information when asking for help into troubleshooting 2026-11-06 12:38:54 +11:00