Как определить уровень поддержки Direct3D WARP?
Платформа расширенной растеризации Windows (WARP) поддерживает различные уровни функций, которые зависят от установленной версии DirectX API:
- уровни функций 9_1, 9_2, 9_3, 10_0 и 10_1, когда установлен Direct3D 11
- все вышеупомянутые функциональные уровни плюс 11_0, когда Direct3D 11.1 установлен в Windows 7
- все вышеупомянутые функциональные уровни плюс 11_1, когда Direct3D 11.1 установлен в Windows 8
Как я могу легко определить, какой уровень функций доступен через WARP? Я знаю, для аппаратного устройства я могу запустить ID3D11Device::GetFeatureLevel
, но я не вижу эквивалента для WARP.
1 ответ
Решение
Используйте код из Анатомии 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. Нам не нужно перечислять уровень функций 9.1, 9.2 или 9.3 в lvl
поскольку WARP поддерживает как минимум 10.1 на настольных ПК с Windows. Для надежности я бы также предложил перечислить 10.0.