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.
Если вам не нужно отладочное устройство на компьютере клиента, просто удалите этот флаг.