質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

0回答

159閲覧

DirectX12でフルスクリーンでのエラー

nasuo

総合スコア8

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2024/04/29 11:47

編集2024/04/30 11:04

実現したいこと

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 ));

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nasuo

2024/04/30 09:36

コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問