为什么 KMS drmModeSetCrtc() 在 X11 session 中 运行 时因权限被拒绝而失败?

Why does KMS drmModeSetCrtc() fail with permission denied while running in X11 session?

标题已经暗示了问题,那么是什么阻止了这个 repo 中示例程序的执行 https://github.com/dvdhrm/docs/tree/master/drm-howto

这是一个显示 KMS 运行情况的简单程序,所以我下载了它,编译了它并给了它一个 运行。这是输出:

michael@lord:~/Downloads/docs/drm-howto$ sudo ./modeset
[sudo] password for michael: 
using card '/dev/dri/card0'
mode for connector 59 is 1920x1080
ignoring unused connector 68
ignoring unused connector 71
ignoring unused connector 75
cannot set CRTC for connector 59 (13): Permission denied
exiting

另请注意,我的机器上有一个 运行ning X11 session。 似乎 X 已经在使用设备 /dev/dri/card0 并阻止所有其他程序使用它。

这是我的显卡:

michael@lord:~/Downloads/docs/drm-howto$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 620 (rev 07)

我还添加了 i915.modeset=1/etc/initramfs-tools/modules 并用 sudo update-initramfs -u 重建它所以它从我的内核而不是从 xorg 端加载 driver。

也有可能我的driver不支持KMS,但lspci显示我只安装了一个内部intel显卡。所以我坚持使用默认从 xserver-xorg-core.

安装的 xorg core display driver 包

None 这些更改已经生效。 我可以执行这些示例的唯一方法是杀死 xorg session 并让它 运行 in tty.

有什么想法吗?

它按预期工作。只允许DRM-Master 进行模式设置,并且只能有一个DRM-Master。 X已经是master了。

您可以使用 drmSetMaster() 或在没有当前主设备时通过打开主设备节点隐式成为主设备。 (示例代码隐含地成为 DRM-Master。)

另见 drm-kms(7) man page