Commit Graph

668 Commits

Author SHA1 Message Date
Geoffrey McRae
ccff282cd0 [client/idd] network: preserve exact frame damage 2026-11-06 14:40:30 +11:00
Geoffrey McRae
ae031f6064 [client] egl: clear stale damage diagnostics 2026-11-06 14:40:30 +11:00
Geoffrey McRae
2021874ca9 [common/client] windows: avoid deprecated CRT calls 2026-11-06 14:40:25 +11:00
Geoffrey McRae
08b68ff740 [client] egl: avoid deprecated preset string copy 2026-11-06 14:40:25 +11:00
Geoffrey McRae
f9fa437c20 [client] egl: use compiler stack allocation builtin 2026-11-06 14:40:25 +11:00
Geoffrey McRae
57f18d7e80 [client] windows: add native clang-cl build
Build the Windows client against the MSVC ABI while retaining clang
language support. Use vcpkg for ANGLE and libsamplerate, and build
MsQuic with its bundled static OpenSSL.
2026-11-06 14:40:25 +11:00
Geoffrey McRae
ed3b269919 [client] egl: import shared GPU textures 2026-11-06 14:37:38 +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
8fbe3e7454 [repos] lgprotocol: import shared protocol definitions
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
Add LGProtocol as a pinned submodule and consume its KVMFR protocol
definitions throughout the client, host, IDD, OBS, and profiler.

Keep Looking Glass framebuffer helpers local while removing duplicated
protocol headers and migrating users to KVMFR-scoped types.
2026-09-01 20:58:25 +10:00
Geoffrey McRae
56ea0cfaba [client] opengl: validate framebuffer uploads 2026-08-24 19:13:11 +10:00
Geoffrey McRae
50b7ca603a [client] opengl: retain deferred frame leases 2026-08-24 19:13:11 +10:00
Geoffrey McRae
b78b92a53f [client] opengl: clean up failed configuration 2026-08-24 19:13:10 +10:00
Geoffrey McRae
ef8636cbeb [client] lgmp: snapshot and validate frame layouts 2026-08-24 19:13:10 +10:00
Geoffrey McRae
50b1c9b2e2 [client] cursor: validate shape geometry 2026-08-24 19:13:10 +10:00
Geoffrey McRae
636e55db0d [client] egl: drop incomplete frames 2026-08-17 01:27:26 +10:00
Geoffrey McRae
f9a60bd2d1 [client] opengl: optimize software surface uploads 2026-08-12 05:31:45 +10:00
Geoffrey McRae
0c21577e9e [client] render: optimize software surface fills 2026-08-12 05:31:45 +10:00
Geoffrey McRae
5e8066609a [client] egl: track software surface damage 2026-08-12 05:20:56 +10:00
Geoffrey McRae
1a236c5e3a [client] egl: upload software surface damage only 2026-08-12 05:20:56 +10:00
Geoffrey McRae
2bd0db1a26 [client] renderers: generalize software surface updates 2026-08-11 15:07:35 +10:00
Geoffrey McRae
ea6e155bbf [client] metrics: correlate Wayland presentation timing 2026-08-06 18:04:10 +10:00
Geoffrey McRae
3d1064001d [client] scheduler: qualify presentation feedback
Track cadence, interruption, and calibration wake reasons independently
across X11 and Wayland. Feed phase correction back only when a pure
cadence wake renders the exact frame that was queued at that wake.

Propagate EGL swap results through the display-server boundary. Reject
failed presentations and keep pending Wayland HDR descriptions inactive
until the preceding surface commit succeeds.
2026-08-06 18:02:08 +10:00
Geoffrey McRae
05f3b39b43 [client] egl: snapshot DMA frames before release
Copy imported IVSHMEM frames into renderer-owned textures before
acknowledging their LGMP messages. Hold each lease until its copy fence
signals, and protect selected snapshots until rendering completes.

Track independent delivery lanes, drain acknowledgements on the frame
thread, and recover stale queue subscriptions after host timeouts.
2026-08-06 18:02:08 +10:00
Geoffrey McRae
13a34b383d [client] egl: retain damage until texture is drawable
Treat a failed desktop texture bind as an incomplete render so full target
restoration remains latched until a frame can actually be drawn.

Carry retired damage into the pending record when the drawable texture does
not contain it, closing the publication gap between texture slots and their
matching damage metadata.
2026-08-05 18:04:26 +10:00
Geoffrey McRae
c7ed04412e [client/idd/obs] scheduler: isolate timing owner delivery 2026-08-05 15:45:30 +10:00
Geoffrey McRae
ad53a5e4ee [client] egl: stop aliasing damage tracking layouts
Pass damage rectangle arrays and counts explicitly to the EGL mesh
updater instead of casting DesktopDamage to DamageRects.
2026-08-04 10:54:45 +10:00
Geoffrey McRae
adf3101a1a [client] egl: fix non-DMA font atlas corruption
Unbind the streamed desktop pixel upload buffer before ImGui processes
CPU-backed font atlas updates.

This prevents atlas pointers from being interpreted as PBO offsets when
DMA is disabled, which caused newly requested glyphs to be missing.
2026-08-03 23:53:33 +10:00
Geoffrey McRae
fbe08d00ce [client] expose EGL stages in frame latency
Correlate received frames with the texture update actually consumed by
the renderer and retain damage until its token becomes renderable.

Split client latency into dispatch, import, queue, preparation, setup,
effects, desktop, composition, and swap stages in FRAME LATENCY.
Exclude diagnostic overlay work from composition and preserve client
wait time when producer timing is unavailable.

Publish joined samples through a bounded token queue, avoid sleeping
while producer timing is finalized, and correct Wayland photon units.
2026-08-03 23:53:33 +10:00
Geoffrey McRae
aa289fa022 [client/host/idd] correct frame timing attribution
Use calibrated copy-queue timestamps to separate source and effect
waits from the actual framebuffer copy.

Exclude producer readiness waits from client import timing so the
same interval is not counted in both Copy and Import.
2026-08-03 23:53:33 +10:00
Geoffrey McRae
4f39270736 [client] add ImPlot and rework latency graphs 2026-08-03 23:53:33 +10:00
Geoffrey McRae
fab9961c49 [client] egl: fix streamed texture post-processing race
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
build / client-tests (Debug, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client-tests (Debug, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client-tests (Debug, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client-tests (Debug, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / client-tests (Release, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client-tests (Release, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client-tests (Release, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client-tests (Release, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
2026-07-31 14:15:17 +10:00
Geoffrey McRae
74ae4f543e [client] tests: add framebuffer rendering validation
Add an optional EGL framebuffer capture path for the test transport.
Capture the fully composed frame before presentation and retain its
surface format and HDR state for validation.

Add GoogleTest integration tests which run the production client
under a headless Weston compositor and compare every output pixel
against an independent reference implementation.

The matrix covers BGRA, RGBA, BGR32, RGB24, PQ RGBA10 and scRGB
RGBA16F with full, moving, overlapping, maximum-count, invalid, null
and zero-area damage rectangles. Validate HDR-to-SDR conversion and
native HDR output metadata when supported by the compositor.

Keep tests opt-in through ENABLE_RENDER_TESTS and document how to run
the software and native HDR tiers.
2026-07-30 15:23:03 +10:00
Geoffrey McRae
5c5a2f15d8 [client] egl: fix RGB24 odd pitch defect 2026-07-30 15:14:29 +10:00
Geoffrey McRae
f5dee45adc [client] renderers: only rebuild the font atlas if marked dirty 2026-07-30 15:14:29 +10:00
Geoffrey McRae
4f02eda913 [client] overlay: add ImGui support for non-latin characters 2026-07-30 12:39:47 +10:00
Geoffrey McRae
e754f5841e [client] keybind: use physical keycodes for layout-independent hotkeys
Fixes #1298
2026-07-30 10:21:26 +10:00
Geoffrey McRae
36b33033a1 [client] transport: introduce pluggable frame transports
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
Move shared-memory ownership, LGMP session handling, queue access, and
DMA setup behind a transport interface. The LGMP backend preserves the
existing zero-copy frame and DMA paths while owning its lgmp:* options.

Expose the initialized EGL context through a versioned renderer interop
record for future accelerated decode backends. Add an LGMP-independent,
deterministic test transport for graphics-pipeline validation.
2026-07-29 13:36:49 +10:00
Geoffrey McRae
4ef6672e64 [client] egl: uninitialized value release build failure
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
2026-07-28 13:45:57 +10:00
Geoffrey McRae
5c7431dfd6 [client] spice: validate bitmap fills and prevent potental VLA crash 2026-07-28 12:12:38 +10:00
Geoffrey McRae
1b0e1cf74b [client] egl: correct CAS processing for HDR
Convert HDR scRGB input to normalized linear Rec.2020 before CAS, then
convert the filtered result back to scRGB. Use the content metadata to
select an appropriate normalization peak while leaving SDR unchanged.

This follows AMD's documented recommendation for applying CAS to HDR
content and prevents HDR highlights from being clamped and dimmed.
2026-07-23 09:44:00 +10:00
Geoffrey McRae
697bbc6601 [client] egl: restore effects for PQ frames
PQ sources excluded every external filter from the post-process chain.
Decode PQ/BT.2020 into FP16 linear scRGB before active effects and pass
the resulting transfer state to the desktop shader.

Keep the raw PQ path when no effect is active. This avoids adding a
conversion pass or per-frame latency to the common case.
2026-07-23 09:44:00 +10:00
Geoffrey McRae
0b9603d398 [client] egl: compose native PQ output in linear light
Decode PQ/BT.2020 desktop pixels into an FP16 linear scRGB target before
compositing the color cursor, ImGui, damage overlay, and letterboxing.
Encode the damaged result to PQ once at the surface boundary. Keep logical
AND/XOR cursor masks in the encoded domain.

This preserves premultiplied cursor edges, prevents encoded-domain
blending, uses the Wayland output reference white for local overlays, and
keeps guest cursor white and display calibration independent from frame
SDR white. It also corrects HDR-to-SDR absolute luminance scaling, gamut
matrices, black handling, and buffer-age repair for the extra pass.

Suppress overlays when their conversion framebuffer is unavailable rather
than allowing unconverted sRGB draws into an HDR target.

Use named transfer constants for cursor shader state. Convert clipped
surface rectangles explicitly before using the frame-damage merge helper,
which avoids mixing its unsigned type with the EGL surface rectangle type.

Only advertise native PQ when the FP16 composition target is available.
SDR and native scRGB retain their direct single-pass paths.
2026-07-23 09:44:00 +10:00
Quantum
7cb6c9057c [client] clean up manual versions of ARRAY_LENGTH macro 2026-07-23 09:44:00 +10:00
Geoffrey McRae
3dd41f242e [client] egl: fix SPICE video rendering to a HDR surface
If the last state had HDR enabled, the spice video surface was being
rendered as HDR even though the SPICE video content is SDR. This
corrects this.
2026-07-23 09:44:00 +10:00
Geoffrey McRae
0e14e9c357 [client] egl: make native HDR encoding-safe
Request true floating-point EGL configs for scRGB and expose the native
encodings supported by the selected surface. Fall back to software HDR
mapping when the surface cannot represent the incoming wire format.

Resample PQ in linear light, keep SDR-only effects out of native PQ
chains, and consume the cursor-specific white level without changing
binary monochrome cursor mask operations.
2026-07-23 09:44:00 +10:00
Geoffrey McRae
a047b7d68a egl: follow active native HDR state
Keep software HDR mapping enabled until the display server activates the
requested image description. Re-evaluate the state while rendering so
asynchronous readiness or failure updates the desktop, cursor, and overlay
together with a full redraw.
2026-07-23 09:44:00 +10:00
Geoffrey McRae
c0b0aa0566 [all] fix copyright headers 2026-07-23 09:44:00 +10:00