|
|
|
@ -251,7 +251,11 @@ bool D3D11HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view
|
|
|
|
|
create_flags |= D3D11_CREATE_DEVICE_DEBUG;
|
|
|
|
|
|
|
|
|
|
ComPtr<IDXGIFactory> temp_dxgi_factory;
|
|
|
|
|
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
|
|
|
|
HRESULT hr = CreateDXGIFactory(IID_PPV_ARGS(temp_dxgi_factory.GetAddressOf()));
|
|
|
|
|
#else
|
|
|
|
|
HRESULT hr = CreateDXGIFactory2(0, IID_PPV_ARGS(temp_dxgi_factory.GetAddressOf()));
|
|
|
|
|
#endif
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
{
|
|
|
|
|
Log_ErrorPrintf("Failed to create DXGI factory: 0x%08X", hr);
|
|
|
|
@ -385,6 +389,9 @@ bool D3D11HostDisplay::DoneRenderContextCurrent()
|
|
|
|
|
|
|
|
|
|
bool D3D11HostDisplay::CreateSwapChain(const DXGI_MODE_DESC* fullscreen_mode)
|
|
|
|
|
{
|
|
|
|
|
HRESULT hr;
|
|
|
|
|
|
|
|
|
|
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
|
|
|
|
if (m_window_info.type != WindowInfo::Type::Win32)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
@ -423,7 +430,7 @@ bool D3D11HostDisplay::CreateSwapChain(const DXGI_MODE_DESC* fullscreen_mode)
|
|
|
|
|
swap_chain_desc.BufferDesc.Height, m_using_flip_model_swap_chain ? "flip-discard" : "discard",
|
|
|
|
|
swap_chain_desc.Windowed ? "windowed" : "full-screen");
|
|
|
|
|
|
|
|
|
|
HRESULT hr = m_dxgi_factory->CreateSwapChain(m_device.Get(), &swap_chain_desc, m_swap_chain.GetAddressOf());
|
|
|
|
|
hr = m_dxgi_factory->CreateSwapChain(m_device.Get(), &swap_chain_desc, m_swap_chain.GetAddressOf());
|
|
|
|
|
if (FAILED(hr) && m_using_flip_model_swap_chain)
|
|
|
|
|
{
|
|
|
|
|
Log_WarningPrintf("Failed to create a flip-discard swap chain, trying discard.");
|
|
|
|
@ -448,6 +455,42 @@ bool D3D11HostDisplay::CreateSwapChain(const DXGI_MODE_DESC* fullscreen_mode)
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
Log_WarningPrintf("MakeWindowAssociation() to disable ALT+ENTER failed");
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
if (m_window_info.type != WindowInfo::Type::WinRT)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
ComPtr<IDXGIFactory2> factory2;
|
|
|
|
|
hr = m_dxgi_factory.As(&factory2);
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
{
|
|
|
|
|
Log_ErrorPrintf("Failed to get DXGI factory: %08X", hr);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DXGI_SWAP_CHAIN_DESC1 swap_chain_desc = {};
|
|
|
|
|
swap_chain_desc.Width = m_window_info.surface_width;
|
|
|
|
|
swap_chain_desc.Height = m_window_info.surface_height;
|
|
|
|
|
swap_chain_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
|
|
|
|
swap_chain_desc.SampleDesc.Count = 1;
|
|
|
|
|
swap_chain_desc.BufferCount = 3;
|
|
|
|
|
swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
|
|
|
|
swap_chain_desc.SwapEffect = m_using_flip_model_swap_chain ? DXGI_SWAP_EFFECT_FLIP_DISCARD : DXGI_SWAP_EFFECT_DISCARD;
|
|
|
|
|
|
|
|
|
|
m_using_allow_tearing = (m_allow_tearing_supported && m_using_flip_model_swap_chain && !fullscreen_mode);
|
|
|
|
|
if (m_using_allow_tearing)
|
|
|
|
|
swap_chain_desc.Flags |= DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING;
|
|
|
|
|
|
|
|
|
|
ComPtr<IDXGISwapChain1> swap_chain1;
|
|
|
|
|
hr = factory2->CreateSwapChainForCoreWindow(m_device.Get(), static_cast<IUnknown*>(m_window_info.window_handle),
|
|
|
|
|
&swap_chain_desc, nullptr, swap_chain1.GetAddressOf());
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
{
|
|
|
|
|
Log_ErrorPrintf("CreateSwapChainForCoreWindow failed: 0x%08X", hr);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_swap_chain = swap_chain1;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
return CreateSwapChainRTV();
|
|
|
|
|
}
|
|
|
|
@ -476,18 +519,22 @@ bool D3D11HostDisplay::CreateSwapChainRTV()
|
|
|
|
|
|
|
|
|
|
m_window_info.surface_width = backbuffer_desc.Width;
|
|
|
|
|
m_window_info.surface_height = backbuffer_desc.Height;
|
|
|
|
|
Log_InfoPrintf("Swap chain buffer size: %ux%u", m_window_info.surface_width, m_window_info.surface_height);
|
|
|
|
|
|
|
|
|
|
BOOL fullscreen = FALSE;
|
|
|
|
|
DXGI_SWAP_CHAIN_DESC desc;
|
|
|
|
|
if (SUCCEEDED(m_swap_chain->GetFullscreenState(&fullscreen, nullptr)) && fullscreen &&
|
|
|
|
|
SUCCEEDED(m_swap_chain->GetDesc(&desc)))
|
|
|
|
|
{
|
|
|
|
|
m_window_info.surface_refresh_rate = static_cast<float>(desc.BufferDesc.RefreshRate.Numerator) /
|
|
|
|
|
static_cast<float>(desc.BufferDesc.RefreshRate.Denominator);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if (m_window_info.type == WindowInfo::Type::Win32)
|
|
|
|
|
{
|
|
|
|
|
m_window_info.surface_refresh_rate = 0.0f;
|
|
|
|
|
BOOL fullscreen = FALSE;
|
|
|
|
|
DXGI_SWAP_CHAIN_DESC desc;
|
|
|
|
|
if (SUCCEEDED(m_swap_chain->GetFullscreenState(&fullscreen, nullptr)) && fullscreen &&
|
|
|
|
|
SUCCEEDED(m_swap_chain->GetDesc(&desc)))
|
|
|
|
|
{
|
|
|
|
|
m_window_info.surface_refresh_rate = static_cast<float>(desc.BufferDesc.RefreshRate.Numerator) /
|
|
|
|
|
static_cast<float>(desc.BufferDesc.RefreshRate.Denominator);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_window_info.surface_refresh_rate = 0.0f;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
@ -870,7 +917,11 @@ void D3D11HostDisplay::RenderSoftwareCursor(s32 left, s32 top, s32 width, s32 he
|
|
|
|
|
HostDisplay::AdapterAndModeList D3D11HostDisplay::StaticGetAdapterAndModeList()
|
|
|
|
|
{
|
|
|
|
|
ComPtr<IDXGIFactory> dxgi_factory;
|
|
|
|
|
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
|
|
|
|
HRESULT hr = CreateDXGIFactory(IID_PPV_ARGS(dxgi_factory.GetAddressOf()));
|
|
|
|
|
#else
|
|
|
|
|
HRESULT hr = CreateDXGIFactory2(0, IID_PPV_ARGS(dxgi_factory.GetAddressOf()));
|
|
|
|
|
#endif
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
return {};
|
|
|
|
|
|
|
|
|
|