opengl 如何渲染到第二个屏幕,而不是DRM主?

gcmastyq  于 2023-03-22  发布在  其他
关注(0)|答案(1)|浏览(324)

我有一个嵌入式进程,它可以使用DRM和KMS API直接呈现到屏幕上(没有桌面或Wayland)。我想渲染到另一个进程连接到同一GPU的第二个屏幕。第一个进程打开“/dev/dri/card 0”并成为事实上的DRM主机,它可以执行drmModeSetCrtc &drmModePageFlip在主屏幕上显示帧缓冲区。但是,如果我调用drmDropMaster,它就不能再进行页面翻转了。因此,第二个进程不能成为DRM主进程并使用相同的技术渲染到另一个显示器。
有很多关于如何使用直接渲染管理器(DRM)和内核模式设置(KMS)渲染到一个屏幕的例子,但我发现没有一个可以从另一个进程渲染到第二个屏幕。
我想没有一个主如果可能的话一旦显示模式设置,但翻页也是一个受限制的API.如果这不能实现,也许一个关于如何使用drmAuthMagic授予第二个进程权限的例子?

q8l4jmvw

q8l4jmvw1#

如果不是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来授权自己,以便在它不是主进程时能够渲染,并再次获得主进程。我这样做时,它第一次成为主人,并做模式设置。

相关问题