如何在不成为 DRM 大师的情况下渲染到第二个屏幕?

Fri*_*itz 6 opengl embedded-linux mesa yocto

我有一个嵌入式进程,可以使用 DRM 和 KMS API 直接呈现到屏幕上。它运行在最小的 Yocto 发行版上(没有桌面或 Wayland)。我想从另一个进程渲染到连接到同一个 GPU 的第二个屏幕。第一个进程打开'/dev/dri/card0'并成为事实上的DRM master,它可以在主屏幕上执行drmModeSetCrtc & drmModePageFlip来显示帧缓冲区。但是,如果我调用 drmDropMaster,它就不能再进行翻页了。因此,第二个进程不能成为 DRM 母版并使用相同的技术渲染到另一个显示器。

有很多关于如何使用直接渲染管理器 (DRM) 和内核模式设置 (KMS) 渲染到一个屏幕的示例,但我发现没有一个可以从另一个进程渲染到第二个屏幕。

一旦设置了显示模式,如果可能的话,我想没有大师,但翻页也是一个受限制的API。如果这无法实现,也许是一个关于如何使用 drmAuthMagic 授予第二个进程权限的示例?

Fri*_*itz 6

没有成为 DRM 大师就不可能进行翻页。IOCTL 在 drm_ioctl.c 中受到保护:

DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED)
DRM_IOCTL_DEF(DRM_IOCTL_SET_MASTER, drm_setmaster_ioctl, DRM_ROOT_ONLY),
DRM_IOCTL_DEF(DRM_IOCTL_DROP_MASTER, drm_dropmaster_ioctl, DRM_ROOT_ONLY),
Run Code Online (Sandbox Code Playgroud)

所以我决定将翻转放入关键部分,应用程序调用 drmSetMaster,安排翻转,并调用 drmDropMaster。它是繁重的,两个进程都需要 root,但它对于嵌入式平台来说已经足够好了。该过程必须使用 drmGetMagic 和 drmAuthMagic 授权自己,以便它能够在它不是主人时进行渲染并再次获得主人权。当它第一次成为主并执行模式设置时,我会这样做。