DirectX - CreateDeviceAndSwapChain возвращает E_INVALIDARG

Я пытаюсь инициализировать Direct3D11 в C++. На машинах, на которых установлена ​​Visual Studio (все они работают в Windows 10), он работает нормально. На других компьютерах (без установленной Visual Studio, Windows 10 и 7) возвращается E_INVALIDARG.

Флаг P_FeatureLevelsSupported говорит 0 на этих компьютерах. По моему это говорит D3D_FEATURE_LEVEL_11_1. Так что я думаю, что это как-то связано с установкой DirectX или, возможно, из-за отсутствия SDK (но разве это не странно?:D)

Запустив dxdiag, я знаю, что эти машины поддерживают DirectX11_0.

Что-то мне нужно установить? Программное обеспечение должно работать на ПК наших клиентов.

Код, который вызывает ошибку:

const D3D_FEATURE_LEVEL lvl[] = {   D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0,
                                    D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0,
                                    D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1,
}; 
D3D_FEATURE_LEVEL  P_FeatureLevelsSupported;


//see microsoft documentation, we use 11_1 or 11_0 if 11_1 is not supported by the client machine
//https://docs.microsoft.com/en-us/windows/desktop/direct3d11/overviews-direct3d-11-devices-initialize
result  = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_DEBUG, lvl, _countof(lvl), D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &device, &P_FeatureLevelsSupported, &deviceContext);
if(result == E_INVALIDARG) //check with FEATURE_LEVEL_11_0
      D3D11CreateDeviceAndSwapChain(NULL, 
                              D3D_DRIVER_TYPE_HARDWARE, 
                              NULL,
                              D3D11_CREATE_DEVICE_DEBUG, 
                              &lvl[1],
                              _countof(lvl) - 1,
                              D3D11_SDK_VERSION,
                              &swapChainDesc, 
                              &swapChain, 
                              &device,
                              &P_FeatureLevelsSupported, 
                              &deviceContext);

Заранее спасибо:)

1 ответ

Решение

Вы просите создать устройство отладки, передав D3D11_CREATE_DEVICE_DEBUG, Для этого у вас должен быть установлен D3D11*SDKLayers.dll, который вы, вероятно, имеете на своих компьютерах разработчиков. Смотрите здесь для деталей, которые включают в себя:

Уровень отладки Уровень отладки обеспечивает обширную дополнительную проверку параметров и согласованности (например, проверку связывания шейдера и привязки ресурса, проверку согласованности параметров и отчет об ошибках описания).

Чтобы создать устройство, поддерживающее уровень отладки, необходимо установить DirectX SDK (чтобы получить D3D11SDKLayers.dll), а затем указать флаг D3D11_CREATE_DEVICE_DEBUG при вызове функции D3D11CreateDevice или функции D3D11CreateDeviceAndSwapChain. Если вы запустите приложение с включенным уровнем отладки, оно будет работать значительно медленнее. Но, чтобы убедиться, что ваше приложение очищено от ошибок и предупреждений перед его отправкой, используйте уровень отладки. Для получения дополнительной информации см. Использование уровня отладки для отладки приложений.

Заметка

В Windows 8 для создания устройства, поддерживающего уровень отладки, установите Windows Software Development Kit (SDK) для Windows 8, чтобы получить D3D11_1SDKLayers.dll.

Если вам не нужно отладочное устройство на компьютере клиента, просто удалите этот флаг.

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