DXGI の概要
Microsoft DirectX Graphics Infrastructure (DXGI) は、グラフィックスの一部が他の部分よりも遅く進化することを認識しています。 DXGI の主な目標は、DirectX グラフィックス ランタイムに依存しない低レベルのタスクを管理することです。 DXGI は、将来のグラフィックス コンポーネントに共通のフレームワークを提供します。DXGI を利用する最初のコンポーネントは、Microsoft Direct3D 10 です。
以前のバージョンの Direct3D では、ハードウェア デバイスの列挙、レンダリングされたフレームの出力への表示、ガンマの制御、全画面表示切り替えの管理などの低レベルのタスクが Direct3D ランタイムに含まれていました。 これらのタスクは DXGI に実装されるようになりました。
DXGI の目的は、次の図に示すように、カーネル モード ドライバーとシステム ハードウェアと通信することです。
アプリケーションは DXGI に直接アクセスするか、DXGI との通信を処理する Direct3D API をD3D11_1.h、D3D11.h、D3D10_1.h、または D3D10.h で呼び出すことができます。 アプリケーションでデバイスを列挙したり、出力にデータを表示する方法を制御したりする必要がある場合は、DXGI を直接操作できます。
このトピックは、次のセクションで構成されています。
Direct3D 11 ハードウェアでサポートされている形式を確認するには:
- Direct3D 機能レベル 12.1 ハードウェアの DXGI 形式サポート
- Direct3D 機能レベル 12.0 ハードウェアの DXGI 形式サポート
- Direct3D 機能レベル 11.1 ハードウェアの DXGI 形式サポート
- Direct3D 機能レベル 11.0 ハードウェアの DXGI 形式サポート
- Direct3D 10Level9 形式のハードウェア サポート
- Direct3D 10.1 形式のハードウェア サポート
- Direct3D 10 形式のハードウェア サポート
アダプターの列挙
アダプターは、ハードウェアとコンピューターのソフトウェア機能の抽象化です。 一般に、コンピューターには多くのアダプターがあります。 一部のデバイスはハードウェア (ビデオ カードなど) に実装され、一部はソフトウェア (Direct3D リファレンス ラスタライザーなど) に実装されます。 アダプターは、グラフィック アプリケーションで使用される機能を実装します。 次の図は、1 台のコンピューター、2 つのアダプター (ビデオ カード)、および 3 つの出力モニターを備えたシステムを示しています。
これらのハードウェアを列挙すると、DXGI は各出力 (またはモニター) に IDXGIOutput1 インターフェイスを作成し、各ビデオ カードの IDXGIAdapter2 インターフェイスを作成します (マザーボードに組み込まれているビデオ カード場合でも)。 列挙は、 IDXGIFactory インターフェイス呼び出し IDXGIFactory::EnumAdapters を使用して、ビデオ ハードウェアを表す IDXGIAdapter インターフェイスのセットを返すことによって行われます。
DXGI 1.1 で IDXGIFactory1 インターフェイスが 追加されました。 IDXGIFactory1::EnumAdapters1 は、ビデオ ハードウェアを表す IDXGIAdapter1 インターフェイスのセットを返します。
Direct3D API を使用するときに特定のビデオ ハードウェア機能を選択する場合は、各アダプター ハンドルと使用可能なハードウェア機能レベルを使用して D3D11CreateDevice または D3D11CreateDeviceAndSwapChain 関数を繰り返し呼び出することをお勧めします。 指定したアダプターで機能レベルがサポートされている場合、この関数は成功します。
Windows 8のアダプターの列挙に関する新しい情報
Windows 8以降、"Microsoft Basic Render Driver" と呼ばれるアダプターが常に存在します。 このアダプターには、 0x1414 の VendorId と 0x8c の DeviceID があります。 このアダプターには、 そのDXGI_ADAPTER_DESC2 構造体の Flags メンバーに設定された DXGI_ADAPTER_FLAG_SOFTWARE 値もあります。 このアダプターは、表示出力がないレンダリング専用デバイスです。 DXGI は、このアダプターの DXGI_ERROR_DEVICE_REMOVED を返しません。
コンピューターのディスプレイ ドライバーが機能していない場合、または無効になっている場合、コンピューターのプライマリ (NULL) アダプターは "Microsoft Basic Render Driver" とも呼ばれます。ただし、このアダプターには出力があり、 DXGI_ADAPTER_FLAG_SOFTWARE 値が設定されていません。 オペレーティング システムとアプリでは、既定でこのアダプターが使用されます。 ディスプレイ ドライバーがインストールされているか有効になっている場合、アプリはこのアダプター のDXGI_ERROR_DEVICE_REMOVED を受け取り、アダプターをもう一度列挙する必要があります。
コンピューターのプライマリ ディスプレイ アダプターが "Microsoft Basic Display Adapter" (WARP アダプター) の場合、そのコンピューターには 2 つ目のアダプターもあります。 この 2 番目のアダプターは、表示出力がなく、DXGI が DXGI_ERROR_DEVICE_REMOVEDを返さないレンダリング専用デバイスです。
レンダリング、コンピューティング、またはその他の実行時間の長いタスクに WARP を使用する場合は、レンダリング専用デバイスを使用することをお勧めします。 IDXGIFactory1::EnumAdapters1 メソッドを呼び出すことで、レンダリング専用デバイスへのポインターを取得できます。 また、D3D11CreateDevice の DriverType パラメーターにD3D_DRIVER_TYPE_WARPを指定すると、WARP デバイスでもレンダリング専用 WARP アダプターが使用されるため、レンダリング専用デバイスを作成します。
プレゼンテーション
アプリケーションのジョブは、フレームをレンダリングし、DXGI にそれらのフレームを出力に表示するように依頼することです。 アプリケーションに使用可能なバッファーが 2 つある場合は、1 つのバッファーをレンダリングしながら、別のバッファーを表示できます。 アプリケーションでは、フレームのレンダリングにかかる時間やプレゼンテーションに必要なフレーム レートに応じて、2 つ以上のバッファーが必要になる場合があります。 作成されたバッファーのセットは、次に示すようにスワップ チェーンと呼ばれます。
- スワップ チェーンを作成する
- スワップチェーンのケアとフィード
- ウィンドウのサイズ変更の処理
- DXGI 出力とサイズの選択
- Full-Screen モードでのデバッグ
- スワップ チェーンの破棄
- 回転モニターの使用
- モードの切り替え
- 全画面表示のパフォーマンスに関するヒント
- マルチスレッドに関する考慮事項
スワップ チェーンには、1 つのフロント バッファーと 1 つ以上のバック バッファーがあります。 各アプリケーションは、独自のスワップ チェーンを作成します。 データを出力に表示する速度を最大限に高めるために、次の図に示すように、スワップ チェーンはほぼ常にディスプレイ サブシステムのメモリに作成されます。
ディスプレイ サブシステム (多くの場合、ビデオ カードですが、マザーボードに実装できる) には、GPU、デジタルからアナログへのコンバーター (DAC)、メモリが含まれています。 このメモリ内にスワップ チェーンが割り当てられ、プレゼンテーションが非常に高速になります。 表示サブシステムは、フロント バッファー内のデータを出力に表示します。
スワップ チェーンは、全画面表示モードまたはウィンドウ モードで描画するように設定されているため、出力がウィンドウモードか全画面表示かを知る必要がなくなります。 全画面表示モードのスワップ チェーンでは、ディスプレイの解像度を切り替えることでパフォーマンスを最適化できます。
スワップ チェーンの作成
Direct3D 9 と Direct3D 10 の違い: Direct3D 10 は、DXGI を使用する最初のグラフィックス コンポーネントです。 DXGI には、いくつかの異なるスワップ チェーン動作があります。
|
スワップ チェーンのバッファーは、特定のサイズと特定の形式で作成されます。 アプリケーションでは、起動時にこれらの値を指定し (またはターゲット ウィンドウからサイズを継承できます)、必要に応じて、ユーザー入力またはプログラム イベントに応じてウィンドウ サイズが変更されるように変更できます。
スワップ チェーンを作成した後、通常はイメージをその中にレンダリングします。 スワップ チェーンにレンダリングする Direct3D コンテキストを設定するコード フラグメントを次に示します。 このコードでは、スワップ チェーンからバッファーを抽出し、そのバッファーから render-target-view を作成し、デバイスに設定します。
ID3D11Resource * pBB;
ThrowFailure( pSwapChain->GetBuffer(0, __uuidof(pBB),
reinterpret_cast<void**>(&pBB)), "Couldn't get back buffer");
ID3D11RenderTargetView * pView;
ThrowFailure( pD3D11Device->CreateRenderTargetView(pBB, NULL, &pView),
"Couldn't create view" );
pD3D11DeviceContext->OMSetRenderTargets(1, &pView, 0);
アプリケーションがフレームをスワップ チェーン バッファーにレンダリングしたら、 IDXGISwapChain1::P resent1 を呼び出します。 その後、アプリケーションは次のイメージをレンダリングできます。
スワップチェーンのケアとフィード
イメージをレンダリングした後、 IDXGISwapChain1::P resent1 を呼び出し、次のイメージをレンダリングします。 それはあなたの責任の範囲です。
以前に IDXGIFactory::MakeWindowAssociation を呼び出した場合、ユーザーは Alt-Enter キーの組み合わせを押すと、DXGI によってウィンドウ モードと全画面表示モードの間でアプリケーションが切り替わります。 IDXGIFactory::MakeWindowAssociation は、ユーザーの標準的な制御メカニズムが強く望まれているため、推奨されます。
記述したコード以上のコードを記述する必要はありませんが、いくつかの簡単な手順でアプリケーションの応答性を高めることができます。 最も重要な考慮事項は、出力ウィンドウのサイズ変更に応じてスワップ チェーンのバッファーのサイズを変更することです。 当然ながら、アプリケーションの最適なルートは、WM_SIZEに応答し、 IDXGISwapChain::ResizeBuffers を呼び出して、メッセージのパラメーターに含まれるサイズを渡すことです。 この動作により、ウィンドウの境界線をドラッグしたときにアプリケーションがユーザーに適切に応答することは明らかですが、スムーズな全画面表示が可能になるのも正確です。 このような遷移が発生するたびに、ウィンドウにWM_SIZE メッセージが表示されます。 IDXGISwapChain::ResizeBuffers を呼び出すことは、最適なプレゼンテーションのためにバッファーのストレージを再割り当てするスワップ チェーンの機会です。 このため、アプリケーションは IDXGISwapChain::ResizeBuffers を呼び出す前に、既存のバッファーに対する参照を解放する必要があります。
全画面表示モードへの切り替えに応答して IDXGISwapChain::ResizeBuffers を呼び出さないと (WM_SIZEに応じて)、反転の最適化が妨げられます。DXGI では、全画面表示の価値のあるデータをコピーするのではなく、表示されているバッファーをスワップするだけで済みます。
IDXGISwapChain1::P resent1 は、出力ウィンドウが DXGI_STATUS_OCCLUDED経由で完全にオクルージョンされているかどうかを通知します。 この場合は、フレームのレンダリングに使用されるリソースが無駄になるため、アプリケーションをスタンバイ モードにすることをお勧めします ( idXGISwapChain1::P resent1 を DXGI_PRESENT_TESTで呼び出します)。 DXGI_PRESENT_TESTを使用すると、オクルージョン チェックの実行中にデータが表示されなくなります。 IDXGISwapChain1::P resent1 がS_OKを返したら、スタンバイ モードを終了する必要があります。戻りコードを使用してスタンバイ モードに切り替えないでください。そうすると、スワップ チェーンが全画面表示モードを放棄できなくなる可能性があります。
Windows 8 以降で使用できる Direct3D 11.1 ランタイムは、フリップ モデルスワップ チェーン (つまり、DXGI_SWAP_CHAIN_DESCまたはDXGI_SWAP_CHAIN_DESC1 の SwapEffect メンバーにDXGI_SWAP_EFFECT_FLIP_SEQUENTIAL値が設定されたスワップ チェーン) を提供します。 フリップ モデル スワップ チェーンを使用してフレームを出力に提示すると、DXGI は、出力マージ レンダー ターゲットなど、バック バッファー 0 に書き込むすべてのパイプライン状態の場所からバック バッファーをバインド解除します。 そのため、バック バッファーにレンダリングする直前に ID3D11DeviceContext::OMSetRenderTargets を呼び出することをお勧めします。 たとえば、 OMSetRenderTargets を呼び出し、最終的にリソースにレンダリングされないコンピューティング シェーダーの作業を実行しないでください。 フリップ モデル スワップ チェーンとその利点の詳細については、「 DXGI Flip Model」を参照してください。
Note
Direct3D 10 および Direct3D 11 では、 IDXGISwapChain1::P resent1 を呼び出した後に 、IDXGISwapChain:: GetBuffer を呼び出してバック バッファー 0 を取得する必要はありません。これは、便宜上、バック バッファーの ID が変更されるためです。 これはDirect3D 12では発生しません。アプリケーションでは、代わりにバック バッファー インデックスを手動で追跡する必要があります。
ウィンドウのサイズ変更の処理
IDXGISwapChain::ResizeBuffers メソッドを使用して、ウィンドウのサイズ変更を処理できます。 ResizeBuffers を呼び出す前に、スワップ チェーンのバッファーへの未処理の参照をすべて解放する必要があります。 通常、スワップ チェーンのバッファーへの参照を保持するオブジェクトは、render-target-view です。
次のコード例は、WM_SIZE メッセージの WindowProc ハンドラー内から ResizeBuffers を呼び出す方法を示しています。
case WM_SIZE:
if (g_pSwapChain)
{
g_pd3dDeviceContext->OMSetRenderTargets(0, 0, 0);
// Release all outstanding references to the swap chain's buffers.
g_pRenderTargetView->Release();
HRESULT hr;
// Preserve the existing buffer count and format.
// Automatically choose the width and height to match the client rect for HWNDs.
hr = g_pSwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0);
// Perform error handling here!
// Get buffer and create a render-target-view.
ID3D11Texture2D* pBuffer;
hr = g_pSwapChain->GetBuffer(0, __uuidof( ID3D11Texture2D),
(void**) &pBuffer );
// Perform error handling here!
hr = g_pd3dDevice->CreateRenderTargetView(pBuffer, NULL,
&g_pRenderTargetView);
// Perform error handling here!
pBuffer->Release();
g_pd3dDeviceContext->OMSetRenderTargets(1, &g_pRenderTargetView, NULL );
// Set up the viewport.
D3D11_VIEWPORT vp;
vp.Width = width;
vp.Height = height;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
g_pd3dDeviceContext->RSSetViewports( 1, &vp );
}
return 1;
DXGI の出力とサイズの選択
既定では、DXGI は、ウィンドウのほとんどのクライアント領域を含む出力を選択します。 これは、alt キーを押しながら Enter キーを押したときに、DXGI 自体が全画面表示になる場合に使用できる唯一のオプションです。 アプリケーションが単独で全画面表示モードに移行することを選択した場合は、 IDXGISwapChain::SetFullscreenState を呼び出し、明示的な IDXGIOutput1 を渡すことができます (アプリケーションが DXGI で決定できる場合は NULL)。
全画面表示またはウィンドウで出力のサイズを変更するには、 IDXGISwapChain::ResizeTarget を呼び出すようにお勧めします。これは、このメソッドによってターゲット ウィンドウのサイズも変更されるためです。 ターゲット ウィンドウのサイズが変更されるため、オペレーティング システムは WM_SIZEを送信し、コードは応答で IDXGISwapChain::ResizeBuffers を自然に呼び出します。 したがって、バッファーのサイズを変更してからターゲットのサイズを変更するのは無駄です。
全画面表示モードでのデバッグ
DXGI スワップ チェーンは、絶対に必要な場合にのみ全画面表示モードを必要とします。 つまり、デバッグ ウィンドウがスワップ チェーンのターゲット ウィンドウと重なっていない限り、複数のモニターを使用して全画面表示アプリケーションをデバッグできます。 または、 DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH フラグを設定しないことで、モードの切り替えを完全に防ぐことができます。
モード切り替えが許可されている場合、スワップ チェーンは、出力ウィンドウが別のウィンドウによって隠されるたびに全画面表示モードを放棄します。 オクルージョン チェックは、IDXGISwapChain1::P resent1 の間、またはアプリケーションが応答しなくなったかどうかを確認するためにwatchすることを目的とする別のスレッドによって実行されます (IDXGISwapChain1::P resent1 を呼び出さなくなりました)。 切り替えを行う別のスレッドの機能を無効にするには、次のレジストリ キーを 0 以外の値に設定します。
HKCU\Software\Microsoft\DXGI\DisableFullscreenWatchdog
スワップ チェーンの破棄
スワップ チェーンを全画面表示モードで解放することはできません。これは、スレッドの競合が発生する可能性があるためです (DXGI によって連続しない例外が発生します)。 スワップ チェーンを解放する前に、まずウィンドウ モード ( IDXGISwapChain::SetFullscreenState( FALSE, NULL )) に切り替えてから、 IUnknown::Release を呼び出します。
回転モニターの使用
アプリケーションはモニターの向きについて心配する必要はありません。DXGI は、必要に応じて、プレゼンテーション中にスワップ チェーン バッファーをローテーションします。 もちろん、この追加のローテーションはパフォーマンスに影響を与える可能性があります。 最適なパフォーマンスを得るために、次の手順を実行して、アプリケーションのローテーションに注意してください。
- DXGI_SWAP_CHAIN_FLAG_NONPREROTATEDを使用 します。 これにより、アプリケーションで回転したイメージが生成されることを DXGI に通知します (たとえば、プロジェクション マトリックスを変更します)。 注意すべき点の 1 つは、このフラグは全画面表示モードの間のみ有効です。
- 各スワップ チェーン バッファーを回転サイズで割り当てます。 必要に応じて、 IDXGIOutput::GetDesc を使用してこれらの値を取得します。
アプリケーションでローテーションを実行すると、DXGI は単にコピーとローテーションの代わりにコピーを実行します。
Windows 8 以降で使用できる Direct3D 11.1 ランタイムは、フリップ モデルのスワップ チェーン (つまり、DXGI_SWAP_CHAIN_DESC1 の SwapEffect メンバーにDXGI_SWAP_EFFECT_FLIP_SEQUENTIAL値が設定されたスワップ チェーン) を提供します。 フリップモデルのスワップ チェーンで使用できるプレゼンテーションの最適化を最大化するには、コンテンツが出力を完全に占有する場合に、コンテンツが存在する特定の出力に合わせてコンテンツを配置することをお勧めします。 フリップ モデル スワップ チェーンとその利点の詳細については、「 DXGI Flip Model」を参照してください。
モードの切り替え
DXGI スワップ チェーンは、全画面表示を行うときに出力の表示モードを変更する可能性があります。 自動表示モードの変更を有効にするには、スワップ チェーンの説明で DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH を指定する必要があります。 表示モードが自動的に変更された場合、DXGI は最も控えめなモードを選択します (サイズと解像度は変更されませんが、色の深さが変わる場合があります)。 スワップ チェーン バッファーのサイズを変更しても、モード スイッチは発生しません。 スワップ チェーンでは、ターゲット出力でサポートされている表示モードと完全に一致するバック バッファーを選択すると、その出力で全画面表示モードに入ると、その表示モードに切り替わるという暗黙的な約束が行われます。 そのため、バック バッファーのサイズと形式を選択して、表示モードを選択します。
全画面表示のパフォーマンスのヒント
全画面表示アプリケーションで IDXGISwapChain1::P resent1 を呼び出すと、スワップ チェーンはバック バッファーの内容をフロント バッファーに (blits ではなく) 反転します。 これには、( DXGI_SWAP_CHAIN_DESC1で指定された) 列挙表示モードを使用してスワップ チェーンが作成されている必要があります。 表示モードの列挙に失敗した場合、または説明で表示モードを誤って指定した場合、スワップ チェーンは代わりにビット ブロック転送 (ビットblt) を実行する可能性があります。 bitblt は、余分なストレッチ コピーとビデオ メモリ使用量の増加を引き起こし、検出が困難です。 この問題を回避するには、スワップ チェーンを作成する前に、表示モードを列挙し、スワップ チェーンの説明を正しく初期化します。 これにより、全画面表示モードで反転するときの最大のパフォーマンスが保証され、余分なメモリ オーバーヘッドが回避されます。
マルチスレッドに関する考慮事項
複数のスレッドを持つアプリケーションで DXGI を使用する場合は、2 つの異なるスレッドが互いに完了を待機しているデッドロックが発生しないように注意する必要があります。 これが発生する可能性がある状況は 2 つあります。
- レンダリング スレッドはメッセージ ポンプ スレッドではありません。
- DXGI API を実行するスレッドは、ウィンドウを作成したスレッドと同じではありません。
全画面表示スワップ チェーンを使用するときに、メッセージ ポンプ スレッドがレンダリング スレッドで待機しないように注意してください。 たとえば、(レンダリング スレッドから) IDXGISwapChain1::P resent1 を呼び出すと、レンダリング スレッドがメッセージ ポンプ スレッドで待機する可能性があります。 モードの変更が発生した場合、 Present1 が ::SetWindowPos() または ::SetWindowStyle() を呼び出し、これらのメソッドのいずれかが ::SendMessage() を呼び出す場合に、このシナリオが可能になります。 このシナリオでは、メッセージ ポンプ スレッドに重要なセクションが含まれている場合、またはレンダリング スレッドがブロックされている場合、2 つのスレッドがデッドロックします。
複数のスレッドで DXGI を使用する方法の詳細については、「 マルチスレッドと DXGI」を参照してください。
DLLMain からの DXGI 応答
DllMain 関数は DLL の読み込みとアンロードの順序を保証できないため、オブジェクトを作成または解放する関数やメソッドを含め、アプリの DllMain 関数は Direct3D または DXGI 関数またはメソッドを呼び出しないことをお勧めします。 アプリの DllMain 関数が特定のコンポーネントを呼び出すと、そのコンポーネントによってオペレーティング システムに存在しない別の DLL が呼び出され、オペレーティング システムがクラッシュする可能性があります。 Direct3D と DXGI は、コンピューターごとに異なる一連の DLL (通常はドライバーのセット) を読み込む場合があります。 そのため、 DllMain 関数が Direct3D または DXGI 関数またはメソッドを呼び出したときに、開発用コンピューターやテスト コンピューターでアプリがクラッシュしない場合でも、別のコンピューターで実行するとクラッシュする可能性があります。
オペレーティング システムがクラッシュする可能性があるアプリを作成しないようにするために、DXGI は指定された状況で次の応答を提供します。
- アプリの DllMain 関数が DXGI ファクトリへの最後の参照を解放すると、DXGI によって例外が発生します。
- アプリの DllMain 関数によって DXGI ファクトリが作成された場合、DXGI はエラー コードを返します。
DXGI 1.1 の変更
DXGI 1.1 で次の機能を追加しました。
同期された共有サーフェスのサポート
Direct3D 10.1 と Direct3D 11 の同期された共有サーフェスを使用すると、複数の Direct3D デバイス間で効率的な読み取りと書き込みのサーフェス共有が可能になります (Direct3D 10 と Direct3D 11 デバイス間の共有が可能です)。 「IDXGIKeyedMutex::AcquireSync」および「IDXGIKeyedMutex::ReleaseSync」を参照してください。
高い色のサポート
DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM形式をサポートします。
IDXGIDevice1::SetMaximumFrameLatency と IDXGIDevice1::GetMaximumFrameLatency
IDXGIFactory1::EnumAdapters1 は、モニターまたは出力がアタッチされていないローカル アダプターと、出力がアタッチされたアダプターを列挙します。 最初に返されるアダプターは、デスクトップ プライマリが表示されるローカル アダプターです。
BGRA 形式のサポート
DXGI_FORMAT_B8G8R8A8_UNORMとDXGI_FORMAT_B8G8R8A8_UNORM_SRGBについては、「 IDXGISurface1::GetDC 」および 「IDXGISurface1::ReleaseDC」を参照してください。
DXGI 1.2 の変更
DXGI 1.2 に次の機能を追加しました。
- ステレオ スワップ チェーン
- フリップモデルスワップチェーン
- 最適化されたプレゼンテーション (スクロール、ダーティ四角形、回転)
- 共有リソースと同期の改善
- デスクトップの重複
- ビデオ メモリの最適化された使用
- 16 ビット/ピクセル (bpp) 形式のサポート (DXGI_FORMAT_B5G6R5_UNORM、DXGI_FORMAT_B5G5R5A1_UNORM、DXGI_FORMAT_B4G4R4A4_UNORM)
- API のデバッグ
DXGI 1.2 の詳細については、「 DXGI 1.2 の機能強化」を参照してください。