Как определить уровень поддержки 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.

Другие вопросы по тегам