【问题标题】:How to render to a second screen without being the DRM master?如何在不成为 DRM 大师的情况下渲染到第二个屏幕?
【发布时间】:2019-05-11 18:37:21
【问题描述】:

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

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

一旦设置了显示模式,我希望没有master,但是页面翻转也是一个受限的API。如果这无法实现,也许可以举个例子说明如何使用 drmAuthMagic 授予第二个进程权限?

【问题讨论】:

  • 这与 OpenGL 有什么关系?我的意思是,如果您使用 Mesa,那么一些 glX 上下文函数将帮助您将每个 Display 附加到上下文。
  • @Ripi2:GLX 假设 X11,它没有在这里运行。对于大多数纯 KMS+GBM 环境,OpenGL 是使用的事实上的标准图形 API。因此,虽然不完全与 OpenGL 相关,但它足够接近,opengl 标签的读者可能知道答案。
  • @Ripi2:没有 DRM 或 KMS 的标签。一旦通过了内核安全性,我最终想要使用 OpenGL。我希望可能有一个内核补丁可以完全绕过它。
  • @datenwolf:感谢有趣的阅读。我没有想到,但 VR 与我的应用程序密切相关,因为延迟是一个主要问题,它需要驱动外部显示器。我意识到我的问题非常具体,可能没有简单的解决方案。

标签: opengl embedded-linux yocto mesa


【解决方案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。它很重,两个进程都需要root,但它对于嵌入式平台来说已经足够好了。该过程必须使用 drmGetMagic 和 drmAuthMagic 进行自我授权,以便它能够在不是主控时进行渲染并再次获得主控权。当它第一次成为主人并设置模式时,我会这样做。

【讨论】:

  • 我认为你可以在没有 root 的情况下运行它。至少在我的 Linux 上,card0/card1 文件允许访问video 安全组的成员,renderD128 文件允许访问render 安全组的成员。将自己添加到这些组中,它应该可以在没有 root 的情况下工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
  • 2018-06-27
  • 2020-05-24
  • 1970-01-01
  • 2018-09-19
  • 2019-06-14
相关资源
最近更新 更多