我有一个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
);
运行得很好。我正在努力决定何时将DriverType设置为WARP而不是硬件。有没有我可以调用的功能,它会告诉我系统上是否有硬件支持?
我正在使用DX 11功能级别9_1。
答案 0 :(得分:2)
这就是通常的方法:只需尝试使用您期望的所有参数D3D11CreateDevice()
即可,包括D3D_DRIVER_TYPE_HARDWARE
(在循环中尝试不同的功能级别,以找到最佳效果)。如果这将失败,请回滚到WARP。如果WARP失败,请回滚到软件,D3D9,GL等。如果所有可能的变体都失败,请通知用户他需要升级他的机器和/或操作系统=)
每次尝试检查返回码,设备和上下文指针。当你找到(HRESULT == S_OK) && (device != 0) && (context != 0)
- 宾果!
希望它有所帮助。
答案 1 :(得分: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
它说:
如果DriverType == D3D_DRIVER_TYPE_HARDWARE,则使用的适配器将是 默认适配器,它是第一个枚举的适配器 IDXGIFactory1 :: EnumAdapters。
或者,如果您想在WARP或硬件之间进行控制,请使用EnumAdapters获取可用的适配器:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb174538(v=vs.85).aspx
如果安装了某些第三方软件适配器,这将为您提供更多控制。