teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

文法の修正

2024/04/30 11:04

投稿

nasuo
nasuo

スコア8

title CHANGED
File without changes
body CHANGED
@@ -96,15 +96,16 @@
96
96
 
97
97
  ### 試したこと
98
98
 
99
- Microsoftの[D3D12Fullscreen](https://github.com/microsoft/DirectX-Graphics-Samples/tree/master/Samples/Desktop/D3D12Fullscreen/src)のサンプルコードを、現在自身のプロジェクトに入れて試したところ、サンプルのプロジェクトで直接実行すると、正常に動作するのですが、自身の作成したプロジェクトだと上記のエラーがデバッグ中のログに表示され、ログが発生る場所を特定したのが、上記のコード部分です
99
+ Microsoftの[D3D12Fullscreen](https://github.com/microsoft/DirectX-Graphics-Samples/tree/master/Samples/Desktop/D3D12Fullscreen/src)のサンプルコードを、現在自身のプロジェクトに入れて試したところ、サンプルのプロジェクトで直接実行すると、正常に動作するのですが、自身の作成したプロジェクトだとエラーがデバッグ中のログに表示されす。
100
+ 動作自体はするのですが、サンプルとは違い、フルスクリーンになる際に、白い四角形と黒い背景が描画される瞬間が発生しました。
100
101
 
101
102
  ```C++
102
103
  ThrowIfFailed(pSwapChain->GetContainingOutput(&pOutput));
103
104
  ```
104
105
 
105
- 調査したところ、上記の部分で発生していることが、確認いたしました
106
+ そこで、ログが発生する場所を特定したのが、上記のコード部分で
106
107
  この箇所で、「IDXGIOutput」を取得しているようなのですが、どういうわけか、サンプルのプロジェクトでは取得できるのに対して、自身のプロジェクトでは、失敗します。
107
- 以下のHRESULTの値が出力されて、例外処理発生させてるようです
108
+ 以下のHRESULTの値を確認たしました
108
109
 
109
110
  ```
110
111
  0x887a0004 : 指定されたデバイス インターフェイスまたは機能レベルがこのシステムでサポートされていません。

2

文法の修正

2024/04/30 09:36

投稿

nasuo
nasuo

スコア8

title CHANGED
@@ -1,1 +1,1 @@
1
- DirectX12でフルスクリーンについて
1
+ DirectX12でフルスクリーンでのエラー
body CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 実現したいこと
2
2
 
3
- DirectX12でフルスクリーンの機能を装したい。
3
+ DirectX12でフルスクリーン実行時にエラーにならなようにする
4
4
 
5
5
  ### 前提
6
6
 

1

文法の修正

2024/04/30 08:43

投稿

nasuo
nasuo

スコア8

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 実現したいこと
2
2
 
3
- DirectX12でフルスクリーンを動的に変更できるようにしたい。
3
+ DirectX12でフルスクリーンの機能実装したい。
4
4
 
5
5
  ### 前提
6
6
 
@@ -11,14 +11,117 @@
11
11
  ### 発生している問題・エラーメッセージ
12
12
 
13
13
  ```
14
- DXGI ERROR IDXGISwapChain GetContainingOutput The swapchain's adapter does not control the output on which the swapchain's window resides MISCELLANEOUS ERROR 80
14
+ DXGI ERROR: IDXGISwapChain::GetContainingOutput: The swapchain's adapter does not control the output on which the swapchain's window resides. [ MISCELLANEOUS ERROR #80: ]
15
15
  ```
16
16
 
17
+ ### 該当のソースコード
18
+ ```c++
19
+ void Win32Application::ToggleFullscreenWindow(IDXGISwapChain* pSwapChain)
20
+ {
21
+ if (m_fullscreenMode)
22
+ {
23
+ // Restore the window's attributes and size.
24
+ SetWindowLong(m_hwnd, GWL_STYLE, m_windowStyle);
25
+
26
+ SetWindowPos(
27
+ m_hwnd,
28
+ HWND_NOTOPMOST,
29
+ m_windowRect.left,
30
+ m_windowRect.top,
31
+ m_windowRect.right - m_windowRect.left,
32
+ m_windowRect.bottom - m_windowRect.top,
33
+ SWP_FRAMECHANGED | SWP_NOACTIVATE);
34
+
35
+ ShowWindow(m_hwnd, SW_NORMAL);
36
+ }
37
+ else
38
+ {
39
+ // Save the old window rect so we can restore it when exiting fullscreen mode.
40
+ GetWindowRect(m_hwnd, &m_windowRect);
41
+
42
+ // Make the window borderless so that the client area can fill the screen.
43
+ SetWindowLong(m_hwnd, GWL_STYLE, m_windowStyle & ~(WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_THICKFRAME));
44
+
45
+ RECT fullscreenWindowRect;
46
+ try
47
+ {
48
+ if (pSwapChain)
49
+ {
50
+ // Get the settings of the display on which the app's window is currently displayed
51
+ ComPtr<IDXGIOutput> pOutput;
52
+ ThrowIfFailed(pSwapChain->GetContainingOutput(&pOutput));
53
+ DXGI_OUTPUT_DESC Desc;
54
+ ThrowIfFailed(pOutput->GetDesc(&Desc));
55
+ fullscreenWindowRect = Desc.DesktopCoordinates;
56
+ }
57
+ else
58
+ {
59
+ // Fallback to EnumDisplaySettings implementation
60
+ throw HrException(S_FALSE);
61
+ }
62
+ }
63
+ catch (HrException& e)
64
+ {
65
+ UNREFERENCED_PARAMETER(e);
66
+
67
+ // Get the settings of the primary display
68
+ DEVMODE devMode = {};
69
+ devMode.dmSize = sizeof(DEVMODE);
70
+ EnumDisplaySettings(nullptr, ENUM_CURRENT_SETTINGS, &devMode);
71
+
72
+ fullscreenWindowRect = {
73
+ devMode.dmPosition.x,
74
+ devMode.dmPosition.y,
75
+ devMode.dmPosition.x + static_cast<LONG>(devMode.dmPelsWidth),
76
+ devMode.dmPosition.y + static_cast<LONG>(devMode.dmPelsHeight)
77
+ };
78
+ }
79
+
80
+ SetWindowPos(
81
+ m_hwnd,
82
+ HWND_TOPMOST,
83
+ fullscreenWindowRect.left,
84
+ fullscreenWindowRect.top,
85
+ fullscreenWindowRect.right,
86
+ fullscreenWindowRect.bottom,
87
+ SWP_FRAMECHANGED | SWP_NOACTIVATE);
88
+
89
+
90
+ ShowWindow(m_hwnd, SW_MAXIMIZE);
91
+ }
92
+
93
+ m_fullscreenMode = !m_fullscreenMode;
94
+ }
95
+ ```
96
+
17
97
  ### 試したこと
18
98
 
19
- Microsoftの[D3D12Fullscreen](https://github.com/microsoft/DirectX-Graphics-Samples/tree/master/Samples/Desktop/D3D12Fullscreen/src)のサンプルを見て調査しているですが、サンプル実行時は問題ないのですが、自身で記載したコードでは上記のメッセがデバッグ中のログに表示が表示されてうまくいきません
20
- そこで、サンプルの「GetContainingOutput 」が使用されている場所で、ブレイクポイントを設定し、確認すると、「IDXGIOutput」が取得されていました。
21
- 自身のコードでは取得で着ないため、「IDXGIAdapter」で「IDXGIOutput」を取得できるか確認すると、これもサンプルでは取得できました。
22
- じゃあサンプルのコードをそのまま自身のプロジェクトに移行してもうまく取得できるのかと思い、試したのですが、失敗してしまいます。
99
+ Microsoftの[D3D12Fullscreen](https://github.com/microsoft/DirectX-Graphics-Samples/tree/master/Samples/Desktop/D3D12Fullscreen/src)のサンプルコードを、現在自身プロジェクトに入れて試したところ、サンプルのプロジェクトで直接実行すると正常に動作するのですが、自身の作成したプロジェクトだと上記のエラーがデバッグ中のログに表示され、ログが発生する場所を特定したのが、上記のコード部分です
23
100
 
101
+ ```C++
102
+ ThrowIfFailed(pSwapChain->GetContainingOutput(&pOutput));
103
+ ```
104
+
105
+ 調査したところ、上記の部分で発生していることが、確認いたしました。
106
+ この箇所で、「IDXGIOutput」を取得しているようなのですが、どういうわけか、サンプルのプロジェクトでは取得できるのに対して、自身のプロジェクトでは、失敗します。
107
+ 以下のHRESULTの値が出力されて、例外処理を発生させているようです。
108
+
109
+ ```
110
+ 0x887a0004 : 指定されたデバイス インターフェイスまたは機能レベルがこのシステムでサポートされていません。
111
+ ```
112
+
113
+ そこで、ソース「D3D12Fullscreen」の95行目の下記ソースコードの「GetHardwareAdapter」関数が呼ばれた後で、「hardwareAdapter->EnumOutputs」を試したところ、サンプルでは取得でき、自身のプロジェクトでは、取得できませんでした。
114
+ なぜ自身のプロジェクトでは取得できないのかわかず、原因を解決できません。
24
- どうすれば、問題なくコードくようになるようにればいいか、ご教示お願いいたます
115
+ どうすれば、問題なくコードことができるょうか
116
+ ご教示お願いいたします。
117
+
118
+ ```c++
119
+ ComPtr<IDXGIAdapter1> hardwareAdapter;
120
+ GetHardwareAdapter(factory.Get(), &hardwareAdapter, true);
121
+
122
+ ThrowIfFailed(D3D12CreateDevice(
123
+ hardwareAdapter.Get(),
124
+ D3D_FEATURE_LEVEL_11_0,
125
+ IID_PPV_ARGS(&m_device)
126
+ ));
127
+ ```