我有一个DX11应用程序,我想在其中添加对软件渲染的支持。这是因为在某些情况下,它将在没有 GPU 的机器上运行。从我所做的研究来看,我最好的选择似乎是WARP的。
将应用程序更改为使用 WARP 非常简单:
hr = D3D11CreateDevice(
NULL,
D3D_DRIVER_TYPE_WARP, // was D3D_DRIVER_TYPE_HARDWARE
NULL,
creationFlag,
featureLevels,
ARRAYSIZE(featureLevels),
D3D11_SDK_VERSION,
&mDevice,
&mFeatureLevel,
&mDeviceContext
);
它运行良好。我正在努力确定何时将驱动程序类型设置为WARP而不是硬件。是否有我可以调用的函数来告诉我系统上是否提供硬件支持?
我使用的是 DX 11 功能级别 9_1。
通常是这样做的:只需尝试使用您期望的所有参数进行D3D11CreateDevice()
,包括D3D_DRIVER_TYPE_HARDWARE
(尝试循环中的不同功能级别,以找出最佳)。如果此操作失败,请回滚到 WARP。如果 WARP 失败,请回滚到软件、D3D9、GL 等。如果所有可能的变体都将失败,请通知用户他需要升级他的机器和/或操作系统 =)
每次尝试检查返回代码以及设备和上下文指针。当你找到(HRESULT == S_OK) && (device != 0) && (context != 0)
- 宾果游戏!
希望对您有所帮助。
我认为如果硬件不可用,硬件将下降到软件:
http://msdn.microsoft.com/en-us/library/windows/desktop/ff476328(v=vs.85).aspx
具体说来:
http://msdn.microsoft.com/en-us/library/windows/desktop/ff476082(v=vs.85).aspx
哪里说:
如果驱动程序类型 == D3D_DRIVER_TYPE_HARDWARE,则使用的适配器将是 默认适配器,这是枚举的第一个适配器 IDXGIFactory1::EnumAdapters.
或者,如果要在 WARP 或硬件之间进行控制,而不是其他任何内容,请使用枚举适配器获取可用的适配器:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb174538(v=vs.85).aspx
这为您提供了更多的控制,以防安装了某些第三方软件适配器。