mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 04:29:15 +01:00
[dxvk] Fixed D3D11CreateDeviceAndSwapChain bug
Some applications may want to create a swap chain without specifying a device or context pointer.
This commit is contained in:
parent
c5bbf2d989
commit
52f6ba1756
@ -148,51 +148,54 @@ extern "C" {
|
||||
ID3D11Device **ppDevice,
|
||||
D3D_FEATURE_LEVEL *pFeatureLevel,
|
||||
ID3D11DeviceContext **ppImmediateContext) {
|
||||
Com<ID3D11Device> d3d11Device;
|
||||
Com<ID3D11DeviceContext> 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<ID3D11Device> d3d11Device = *ppDevice;
|
||||
Com<IDXGIDevice> dxgiDevice = nullptr;
|
||||
Com<IDXGIAdapter> dxgiAdapter = nullptr;
|
||||
Com<IDXGIFactory> dxgiFactory = nullptr;
|
||||
|
||||
if (FAILED(d3d11Device->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast<void**>(&dxgiDevice)))) {
|
||||
Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI device");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
if (FAILED(dxgiDevice->GetParent(__uuidof(IDXGIAdapter), reinterpret_cast<void**>(&dxgiAdapter)))) {
|
||||
Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI adapter");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
if (FAILED(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast<void**>(&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<IDXGIDevice> dxgiDevice = nullptr;
|
||||
Com<IDXGIAdapter> dxgiAdapter = nullptr;
|
||||
Com<IDXGIFactory> dxgiFactory = nullptr;
|
||||
|
||||
if (FAILED(d3d11Device->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast<void**>(&dxgiDevice)))) {
|
||||
Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI device");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
if (FAILED(dxgiDevice->GetParent(__uuidof(IDXGIAdapter), reinterpret_cast<void**>(&dxgiAdapter)))) {
|
||||
Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI adapter");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
if (FAILED(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast<void**>(&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;
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user