如何让应用程序独占地驱动HDMI输出,而不允许操作系统自动为显示输出进行配置?
例如,将标准的DVI/VGA作为主显示器,但使用设备文件将Mplayer视频输出发送到HDMI。
这是一个通过谷歌很难回答的问题。几乎每一个结果都与使音频在HDMI上工作有关。
下面的评论提到了使用单独的Xorg服务器。虽然这是一个有用的想法,但它没有回答我问过的一个问题,以及我暗示的一个问题:
1)如果它比其他显示器先加载,或者如果它是唯一的显示器(仅使用SSH进行登录),如何防止Linux希望将控制台放在那个显示器上? 2)如果没有X呢?我想直接将图形驱动到适配器。我能否使用标准功能从代码中执行此操作,而无需直接与驱动程序交互(可能已过时,但使用SVGALib或其他非X图形层)?
我查看了SVGALib(它很老)和SDL。后者在X内外都可以使用,甚至可以访问OpenGL。我通过某个论坛链接找到了1.3版本,但网站和FTP似乎只有1.2。总体而言,SDL是一个很好的解决方案,但它具有以下两个特定的缺点:
1)一般的创建设备调用接受设备索引,但完全忽略它:
司机特定的调用似乎有相同的缺陷。例如,DirectFB(我认为在控制台下提供图形):
例如,将标准的DVI/VGA作为主显示器,但使用设备文件将Mplayer视频输出发送到HDMI。
这是一个通过谷歌很难回答的问题。几乎每一个结果都与使音频在HDMI上工作有关。
下面的评论提到了使用单独的Xorg服务器。虽然这是一个有用的想法,但它没有回答我问过的一个问题,以及我暗示的一个问题:
1)如果它比其他显示器先加载,或者如果它是唯一的显示器(仅使用SSH进行登录),如何防止Linux希望将控制台放在那个显示器上? 2)如果没有X呢?我想直接将图形驱动到适配器。我能否使用标准功能从代码中执行此操作,而无需直接与驱动程序交互(可能已过时,但使用SVGALib或其他非X图形层)?
我查看了SVGALib(它很老)和SDL。后者在X内外都可以使用,甚至可以访问OpenGL。我通过某个论坛链接找到了1.3版本,但网站和FTP似乎只有1.2。总体而言,SDL是一个很好的解决方案,但它具有以下两个特定的缺点:
1)一般的创建设备调用接受设备索引,但完全忽略它:
(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实例下运行。