如何在不成为DRM主用户的情况下呈现到第二个屏幕?

时间:2018-12-10 20:04:21

标签: opengl embedded-linux yocto mesa

我有一个嵌入式过程,可以直接使用DRM和KMS API呈现到屏幕上。它在最小的Yocto发行版上运行(没有台式机或Wayland)。 我想渲染到另一个屏幕,该屏幕从另一个进程连接到同一GPU。第一个进程打开'/ dev / dri / card0'并成为事实上的DRM主设备,它可以在主屏幕上执行drmModeSetCrtc和drmModePageFlip以显示帧缓冲区。但是,如果我调用drmDropMaster,它将无法再进行页面翻转。因此,第二个进程无法使用相同的技术成为DRM主文件并呈现给其他显示器。

关于如何使用Direct Rendering Manager(DRM)和Kernel Mode Setting(KMS)渲染到一个屏幕有很多示例,但是我发现没有一个可以从另一个进程渲染到另一个屏幕。

设置显示模式后,如果可能的话,我希望没有母版,但是页面翻转也是受限制的API。如果无法实现,也许是一个有关如何使用drmAuthMagic授予第二个进程权限的示例?

1 个答案:

答案 0 :(得分:1)

如果不是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),

因此,我决定将翻转放置在关键部分,应用程序在其中调用drmSetMaster,安排翻转并调用drmDropMaster。繁重的工作,两个过程都需要扎根,但是对于嵌入式平台来说,它已经足够好了。但是,该过程必须使用drmGetMagic和drmAuthMagic对其进行授权,以使其能够在不是主节点的情况下进行渲染,并再次获得主控权。我会在它第一次成为主服务器并进行模式设置时执行此操作。