桌面复制 API 和可切换图形

Posted

技术标签:

【中文标题】桌面复制 API 和可切换图形【英文标题】:Desktop Duplication API & switchable graphics 【发布时间】:2016-09-17 21:08:06 【问题描述】:

问题:当您在具有可切换显卡的机器上使用独立显卡控制器运行应用程序时,调用 IDXGIOutput1::DuplicateOutput method 会返回 DXGI_ERROR_UNSUPPORTED。

This answer 阐明了这个问题。简而言之,独立显卡只渲染屏幕的一部分并将数据发送到集成显卡控制器的帧缓冲区——换句话说,所有输出总是通过集成显卡控制器。看来这就是 DuplicateOutput 返回 DXGI_ERROR_UNSUPPORTED 的原因。

我编写了一个示例,该示例使用 winapi (EnumDisplayDevices function) 和 directx (IDXGIFactory::EnumAdapters method & IDXGIAdapter::EnumOutputs method) 获取所有输出及其视频适配器,以便在具有可切换显卡(Intel HD 4600 和 NVIDIA 840M)的机器。结果如下:

不确定我的比较可能有多正确,但您可以看到 winapi 表示 DISPLAY1 属于 Intel 卡,directx 表示 DISPLAY1 属于 NVIDIA 卡。一种解决方案是复制 Intel 卡的输出(因为一切都通过它),但 EnumOutputs 不为其返回任何输出。

目前有一个解决方法:始终使用集成图形控制器运行使用 Duplication API 的应用程序。

问题:如何使 DuplicateOutput 与带有可切换显卡的笔记本电脑上的独立显卡控制器一起工作?还是桌面复制 API 的限制?

【问题讨论】:

您的workaround 是怎样一种解决方法?如果桌面在集成卡上运行,那么您需要使用该适配器进行复制是否有意义?您使用独立适配器复制桌面的目标是什么? @MooseBoys,我的目标只是复制屏幕,使用哪个适配器都没有关系。集成或独立适配器的使用由 NVIDIA 设置决定,而不是由我作为开发人员决定。默认情况下,对于重型 WPF 应用程序,将选择离散适配器,并且只有其 dxgi 对象将具有输出(复制返回 DXGI_NOT_SUPPORTED 因为实际上所有内容都通过集成适配器进行 - 参见图片)。所以解决方法是要求用户在 NVIDIA 控制面板中强制使用 Intel 卡。问题是是否有没有解决方法的方法 【参考方案1】:

已解决:

很遗憾,出现此问题是因为 Desktop Duplication API 不支持在 Microsoft 上针对独立 GPU 运行 混合系统。按照设计,调用与错误代码一起失败 DXGI_ERROR_UNSUPPORTED 在这种情况下。

要解决此问题,请在集成 GPU 上运行应用程序 而不是在 Microsoft 混合系统上的独立 GPU 上。

从这里:https://support.microsoft.com/en-us/kb/3019314

【讨论】:

以上是关于桌面复制 API 和可切换图形的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu怎么从图形桌面切换到命令行界面

centos中怎么切换回到桌面

Ubuntu怎么从图形桌面切换到命令行界面

Ubuntu怎么从图形桌面切换到命令行界面

Ubuntu怎么从图形桌面切换到命令行界面

Ubuntu怎么从图形桌面切换到命令行界面