Directx 通过编程确定是否需要使用硬件光栅化器

Directx 通过编程确定是否需要使用硬件光栅化器,directx,direct3d,warp,Directx,Direct3d,Warp,我有一个DX11应用程序,我想添加对软件渲染的支持。这是因为在某些情况下,它将在没有GPU的机器上运行。从我所做的研究来看,我的最佳选择似乎是 将应用程序更改为使用WARP非常简单: hr = D3D11CreateDevice( NULL, D3D_DRIVER_TYPE_WARP, // was D3D_DRIVER_TYPE_HARDWARE NULL, creationFlag, featureLevels, ARRAYSIZE(feat

我有一个DX11应用程序,我想添加对软件渲染的支持。这是因为在某些情况下,它将在没有GPU的机器上运行。从我所做的研究来看,我的最佳选择似乎是

将应用程序更改为使用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

如果硬件不可用,我认为硬件将下降到软件:

具体而言:

上面写着:

如果DriverType==D3D\U DRIVER\U TYPE\U硬件,则将使用适配器 默认适配器,它是由枚举的第一个适配器 IDXGIFactory1::枚举适配器

或者,如果您想在WARP或硬件之间进行控制,而不想在其他任何东西之间进行控制,请使用EnumAdapters获取可用的适配器:


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

通常是这样做的:只需尝试
D3D11CreateDevice()
,使用您认为合适的所有参数,包括
D3D\U驱动程序类型\U硬件
(在循环中尝试不同的功能级别,以找出最佳效果)。如果失败,请回滚到“扭曲”。如果WARP将失败,则回滚到软件、D3D9、GL等。如果所有可能的变体都将失败,则通知用户需要升级其机器和/或OS=)

每次尝试都会检查返回代码、设备和上下文指针。当您找到
(HRESULT==S_OK)&(device!=0)&&(context!=0)
-宾果


希望有帮助。

问题是,如果硬件出现故障,下一个驱动程序类型是软件,这比WARP慢得多。我喜欢你使用EnumAdapters的想法;也许我可以用它做点什么。非常感谢。我可以问一下为什么我也要检查上下文和hresult吗?我不知道当
hresult
device
context
中只有一个或两个失败时是否有任何可能性,但我认为最后检查所有的后置条件总是一个好主意。此外,如果失败的
设备
始终为空或不为空,则在文档中未指定。此外,每次迭代都要检查这三个选项,这样编写()就更简单了。在初始化时,额外的比较操作不会造成任何性能损失(与
D3D11CreateDevice()
本身的性能相比),因此“安全总比遗憾好”。