summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/D3DCommon/SwapChain.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoBackends/D3DCommon/SwapChain.cpp')
-rw-r--r--Source/Core/VideoBackends/D3DCommon/SwapChain.cpp96
1 files changed, 59 insertions, 37 deletions
diff --git a/Source/Core/VideoBackends/D3DCommon/SwapChain.cpp b/Source/Core/VideoBackends/D3DCommon/SwapChain.cpp
index 376f891a96..e0bca9158b 100644
--- a/Source/Core/VideoBackends/D3DCommon/SwapChain.cpp
+++ b/Source/Core/VideoBackends/D3DCommon/SwapChain.cpp
@@ -25,7 +25,7 @@ static bool IsTearingSupported(IDXGIFactory2* dxgi_factory)
allow_tearing != 0;
}
-static bool GetFullscreenState(IDXGISwapChain1* swap_chain)
+static bool GetFullscreenState(IDXGISwapChain* swap_chain)
{
BOOL fs = FALSE;
return SUCCEEDED(swap_chain->GetFullscreenState(&fs, nullptr)) && fs;
@@ -33,9 +33,8 @@ static bool GetFullscreenState(IDXGISwapChain1* swap_chain)
namespace D3DCommon
{
-SwapChain::SwapChain(const WindowSystemInfo& wsi, IDXGIFactory2* dxgi_factory, IUnknown* d3d_device)
- : m_wsi(wsi), m_dxgi_factory(dxgi_factory), m_d3d_device(d3d_device),
- m_allow_tearing_supported(IsTearingSupported(dxgi_factory))
+SwapChain::SwapChain(const WindowSystemInfo& wsi, IDXGIFactory* dxgi_factory, IUnknown* d3d_device)
+ : m_wsi(wsi), m_dxgi_factory(dxgi_factory), m_d3d_device(d3d_device)
{
}
@@ -66,40 +65,63 @@ bool SwapChain::CreateSwapChain(bool stereo)
m_height = client_rc.bottom - client_rc.top;
}
- DXGI_SWAP_CHAIN_DESC1 swap_chain_desc = {};
- swap_chain_desc.Width = m_width;
- swap_chain_desc.Height = m_height;
- swap_chain_desc.BufferCount = SWAP_CHAIN_BUFFER_COUNT;
- swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
- swap_chain_desc.SampleDesc.Count = 1;
- swap_chain_desc.SampleDesc.Quality = 0;
- swap_chain_desc.Format = GetDXGIFormatForAbstractFormat(m_texture_format, false);
- swap_chain_desc.Scaling = DXGI_SCALING_STRETCH;
- swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
- swap_chain_desc.Stereo = stereo;
- swap_chain_desc.Flags = GetSwapChainFlags();
-
- HRESULT hr = m_dxgi_factory->CreateSwapChainForHwnd(
- m_d3d_device.Get(), static_cast<HWND>(m_wsi.render_surface), &swap_chain_desc, nullptr,
- nullptr, &m_swap_chain);
- if (FAILED(hr))
+ // Try using the Win8 version if available.
+ Microsoft::WRL::ComPtr<IDXGIFactory2> dxgi_factory2;
+ HRESULT hr = m_dxgi_factory.As(&dxgi_factory2);
+ if (SUCCEEDED(hr))
{
- // Flip-model discard swapchains aren't supported on Windows 8, so here we fall back to
- // a sequential swapchain
- swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
- hr = m_dxgi_factory->CreateSwapChainForHwnd(m_d3d_device.Get(),
- static_cast<HWND>(m_wsi.render_surface),
- &swap_chain_desc, nullptr, nullptr, &m_swap_chain);
+ m_allow_tearing_supported = IsTearingSupported(dxgi_factory2.Get());
+
+ DXGI_SWAP_CHAIN_DESC1 swap_chain_desc = {};
+ swap_chain_desc.Width = m_width;
+ swap_chain_desc.Height = m_height;
+ swap_chain_desc.BufferCount = SWAP_CHAIN_BUFFER_COUNT;
+ swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+ swap_chain_desc.SampleDesc.Count = 1;
+ swap_chain_desc.SampleDesc.Quality = 0;
+ swap_chain_desc.Format = GetDXGIFormatForAbstractFormat(m_texture_format, false);
+ swap_chain_desc.Scaling = DXGI_SCALING_STRETCH;
+ swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
+ swap_chain_desc.Stereo = stereo;
+ swap_chain_desc.Flags = GetSwapChainFlags();
+
+ Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain1;
+ hr = dxgi_factory2->CreateSwapChainForHwnd(m_d3d_device.Get(),
+ static_cast<HWND>(m_wsi.render_surface),
+ &swap_chain_desc, nullptr, nullptr, &swap_chain1);
+ if (FAILED(hr))
+ {
+ // Flip-model discard swapchains aren't supported on Windows 8, so here we fall back to
+ // a sequential swapchain
+ swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
+ hr = dxgi_factory2->CreateSwapChainForHwnd(m_d3d_device.Get(),
+ static_cast<HWND>(m_wsi.render_surface),
+ &swap_chain_desc, nullptr, nullptr, &swap_chain1);
+ }
+
+ m_swap_chain = swap_chain1;
}
+ // Flip-model swapchains aren't supported on Windows 7, so here we fall back to a legacy
+ // BitBlt-model swapchain. Note that this won't work for DX12, but systems which don't
+ // support the newer DXGI interface aren't going to support DX12 anyway.
if (FAILED(hr))
{
- // Flip-model swapchains aren't supported on Windows 7, so here we fall back to a legacy
- // BitBlt-model swapchain
- swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
- hr = m_dxgi_factory->CreateSwapChainForHwnd(m_d3d_device.Get(),
- static_cast<HWND>(m_wsi.render_surface),
- &swap_chain_desc, nullptr, nullptr, &m_swap_chain);
+ DXGI_SWAP_CHAIN_DESC desc = {};
+ desc.BufferDesc.Width = m_width;
+ desc.BufferDesc.Height = m_height;
+ desc.BufferDesc.Format = GetDXGIFormatForAbstractFormat(m_texture_format, false);
+ desc.SampleDesc.Count = 1;
+ desc.SampleDesc.Quality = 0;
+ desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+ desc.BufferCount = SWAP_CHAIN_BUFFER_COUNT;
+ desc.OutputWindow = static_cast<HWND>(m_wsi.render_surface);
+ desc.Windowed = TRUE;
+ desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
+ desc.Flags = 0;
+
+ m_allow_tearing_supported = false;
+ hr = m_dxgi_factory->CreateSwapChain(m_d3d_device.Get(), &desc, &m_swap_chain);
}
if (FAILED(hr))
@@ -147,11 +169,11 @@ bool SwapChain::ResizeSwapChain()
if (FAILED(hr))
WARN_LOG(VIDEO, "ResizeBuffers() failed with HRESULT %08X", hr);
- DXGI_SWAP_CHAIN_DESC1 desc;
- if (SUCCEEDED(m_swap_chain->GetDesc1(&desc)))
+ DXGI_SWAP_CHAIN_DESC desc;
+ if (SUCCEEDED(m_swap_chain->GetDesc(&desc)))
{
- m_width = desc.Width;
- m_height = desc.Height;
+ m_width = desc.BufferDesc.Width;
+ m_height = desc.BufferDesc.Height;
}
return CreateSwapChainBuffers();