diff --git a/src/d3d11/d3d11_main.cpp b/src/d3d11/d3d11_main.cpp index 4780e1c3..dd2a97e6 100644 --- a/src/d3d11/d3d11_main.cpp +++ b/src/d3d11/d3d11_main.cpp @@ -148,51 +148,54 @@ extern "C" { ID3D11Device **ppDevice, D3D_FEATURE_LEVEL *pFeatureLevel, ID3D11DeviceContext **ppImmediateContext) { + Com d3d11Device; + Com d3d11Context; + // Try to create a device first. HRESULT status = D3D11CreateDevice(pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, - SDKVersion, ppDevice, pFeatureLevel, ppImmediateContext); + SDKVersion, &d3d11Device, pFeatureLevel, &d3d11Context); if (FAILED(status)) return status; // Again, the documentation does not exactly tell us what we // need to do in case one of the arguments is a null pointer. - if (ppDevice != nullptr && ppSwapChain != nullptr) { - if (pSwapChainDesc == nullptr) - return E_INVALIDARG; - - Com d3d11Device = *ppDevice; - Com dxgiDevice = nullptr; - Com dxgiAdapter = nullptr; - Com dxgiFactory = nullptr; - - if (FAILED(d3d11Device->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast(&dxgiDevice)))) { - Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI device"); - return E_FAIL; - } - - if (FAILED(dxgiDevice->GetParent(__uuidof(IDXGIAdapter), reinterpret_cast(&dxgiAdapter)))) { - Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI adapter"); - return E_FAIL; - } - - if (FAILED(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast(&dxgiFactory)))) { - Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI factory"); - return E_FAIL; - } - - DXGI_SWAP_CHAIN_DESC desc = *pSwapChainDesc; - if (FAILED(dxgiFactory->CreateSwapChain(d3d11Device.ptr(), &desc, ppSwapChain))) { - Logger::err("D3D11CreateDeviceAndSwapChain: Failed to create swap chain"); - return E_FAIL; - } - - return S_OK; - } else { - Logger::warn("D3D11CreateDeviceAndSwapChain: Not creating a swap chain"); - return S_OK; + if (pSwapChainDesc == nullptr) + return E_INVALIDARG; + + Com dxgiDevice = nullptr; + Com dxgiAdapter = nullptr; + Com dxgiFactory = nullptr; + + if (FAILED(d3d11Device->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast(&dxgiDevice)))) { + Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI device"); + return E_FAIL; } + + if (FAILED(dxgiDevice->GetParent(__uuidof(IDXGIAdapter), reinterpret_cast(&dxgiAdapter)))) { + Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI adapter"); + return E_FAIL; + } + + if (FAILED(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast(&dxgiFactory)))) { + Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI factory"); + return E_FAIL; + } + + DXGI_SWAP_CHAIN_DESC desc = *pSwapChainDesc; + if (FAILED(dxgiFactory->CreateSwapChain(d3d11Device.ptr(), &desc, ppSwapChain))) { + Logger::err("D3D11CreateDeviceAndSwapChain: Failed to create swap chain"); + return E_FAIL; + } + + if (ppDevice != nullptr) + *ppDevice = d3d11Device.ref(); + + if (ppImmediateContext != nullptr) + *ppImmediateContext = d3d11Context.ref(); + + return S_OK; } } \ No newline at end of file