[PATCH v2 0/3] drm/amd/display: HDMI 1.4 3D output (frame packing, top-and-bottom, side-by-side)
From: Adrian Betschart
Date: Mon Sep 07 2026 - 09:03:29 EST
amdgpu has never exposed the HDMI 1.4 3D modes that drm_edid derives
from a sink's HDMI VSDB: stereo_allowed is false on every connector, so
a 3D-capable TV or projector connected to a Radeon card cannot be driven
in frame-packing, top-and-bottom or side-by-side mode, although i915
has supported exactly this for a decade and the media players that
produce 3D frames (Kodi, mpv with 3D filters) only need the mode to
exist.
These three patches add it for native HDMI connectors, in the simplest form
that works on the hardware: the source packs both views into the frame
and the display core scans that frame out as ordinary 2D; the only
3D-specific output is the HDMI vendor infoframe. The reason it has to
be done this way is in patch 1: any of DC's stereo timing formats,
including the SW_PACKED ones, makes the hardware treat the surface as
two views and paint the whole frame into each half. Patch 2 adds the
3D_Ext_Data byte to the top-and-bottom vendor infoframe, without which
at least JVC D-ILA projectors do not engage 3D (Amlogic sources send
it, which is why those work with the same projector). Patch 3 sizes
the stream and the plane viewport by the doubled frame-packing timing
so each eye receives its own view rather than a stretched copy of the
first.
Tested on a Radeon RX 7600 (Navi 33, DCN 3.2.1) driving a JVC
DLA-RS4100 through an HDFury VRROOM, with Kodi (LibreELEC, GBM) as the
source, on a 7.2.3 kernel carrying these patches; the series here is
rebased onto amd-staging-drm-next and compile-tested there, and the
amdgpu_dm connector (308) and plane (95) KUnit suites pass; the freesync suite
crashes the same way on the unpatched base. All three layouts
engage the projector's 3D mode at 1920x1080p24, RGB 12 bpc, with
correct per-eye geometry (row-coded test frames read back through each
eye of shutter glasses) and correct eye assignment; frame packing is
also the format the projector uses for Blu-ray 3D.
Known limitation, not addressed here: a framebuffer with DCC enabled
does not scan out in a frame-packed mode on this GPU (the first flip
after the modeset never completes and the pipe wedges); the source has
to allocate the 3D framebuffer without DCC. A separate report will
follow once it is better understood.
Two unrelated FRL/DSC issues found on the same setup are tracked as
drm/amd issues 5770 and 5771.
v2 (all three findings came from the Sashiko review bot, and all held up):
- 1/3: a stereo mode keeps its own CRTC timing in
decide_crtc_timing_for_drm_display_mode() - with scaling enabled, or
when the sink's native mode is the 2D twin of the stereo mode's base
timing, the native timing was copied over the doubled frame-packing
timing; and amdgpu_dm_is_freesync_video_mode() rejects a
stereo-flagged mode, which otherwise could be replaced by the 2D
FreeSync base mode and lose its 3D flags. KUnit cases for both.
- 3/3: the plane KUnit mocks now set hdisplay/vdisplay as well as the
crtc_* size, which drm_mode_get_hv_timing() derives the size from;
dm_test_helper_check_state_scaling_caps failed otherwise.
- 2/3: unchanged.
Adrian Betschart (3):
drm/amd/display: support HDMI 1.4 3D modes on HDMI connectors
drm/amd/display: send the 3D_Ext_Data byte for top-and-bottom too
drm/amd/display: size frame-packed streams by the doubled timing
.../display/amdgpu_dm/amdgpu_dm_connector.c | 65 +++++++++++++--
.../amd/display/amdgpu_dm/amdgpu_dm_plane.c | 13 ++-
.../tests/amdgpu_dm_connector_test.c | 80 +++++++++++++++++++
.../amdgpu_dm/tests/amdgpu_dm_plane_test.c | 12 +++
drivers/gpu/drm/amd/display/dc/dc_stream.h | 7 ++
.../display/modules/info_packet/info_packet.c | 4 +
6 files changed, 171 insertions(+), 10 deletions(-)
--
2.43.0