帧封装是一种通过 HDMI 发送垂直堆叠在一帧内的左视图和右视图(用于立体 3D)的方法。如果每个视图的大小为 ,则width x height
生成的“封装”帧的大小为width x 49/24 height
,即两个视图之间有一些空白行。
对于 1080p,这会产生 1920x2205 大小的帧。对于大多数全高清(但不是超高清或类似)设备,帧打包是向每只眼睛发送全高清视图的唯一方法。
以下方法可以设置尺寸:
cvt cvt 1920 2205 24 #generate Modeline
xrandr --newmode "1920x2205_24.00" .... #Modeline
xrandr --addmode HDMI1 "1920x2205_24.00"
xrandr --output HDMI1 --mode 1920x2205_24.00
但是,立体模式需要通过指定 3D 模式的所谓信息帧来通知电视/投影仪。虽然内核支持发送这些信息帧,但 xrandr 等不允许将相关信息传递给 drm。
我怎样才能让内核发送所需的信息帧?
附言:由于缺少声誉,我无法添加标签“stereo3d”。标签“3d”不适合。
答案1
以下解决方案不提供任何保证。请注意,发送违反标准的 HDMI 信号可能会对您的电视/投影仪造成不利影响,并且以下微小的黑客会破坏抽象层,这些抽象层的引入是有原因的。请不要要求提供内核补丁(即在那里提交错误)。
一种方法是对 drm 内核模块进行微小的修改。请阅读如何(方法)仅构建一个内核模块?第一的。
您需要修改的文件是:驱动程序/gpu/drm/drm_edid.c。 我们改变这行到:
s3d_flags = (mode->flags & DRM_MODE_FLAG_3D_MASK) ||
(mode->vdisplay == 2205);
并插入这里以下几行:
if(mode->vdisplay == 2205)
return HDMI_3D_STRUCTURE_FRAME_PACKING;
drivers/gpu/drm/Makefile
根据开头提到的问题,在编译 drm 模块之前,您应该删除大多数(如果不是全部)显卡特定模块。请注意,您必须更新 initramfs,因为 drm 模块是在启动时加载的。
此解决方案已使用 Epson 投影仪和英特尔显卡(使用 i915)进行了测试。在修改 drm 模块之前,您应该检查您的显卡内核模块是否实际使用了 drm 模块的相关功能。否则,此 hack 毫无意义。