highascg

GPU output, screen consumers, and X11 (xrandr) — intended interaction

This document describes how screen destinations, CasparCG channel / screen consumers, Device View cabling, and OS-level display layout (xrandr) are meant to work together in HighAsCG. It is normative for product behaviour; implementation may lag until the linked work order is complete.


1. Roles of each layer

1.1 Screen destinations (tandem / routing config)

1.2 Device graph: channel → GPU connector

1.3 Default behaviour (override off)

When Override is not enabled for that screen:

  1. xrandr --mode (pixel resolution) should follow the bound screen destination’s effective format: standard mode tokens map to WxH (e.g. 720p50 → 1280x720), custom modes use destination width × height; refresh where applicable should align with destination fps / mode naming.
  2. xrandr --pos for that head should follow the channel / destination position used for that screen in the tandem layout (e.g. first screen at 0x0, next screen to the right of the previous head’s width so physical desktop matches logical canvas tiling).
  3. Applying layout (Apply GPU / POST /api/settings/apply-os) should recompute the full horizontal plan so all bound GPU heads stay consistent after any one destination or cable change.

1.4 Override behaviour (override on)

When the physical monitor cannot or should not match the channel’s native format (operator wants 1080p on a 720p channel path, lab test, EDID mismatch, etc.):

  1. The user enables Override for that GPU / screen row in Device View.
  2. They choose resolution from the EDID-backed dropdown and/or custom width × height × fps (same controls as today), then Apply GPU (or the combined save + apply path).
  3. xrandr must use that chosen mode and rate, not the destination’s pixel mode.
  4. Positions of subsequent heads must still be recalculated so the X desktop tiling matches the actual widths applied (override may change width; following screens’ --pos must shift).

1.5 Caspar vs OS

1.6 V-sync (NVIDIA screen consumers)

For good vsync on program screen outputs with an NVIDIA GPU:

  1. NVIDIA Settings: Sync to VBlank → Off (driver-level; HighAsCG sets __GL_SYNC_TO_VBLANK=0 and highascg-nvidia-x-apply.sh on install/ISO).
  2. Caspar screen consumer: V-sync → On (screen_N_vsync: true / <vsync>true</vsync> in generated config).

See screen-consumer-vsync-nvidia.md for rationale, verification, and operator steps.


2. Data flow summary

Screen destinations  ──►  Caspar config (channels, screen consumers, positions)
        │
        │  (default) same WxH + tiling hint
        ▼
Device graph edge  ──►  screen index N  ──►  xrandr: output=sysId, --mode, --pos
        │
        │  (override on)
        ▼
Inspector Override + dropdown/custom  ──►  xrandr --mode / --rate from user choice


4. Glossary

Term Meaning
Screen destination Logical output definition (mode, position on canvas, main index).
GPU connector (gpu_out) Physical video output; bound to a screen via graph edge.
Override User flag: OS xrandr mode/rate come from inspector, not from destination topology.

Last updated: 2026-05-15 — authored for HighAsCG Device View / OS layout alignment.