実現したいこと
DirectX12でフルスクリーン実行時にエラーにならないようにする。
前提
Windows 11
Microsoft Visual Studio Community 2022
DirectX12
発生している問題・エラーメッセージ
DXGI ERROR: IDXGISwapChain::GetContainingOutput: The swapchain's adapter does not control the output on which the swapchain's window resides. [ MISCELLANEOUS ERROR #80: ]
該当のソースコード
c++
1void Win32Application::ToggleFullscreenWindow(IDXGISwapChain* pSwapChain) 2{ 3 if (m_fullscreenMode) 4 { 5 // Restore the window's attributes and size. 6 SetWindowLong(m_hwnd, GWL_STYLE, m_windowStyle); 7 8 SetWindowPos( 9 m_hwnd, 10 HWND_NOTOPMOST, 11 m_windowRect.left, 12 m_windowRect.top, 13 m_windowRect.right - m_windowRect.left, 14 m_windowRect.bottom - m_windowRect.top, 15 SWP_FRAMECHANGED | SWP_NOACTIVATE); 16 17 ShowWindow(m_hwnd, SW_NORMAL); 18 } 19 else 20 { 21 // Save the old window rect so we can restore it when exiting fullscreen mode. 22 GetWindowRect(m_hwnd, &m_windowRect); 23 24 // Make the window borderless so that the client area can fill the screen. 25 SetWindowLong(m_hwnd, GWL_STYLE, m_windowStyle & ~(WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_THICKFRAME)); 26 27 RECT fullscreenWindowRect; 28 try 29 { 30 if (pSwapChain) 31 { 32 // Get the settings of the display on which the app's window is currently displayed 33 ComPtr<IDXGIOutput> pOutput; 34 ThrowIfFailed(pSwapChain->GetContainingOutput(&pOutput)); 35 DXGI_OUTPUT_DESC Desc; 36 ThrowIfFailed(pOutput->GetDesc(&Desc)); 37 fullscreenWindowRect = Desc.DesktopCoordinates; 38 } 39 else 40 { 41 // Fallback to EnumDisplaySettings implementation 42 throw HrException(S_FALSE); 43 } 44 } 45 catch (HrException& e) 46 { 47 UNREFERENCED_PARAMETER(e); 48 49 // Get the settings of the primary display 50 DEVMODE devMode = {}; 51 devMode.dmSize = sizeof(DEVMODE); 52 EnumDisplaySettings(nullptr, ENUM_CURRENT_SETTINGS, &devMode); 53 54 fullscreenWindowRect = { 55 devMode.dmPosition.x, 56 devMode.dmPosition.y, 57 devMode.dmPosition.x + static_cast<LONG>(devMode.dmPelsWidth), 58 devMode.dmPosition.y + static_cast<LONG>(devMode.dmPelsHeight) 59 }; 60 } 61 62 SetWindowPos( 63 m_hwnd, 64 HWND_TOPMOST, 65 fullscreenWindowRect.left, 66 fullscreenWindowRect.top, 67 fullscreenWindowRect.right, 68 fullscreenWindowRect.bottom, 69 SWP_FRAMECHANGED | SWP_NOACTIVATE); 70 71 72 ShowWindow(m_hwnd, SW_MAXIMIZE); 73 } 74 75 m_fullscreenMode = !m_fullscreenMode; 76}
試したこと
MicrosoftのD3D12Fullscreenのサンプルコードを、現在自身のプロジェクトに入れて試したところ、サンプルのプロジェクトで直接実行すると、正常に動作するのですが、自身の作成したプロジェクトだとエラーがデバッグ中のログに表示されます。
動作自体はするのですが、サンプルとは違い、フルスクリーンになる際に、白い四角形と黒い背景が描画される瞬間が発生しました。
C++
1ThrowIfFailed(pSwapChain->GetContainingOutput(&pOutput));
そこで、ログが発生する場所を特定したのが、上記のコード部分です。
この箇所で、「IDXGIOutput」を取得しているようなのですが、どういうわけか、サンプルのプロジェクトでは取得できるのに対して、自身のプロジェクトでは、失敗します。
以下のHRESULTの値を確認いたしました。
0x887a0004 : 指定されたデバイス インターフェイスまたは機能レベルがこのシステムでサポートされていません。
そこで、ソース「D3D12Fullscreen」の95行目の下記ソースコードの「GetHardwareAdapter」関数が呼ばれた後で、「hardwareAdapter->EnumOutputs」を試したところ、サンプルでは取得でき、自身のプロジェクトでは、取得できませんでした。
なぜ自身のプロジェクトでは取得できないのかわかず、原因を解決できません。
どうすれば、問題なくコードを動かすことができるのでしょうか。
ご教示お願いいたします。
c++
1 ComPtr<IDXGIAdapter1> hardwareAdapter; 2 GetHardwareAdapter(factory.Get(), &hardwareAdapter, true); 3 4 ThrowIfFailed(D3D12CreateDevice( 5 hardwareAdapter.Get(), 6 D3D_FEATURE_LEVEL_11_0, 7 IID_PPV_ARGS(&m_device) 8 ));
あなたの回答
tips
プレビュー