SDL: Fix DXGI intercepting ALT+ENTER
This commit is contained in:
parent
6775100170
commit
ebc3aa118c
|
@ -200,17 +200,46 @@ bool D3D11HostDisplay::CreateD3DDevice(bool debug_device)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ComPtr<IDXGIFactory> dxgi_factory;
|
UINT create_flags = 0;
|
||||||
HRESULT hr = CreateDXGIFactory(IID_PPV_ARGS(dxgi_factory.GetAddressOf()));
|
if (debug_device)
|
||||||
|
create_flags |= D3D11_CREATE_DEVICE_DEBUG;
|
||||||
|
|
||||||
|
HRESULT hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, create_flags, nullptr, 0,
|
||||||
|
D3D11_SDK_VERSION, m_device.GetAddressOf(), nullptr, m_context.GetAddressOf());
|
||||||
|
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
Log_ErrorPrintf("Failed to create DXGI factory: 0x%08X", hr);
|
Log_ErrorPrintf("Failed to create D3D device: 0x%08X", hr);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// we need the specific factory for the device, otherwise MakeWindowAssociation() is flaky.
|
||||||
|
ComPtr<IDXGIDevice> dxgi_device;
|
||||||
|
ComPtr<IDXGIAdapter> dxgi_adapter;
|
||||||
|
if (FAILED(m_device.As(&dxgi_device)) || FAILED(dxgi_device->GetParent(IID_PPV_ARGS(dxgi_adapter.GetAddressOf()))) ||
|
||||||
|
FAILED(dxgi_adapter->GetParent(IID_PPV_ARGS(m_dxgi_factory.GetAddressOf()))))
|
||||||
|
{
|
||||||
|
Log_WarningPrint("Failed to get parent adapter/device/factory");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DXGI_ADAPTER_DESC adapter_desc;
|
||||||
|
if (SUCCEEDED(dxgi_adapter->GetDesc(&adapter_desc)))
|
||||||
|
{
|
||||||
|
char adapter_name_buffer[128];
|
||||||
|
const int name_length =
|
||||||
|
WideCharToMultiByte(CP_UTF8, 0, adapter_desc.Description, static_cast<int>(std::wcslen(adapter_desc.Description)),
|
||||||
|
adapter_name_buffer, countof(adapter_name_buffer), 0, nullptr);
|
||||||
|
if (name_length >= 0)
|
||||||
|
{
|
||||||
|
adapter_name_buffer[name_length] = 0;
|
||||||
|
Log_InfoPrintf("D3D Adapter: %s", adapter_name_buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_allow_tearing_supported = false;
|
m_allow_tearing_supported = false;
|
||||||
ComPtr<IDXGIFactory5> dxgi_factory5;
|
ComPtr<IDXGIFactory5> dxgi_factory5;
|
||||||
hr = dxgi_factory.As(&dxgi_factory5);
|
hr = m_dxgi_factory.As(&dxgi_factory5);
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
BOOL allow_tearing_supported = false;
|
BOOL allow_tearing_supported = false;
|
||||||
|
@ -220,19 +249,6 @@ bool D3D11HostDisplay::CreateD3DDevice(bool debug_device)
|
||||||
m_allow_tearing_supported = (allow_tearing_supported == TRUE);
|
m_allow_tearing_supported = (allow_tearing_supported == TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT create_flags = 0;
|
|
||||||
if (debug_device)
|
|
||||||
create_flags |= D3D11_CREATE_DEVICE_DEBUG;
|
|
||||||
|
|
||||||
hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, create_flags, nullptr, 0, D3D11_SDK_VERSION,
|
|
||||||
m_device.GetAddressOf(), nullptr, m_context.GetAddressOf());
|
|
||||||
|
|
||||||
if (FAILED(hr))
|
|
||||||
{
|
|
||||||
Log_ErrorPrintf("Failed to create D3D device: 0x%08X", hr);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
DXGI_SWAP_CHAIN_DESC swap_chain_desc = {};
|
DXGI_SWAP_CHAIN_DESC swap_chain_desc = {};
|
||||||
swap_chain_desc.BufferDesc.Width = m_window_width;
|
swap_chain_desc.BufferDesc.Width = m_window_width;
|
||||||
swap_chain_desc.BufferDesc.Height = m_window_height;
|
swap_chain_desc.BufferDesc.Height = m_window_height;
|
||||||
|
@ -247,7 +263,7 @@ bool D3D11HostDisplay::CreateD3DDevice(bool debug_device)
|
||||||
if (m_allow_tearing_supported)
|
if (m_allow_tearing_supported)
|
||||||
swap_chain_desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING;
|
swap_chain_desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING;
|
||||||
|
|
||||||
hr = 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))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
Log_WarningPrintf("Failed to create a flip-discard swap chain, trying discard.");
|
Log_WarningPrintf("Failed to create a flip-discard swap chain, trying discard.");
|
||||||
|
@ -255,7 +271,7 @@ bool D3D11HostDisplay::CreateD3DDevice(bool debug_device)
|
||||||
swap_chain_desc.Flags = 0;
|
swap_chain_desc.Flags = 0;
|
||||||
m_allow_tearing_supported = false;
|
m_allow_tearing_supported = false;
|
||||||
|
|
||||||
hr = 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))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
Log_ErrorPrintf("CreateSwapChain failed: 0x%08X", hr);
|
Log_ErrorPrintf("CreateSwapChain failed: 0x%08X", hr);
|
||||||
|
@ -263,7 +279,7 @@ bool D3D11HostDisplay::CreateD3DDevice(bool debug_device)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = dxgi_factory->MakeWindowAssociation(swap_chain_desc.OutputWindow, DXGI_MWA_NO_WINDOW_CHANGES);
|
hr = m_dxgi_factory->MakeWindowAssociation(swap_chain_desc.OutputWindow, DXGI_MWA_NO_WINDOW_CHANGES);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
Log_WarningPrintf("MakeWindowAssociation() to disable ALT+ENTER failed");
|
Log_WarningPrintf("MakeWindowAssociation() to disable ALT+ENTER failed");
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,8 @@ private:
|
||||||
void RenderDisplay();
|
void RenderDisplay();
|
||||||
|
|
||||||
SDL_Window* m_window = nullptr;
|
SDL_Window* m_window = nullptr;
|
||||||
SDL_GLContext m_gl_context = nullptr;
|
|
||||||
|
ComPtr<IDXGIFactory> m_dxgi_factory;
|
||||||
|
|
||||||
ComPtr<ID3D11Device> m_device;
|
ComPtr<ID3D11Device> m_device;
|
||||||
ComPtr<ID3D11DeviceContext> m_context;
|
ComPtr<ID3D11DeviceContext> m_context;
|
||||||
|
|
Loading…
Reference in New Issue