diff --git a/src/renderer/dx/DxRenderer.cpp b/src/renderer/dx/DxRenderer.cpp index f9f9cbb2269..77968b9af19 100644 --- a/src/renderer/dx/DxRenderer.cpp +++ b/src/renderer/dx/DxRenderer.cpp @@ -130,8 +130,6 @@ DxEngine::~DxEngine() RETURN_IF_FAILED(CreateDXGIFactory1(IID_PPV_ARGS(&_dxgiFactory2))); - RETURN_IF_FAILED(_dxgiFactory2->EnumAdapters1(0, &_dxgiAdapter1)); - const DWORD DeviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT | // clang-format off // This causes problems for folks who do not have the whole DirectX SDK installed @@ -154,18 +152,33 @@ DxEngine::~DxEngine() D3D_FEATURE_LEVEL_9_1, }; - RETURN_IF_FAILED(D3D11CreateDevice(_dxgiAdapter1.Get(), - D3D_DRIVER_TYPE_UNKNOWN, - NULL, - DeviceFlags, - FeatureLevels, - ARRAYSIZE(FeatureLevels), - D3D11_SDK_VERSION, - &_d3dDevice, - NULL, - &_d3dDeviceContext)); - - RETURN_IF_FAILED(_dxgiAdapter1->EnumOutputs(0, &_dxgiOutput)); + // Trying hardware first for maximum performance, then trying WARP (software) renderer second + // in case we're running inside a downlevel VM where hardware passthrough isn't enabled like + // for Windows 7 in a VM. + const auto hardwareResult = D3D11CreateDevice(NULL, + D3D_DRIVER_TYPE_HARDWARE, + NULL, + DeviceFlags, + FeatureLevels, + ARRAYSIZE(FeatureLevels), + D3D11_SDK_VERSION, + &_d3dDevice, + NULL, + &_d3dDeviceContext); + + if (FAILED(hardwareResult)) + { + RETURN_IF_FAILED(D3D11CreateDevice(NULL, + D3D_DRIVER_TYPE_WARP, + NULL, + DeviceFlags, + FeatureLevels, + ARRAYSIZE(FeatureLevels), + D3D11_SDK_VERSION, + &_d3dDevice, + NULL, + &_d3dDeviceContext)); + } _displaySizePixels = _GetClientSize(); @@ -309,7 +322,6 @@ void DxEngine::_ReleaseDeviceResources() noexcept _dxgiSurface.Reset(); _dxgiSwapChain.Reset(); - _dxgiOutput.Reset(); if (nullptr != _d3dDeviceContext.Get()) { @@ -321,7 +333,6 @@ void DxEngine::_ReleaseDeviceResources() noexcept _d3dDevice.Reset(); - _dxgiAdapter1.Reset(); _dxgiFactory2.Reset(); } diff --git a/src/renderer/dx/DxRenderer.hpp b/src/renderer/dx/DxRenderer.hpp index 80d07b47b84..4197efd965f 100644 --- a/src/renderer/dx/DxRenderer.hpp +++ b/src/renderer/dx/DxRenderer.hpp @@ -156,9 +156,7 @@ namespace Microsoft::Console::Render bool _haveDeviceResources; ::Microsoft::WRL::ComPtr _d3dDevice; ::Microsoft::WRL::ComPtr _d3dDeviceContext; - ::Microsoft::WRL::ComPtr _dxgiAdapter1; ::Microsoft::WRL::ComPtr _dxgiFactory2; - ::Microsoft::WRL::ComPtr _dxgiOutput; ::Microsoft::WRL::ComPtr _dxgiSurface; ::Microsoft::WRL::ComPtr _d2dRenderTarget; ::Microsoft::WRL::ComPtr _d2dBrushForeground;