Skip to content

Connector state included in every atomic page-flip commit causes per-frame modeset on Samsung HDMI displays #265

@aashiksadar

Description

@aashiksadar

Description

Samsung Smart TV (M50D, 1920x1080@60Hz) connected via HDMI produces ~0.2s black screen flashes on every mouse click / window interaction. The same hardware, kernel, driver, cable, and HDMI port work perfectly under Sway 1.11 and in TTY, isolating the issue to Aquamarine's DRM handling.

Root Cause Analysis

DRM atomic traces (drm.debug=0x10) show that connector state is included in every page-flip commit, which triggers drm_atomic_helper_check_modeset on every frame:

drm_atomic_get_plane_state Added [PLANE:90:plane 1B] state
drm_atomic_get_crtc_state Added [CRTC:145:pipe B] state
drm_atomic_set_fb_for_plane Set [FB:307] for [PLANE:90:plane 1B]
drm_atomic_get_connector_state Added [CONNECTOR:271:HDMI-A-1] state      <-- should not be here on a page-flip
drm_atomic_helper_check_modeset Updating routing for [CONNECTOR:271:HDMI-A-1]
[CONNECTOR:271:HDMI-A-1] keeps [ENCODER:270:DDI B/PHY B], now on [CRTC:145:pipe B]

In wlroots (Sway's backend), page-flip commits typically include only plane and CRTC state — connector state is only added during actual mode changes. The Samsung TV appears to interpret the resulting AVI InfoFrame updates as a signal renegotiation, causing a brief blank.

Startup logs also show repeated:

ERR from aquamarine ]: drm: Cannot commit when a page-flip is awaiting

Environment

Component Detail
Aquamarine 0.10.0-2
Hyprland 0.53.3-2
Kernel 6.18.9-arch1-2
GPU Intel Raptor Lake-P Iris Xe (i915)
Display Samsung Smart M50D 32" (1920x1080@60Hz, HDMI)
Distro Arch Linux

Flicker Matrix

Compositor Result
TTY (fbcon) No flicker
Sway 1.11 No flicker
Hyprland 0.53.3 Flickers

A different monitor (Xiaomi) works fine on the same Hyprland setup, confirming this is a Samsung-specific sensitivity to the connector state in commits.

Ruled Out

All of the following were tested with no improvement:

  • Hyprland settings: blur, animations, hardware cursors, damage tracking, color management, direct scanout, VFR, VRR — all disabled individually
  • Aquamarine env vars: AQ_NO_ATOMIC=1, AQ_NO_MODIFIERS=1
  • Refresh rates: 60Hz, 59.94Hz, 50Hz
  • Kernel params: i915.enable_psr=0 i915.enable_fbc=0 i915.enable_dc=0
  • EDID overrides: Stripped deep color, ALLM, HDR, BT2020, game content type
  • HDCP: Content Protection = Undesired
  • Hardware: Multiple HDMI cables and TV ports
  • Multi-monitor: Flickers even as the sole display

DRM Connector Properties

Broadcast RGB: Automatic (0)
content type: Graphics (1)
Content Protection: Undesired (0)
max bpc: 8
Colorspace: Default (0)
HDR_OUTPUT_METADATA: (empty)

Suspected Fix

Aquamarine should avoid adding connector state to atomic commits when only performing a page-flip (no mode/connector property change). Properties like content_type, Colorspace, and HDR_OUTPUT_METADATA should only be included when they actually change.

This would align with wlroots behavior and prevent sensitive displays (Samsung TVs) from interpreting every frame as a signal renegotiation.

Related Issues

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions