如何才能从应用程序中专门驱动 HDMI 输出,而不允许操作系统自动将其配置为显示输出?
例如,使用标准 DVI/VGA 作为主显示器,但使用设备文件将 Mplayer 视频输出发送到 HDMI。
通过谷歌很难回答这个问题。几乎每个结果都与通过 HDMI 实现音频工作有关。
(此处编辑)
下面的评论提到使用单独的 Xorg 服务器。尽管这是一个有用的想法,但它并没有回答我提出的一个问题以及我暗示的一个问题:
1) 如果 Linux 在其他显示器之前加载控制台,或者它是唯一的显示器(当仅使用 SSH 登录时),如何阻止 Linux 将控制台放在该显示器上?
2)如果没有X怎么办?我想直接将图形驱动到适配器。我可以使用标准功能从代码中执行此操作,而不直接与驱动程序交互(可能已经过时,但使用 SVGALib 或其他一些非 X 图形层)?
(此处编辑)
我查看了 SVGALib(旧的)和 SDL。后者可以在 X 内部和外部工作,甚至提供对 OpenGL 的访问。我通过某个论坛链接找到了 1.3 版本,但网站和 FTP 似乎都只有 1.2 版本。总的来说,SDL 是一个很好的解决方案,但它有以下两个具体缺点:
1) 一般的 create-device 调用接受设备索引,但完全忽略它:
(src/video/bwindow/SDL_bvideo.cc)
BE_CreateDevice(int devindex)
特定于驱动程序的调用似乎也有同样的缺陷。例如,DirectFB(我假设它在控制台下提供图形):
(src/video/directfb/SDL_DirectFB_video.c)
DirectFB_CreateDevice(int devindex)
这些函数的主体似乎都没有设置设备索引的现有位置......毫无疑问,由于缺乏它们所构建的标准接口的支持。
2) 无论选择哪种适配器,SDL 似乎都会自动将所有显示器连接在一起。示例“testsprite2.c”(随库一起提供)接受“--display”参数,该参数在“common.c”(所有示例的通用功能)中处理。您可以看到,它使用“--display”参数所做的就是计算一个大的组合画布内该屏幕的 X/Y 坐标:
if (SDL_strcasecmp(argv[index], "--display") == 0) {
++index;
if (!argv[index]) {
return -1;
}
state->display = SDL_atoi(argv[index]);
if (SDL_WINDOWPOS_ISUNDEFINED(state->window_x)) {
state->window_x = SDL_WINDOWPOS_UNDEFINED_DISPLAY(state->display);
state->window_y = SDL_WINDOWPOS_UNDEFINED_DISPLAY(state->display);
}
if (SDL_WINDOWPOS_ISCENTERED(state->window_x)) {
state->window_x = SDL_WINDOWPOS_CENTERED_DISPLAY(state->display);
state->window_y = SDL_WINDOWPOS_CENTERED_DISPLAY(state->display);
}
return 2;
}
因此,如果一台显示器位于同一适配器上,则无法将它们与另一台显示器隔离。 SDL 将不起作用。
除非有与 SDL 类似的解决方案,或者事实证明在适当的位置设置特定设备 (devindex) 是微不足道的(情况可能并非如此,因此,这可能是它未实现的原因),否则似乎独占和完全专用屏幕的最佳选择是在分配给第二个设备的单独 Xorg 实例下编写自己的窗口管理器。