Windows高级光栅化平台(WARP)支持多种功能级别,这些功能级别因安装的DirectX API版本而异:
- 安装Direct3D 11时的功能级别9_1、9_2、9_3、10_0和10_1
- 在Windows 7上安装Direct3D 11.1时,所有上述功能级别加上11_0
- 在Windows 8上安装Direct3D 11.1时,所有以上功能级别加上11_1
如何通过WARP轻松确定可用的功能级别?我知道对于硬件设备,我可以运行ID3D11Device::GetFeatureLevel
,但我看不到WARP的等效程序。
使用Anatomy of Direct3D 11 Create Device中的代码,但使用WARP设备类型。
D3D_FEATURE_LEVEL lvl[] = {
D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0 };
DWORD createDeviceFlags = 0;
#ifdef _DEBUG
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
ID3D11Device* pDevice = nullptr;
ID3D11DeviceContext* pContext = nullptr;
D3D_FEATURE_LEVEL fl;
HRESULT hr = D3D11CreateDevice( nullptr, D3D_DRIVER_TYPE_WARP, nullptr,
createDeviceFlags, lvl, _countof(lvl),
D3D11_SDK_VERSION, &pDevice, &fl, &pContext );
if ( hr == E_INVALIDARG )
{
hr = D3D11CreateDevice( nullptr, D3D_DRIVER_TYPE_WARP, nullptr,
createDeviceFlags, &lvl[1], _countof(lvl)-1,
D3D11_SDK_VERSION, &pDevice, &fl, &pContext );
}
if ( FAILED(hr) )
// error handling
然后检查fl
是否为10.1、11.0或11.1。我们不需要在lvl
中列出9.1、9.2或9.3功能级别,因为WARP在Windows台式机上至少支持10.1。为了健壮性,我建议也列出10.0。