DirectX - CreateDeviceAndSwapChain возвращает E_INVALIDARG - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь инициализировать 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 Ответ

0 голосов
/ 08 ноября 2018

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

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

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

Примечание

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

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

...