以编程方式确定是否需要使用硬件光栅化器

时间:2014-02-10 19:51:35

标签: directx direct3d warp

我有一个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。

2 个答案:

答案 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

如果安装了某些第三方软件适配器,这将为您提供更多控制。