0

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

4

2 回答 2

2

这通常是这样做的:只需尝试D3D11CreateDevice()使用您期望的所有参数,包括D3D_DRIVER_TYPE_HARDWARE(尝试循环中的不同功能级别,以找出最佳参数)。如果这将失败,请回滚到 WARP。如果 WARP 失败,回滚到软件、D3D9、GL 等。如果所有可能的变体都失败,通知用户他需要升级他的机器和/或操作系统 =)

每次尝试检查返回码、设备和上下文指针。当你发现(HRESULT == S_OK) && (device != 0) && (context != 0)- 宾果!

希望能帮助到你。

于 2014-02-10T22:35:19.290 回答
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

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

于 2014-02-10T22:21:49.180 回答