IDXGISwapChain1
COM公式ドキュメント
IDXGISwapChain を拡張した表示(プレゼント)機能を提供します。これらの表示機能は、表示を最適化するためのダーティ矩形とスクロール矩形の指定から構成されます。
解説(Remarks)
スワップチェーンは、IDXGIFactory2::CreateSwapChainForHwnd、IDXGIFactory2::CreateSwapChainForCoreWindow、または IDXGIFactory2::CreateSwapChainForComposition を呼び出すことで作成できます。D3D11CreateDeviceAndSwapChain を呼び出したときにもスワップチェーンを作成できますが、その場合は IDXGISwapChain インターフェイスが提供するスワップチェーン機能のサブセットにしかアクセスできません。
IDXGISwapChain1 は IsTemporaryMonoSupported メソッドを提供します。このメソッドを使用すると、スワップチェーンが「一時的なモノラル(temporary mono)」表示をサポートするかどうかを判別できます。この種類のスワップチェーンは、モノラルコンテンツの表示に使用できるステレオスワップチェーンです。
メソッド 11
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
スワップチェーンの記述を取得します。
| pDesc | DXGI_SWAP_CHAIN_DESC1* | out | スワップチェーンを記述する DXGI_SWAP_CHAIN_DESC1 構造体へのポインター。 |
戻り値
成功した場合は S_OK を返し、それ以外の場合はエラーコードを返します。エラーコードの一覧については、DXGI_ERROR を参照してください。
全画面スワップチェーンの記述を取得します。
| pDesc | DXGI_SWAP_CHAIN_FULLSCREEN_DESC* | out | 全画面スワップチェーンを記述する DXGI_SWAP_CHAIN_FULLSCREEN_DESC 構造体へのポインター。 |
戻り値
GetFullscreenDesc は次を返します。
- 全画面スワップチェーンの記述の取得に成功した場合は S_OK。
- 非 HWND スワップチェーンの場合、または pDesc が NULL の場合は DXGI_ERROR_INVALID_CALL。
- その他、DXGI_ERROR のトピックで説明されているエラーコードが返される場合があります。
解説(Remarks)
GetFullscreenDesc のセマンティクスは、HWND ベースのスワップチェーンに対する IDXGISwapchain::GetDesc メソッドと同一です。
このスワップチェーンオブジェクトの基になる HWND を取得します。
| pHwnd | HWND* | out | スワップチェーンオブジェクトの HWND を受け取る変数へのポインター。 |
戻り値
成功した場合は S_OK を返し、それ以外の場合はエラーコードを返します。エラーコードの一覧については、DXGI_ERROR を参照してください。
pHwnd が NULL を受け取った場合(つまり、スワップチェーンが HWND ベースでない場合)、GetHwnd は DXGI_ERROR_INVALID_CALL を返します。
解説(Remarks)
アプリケーションは IDXGIFactory2::CreateSwapChainForHwnd メソッドを呼び出して、HWND に関連付けられたスワップチェーンを作成します。
このスワップチェーンオブジェクトの基になる CoreWindow オブジェクトを取得します。
| refiid | GUID* | in | ppUnk パラメーターによって参照される CoreWindow オブジェクトのグローバル一意識別子(GUID)へのポインター。 |
| ppUnk | void** | out | CoreWindow オブジェクトへのポインターを受け取る変数へのポインター。 |
戻り値
GetCoreWindow は次を返します。
- 基になる CoreWindow オブジェクトの取得に成功した場合は S_OK。
- ppUnk が NULL の場合、つまりスワップチェーンが CoreWindow オブジェクトに関連付けられていない場合は DXGI_ERROR_INVALID_CALL。
- CoreWindow オブジェクトを照会するための QueryInterface の呼び出しが通常返す可能性のある任意の HRESULT。
- その他、DXGI_ERROR のトピックで説明されているエラーコードが返される場合があります。
Windows 7 用のプラットフォーム更新プログラム: Windows 7 用のプラットフォーム更新プログラム がインストールされた Windows 7 または Windows Server 2008 R2 では、GetCoreWindow は E_NOTIMPL で失敗します。Windows 7 用のプラットフォーム更新プログラムの詳細については、Windows 7 用のプラットフォーム更新プログラム を参照してください。
解説(Remarks)
アプリケーションは IDXGIFactory2::CreateSwapChainForCoreWindow メソッドを呼び出して、CoreWindow オブジェクトに関連付けられたスワップチェーンを作成します。
フレームをディスプレイ画面に表示(プレゼント)します。
| SyncInterval | DWORD | in | フレームの表示を垂直ブランクとどのように同期させるかを指定する整数値です。 ビットブロック転送(bitblt)モデル(DXGI_SWAP_EFFECT_DISCARD または DXGI_SWAP_EFFECT_SEQUENTIAL)の場合、値は次のとおりです。
更新領域が複数の出力(アウトプット)(それぞれ IDXGIOutput1 で表される)にまたがる場合、Present1 は、対象ウィンドウのクライアント領域の最も大きな部分矩形を含む出力に対して同期を実行します。 |
| PresentFlags | DXGI_PRESENT | in | スワップチェーンの表示オプションを含む整数値です。これらのオプションは DXGI_PRESENT 定数によって定義されます。 |
| pPresentParameters | DXGI_PRESENT_PARAMETERS* | in | 表示するフレームの更新矩形とスクロール情報を記述する DXGI_PRESENT_PARAMETERS 構造体へのポインター。 |
戻り値
返される可能性のある値には、S_OK、DXGI_ERROR_DEVICE_REMOVED、DXGI_STATUS_OCCLUDED、DXGI_ERROR_INVALID_CALL、E_OUTOFMEMORY があります。
解説(Remarks)
アプリは、Present1 を使用してスクロール矩形とダーティ矩形を指定することで、表示を最適化できます。ランタイムがこれらの矩形に関する情報を持っている場合、ランタイムは表示中に必要なビットブロック転送(bitblt)をより効率的に実行し、このメタデータをデスクトップウィンドウマネージャー(DWM)に渡すことができます。DWM はこのメタデータを使用して表示を最適化し、間接ディスプレイやターミナルサーバーにメタデータを渡して、通信経路上のトラフィックを最適化できます。アプリは、変更を Present1 に渡すダーティ領域のみに限定し、なおかつ未定義のリソース内容が露出しないようにダーティ領域全体を変更する必要があります。
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL の値を設定して作成したフリップ表示モデルのスワップチェーンでは、表示に成功すると、バックバッファー 0 がグラフィックスパイプラインからバインド解除されます。ただし、Flags パラメーターに DXGI_PRESENT_DO_NOT_SEQUENCE フラグを渡した場合を除きます。
コンテンツを画面に表示するときにデータ値がどのように変化するかについては、色空間に合わせたデータの変換 を参照してください。
アプリが複数のスレッドを使用する場合に Present1 を呼び出す方法については、マルチスレッドに関する考慮事項 および マルチスレッドと DXGI を参照してください。
フリップ表示モデルのキュー
Present1 を呼び出す前に、同期間隔の値を持つ次のフレームが、最も古いもの(A)から最も新しいもの(E)までキューに入っているとします。A: 3、B: 0、C: 0、D: 1、E: 0
Present1 を呼び出すと、ランタイムはフレーム A を垂直ブランク間隔 1 回分のみ表示します。フレーム B の同期間隔が 0 であるため、ランタイムはフレーム A を早めに終了します。次に、ランタイムはフレーム D を垂直ブランク間隔 1 回分表示し、その後、新しい表示を送信するまでフレーム E を表示します。ランタイムはフレーム B と C を破棄します。
可変リフレッシュレートディスプレイ
可変リフレッシュレートディスプレイでは、ティアリングが有効になっていることが要件となります。この機能が利用可能かどうかを判別するには CheckFeatureSupport メソッドを使用できます。また、必要なフラグを設定する方法については、DXGI_PRESENT_ALLOW_TEARING および DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING の説明と、DXGI 1.5 の改善点 の 可変リフレッシュレートディスプレイ/Vsync オフ のセクションを参照してください。スワップチェーンが「一時的なモノラル(temporary mono)」をサポートするかどうかを判別します。
戻り値
スワップチェーンを一時的なモノラルモードで使用できるかどうかを示します。TRUE は一時的なモノラルモードを使用できることを示し、それ以外の場合は FALSE です。
Windows 7 用のプラットフォーム更新プログラム: Windows 7 用のプラットフォーム更新プログラム がインストールされた Windows 7 または Windows Server 2008 R2 では、Windows 7 用のプラットフォーム更新プログラムでは立体視 3D 表示の動作が利用できないため、IsTemporaryMonoSupported は常に FALSE を返します。Windows 7 用のプラットフォーム更新プログラムの詳細については、Windows 7 用のプラットフォーム更新プログラム を参照してください。
解説(Remarks)
一時的なモノラルは、ステレオスワップチェーンを左バッファーの内容だけを使用して表示できる機能です。左バッファーをモノラルバッファーとして使用して表示するには、アプリケーションは DXGI_PRESENT_STEREO_TEMPORARY_MONO フラグを指定して IDXGISwapChain1::Present1 メソッドを呼び出します。すべてのウィンドウ表示スワップチェーンは一時的なモノラルをサポートします。ただし、すべてのハードウェアが全画面スワップチェーンで一時的なモノラルを効率的にサポートするわけではないため、全画面スワップチェーンでの一時的なモノラルのサポートは任意です。
表示(プレゼント)操作の内容を制限できる出力(アウトプット)(ディスプレイモニター)を取得します。
| ppRestrictToOutput | IDXGIOutput** | out | 制限先の出力に対する IDXGIOutput インターフェイスへのポインターを受け取るバッファーへのポインター。アプリケーションは、この IDXGIOutput へのポインターを、IDXGIFactory2::CreateSwapChainForHwnd、IDXGIFactory2::CreateSwapChainForCoreWindow、または IDXGIFactory2::CreateSwapChainForComposition メソッドの呼び出しに渡して、スワップチェーンを作成します。 |
戻り値
制限先の出力の取得に成功した場合は S_OK を返します。それ以外の場合、ポインターが無効であれば E_INVALIDARG を返します。
解説(Remarks)
メソッドが成功すると、ランタイムは ppRestrictToOutput のバッファーを、制限先の出力インターフェイスへのポインターで満たします。この制限先の出力インターフェイスは、参照カウントがインクリメントされます。使用が終わったら、メモリリークを避けるために必ずインターフェイスを解放してください。
この出力は、スワップチェーンのデバイスが作成されたアダプターによっても所有されます。
スワップチェーンの背景色を変更します。
| pColor | DXGI_RGBA* | in | 設定する背景色を指定する DXGI_RGBA 構造体へのポインター。 |
戻り値
SetBackgroundColor は次を返します。
- 背景色の設定に成功した場合は S_OK。
- pColor パラメーターが正しくない場合は E_INVALIDARG。たとえば、pColor が NULL である場合や、pColor が指す DXGI_RGBA のメンバーの浮動小数点値のいずれかが 0.0〜1.0 の範囲外である場合です。
- その他、DXGI_ERROR のトピックで説明されているエラーコードが返される場合があります。
Windows 7 用のプラットフォーム更新プログラム: Windows 7 用のプラットフォーム更新プログラム がインストールされた Windows 7 または Windows Server 2008 R2 では、SetBackgroundColor は E_NOTIMPL で失敗します。Windows 7 用のプラットフォーム更新プログラムの詳細については、Windows 7 用のプラットフォーム更新プログラム を参照してください。
解説(Remarks)
背景色は、ウィンドウモードで DXGI_SCALING_NONE を指定して作成したスワップチェーンにのみ影響します。この値は、IDXGIFactory2::CreateSwapChainForHwnd、IDXGIFactory2::CreateSwapChainForCoreWindow、または IDXGIFactory2::CreateSwapChainForComposition の呼び出しに渡します。通常、背景色は、スワップチェーンの内容が送信先ウィンドウより小さい場合を除いて表示されません。
背景色を設定しても、すぐには反映されません。次に IDXGISwapChain1::Present1 メソッドを呼び出したときに、それと合わせて有効になります。IDXGISwapChain1::Present1 に渡す DXGI_PRESENT フラグは、必要な効果を実現するのに役立ちます。たとえば、SetBackgroundColor を呼び出した後、Flags パラメーターを DXGI_PRESENT_DO_NOT_SEQUENCE に設定して IDXGISwapChain1::Present1 を呼び出すと、スワップチェーンの表示内容を変更せずに背景色だけを変更できます。
IDXGISwapChain1::Present1 メソッドを呼び出してスワップチェーンの内容を表示すると、IDXGISwapChain1::Present1 は、DXGI_SWAP_CHAIN_DESC1 構造体の AlphaMode メンバーで指定された DXGI_ALPHA_MODE の値を使用して、DXGI_RGBA 構造体の a メンバー、すなわちウィンドウの透過を実現する背景色のアルファ値をどのように扱うかを決定します。たとえば、AlphaMode が DXGI_ALPHA_MODE_IGNORE の場合、IDXGISwapChain1::Present1 は DXGI_RGBA の a メンバーを無視します。
スワップチェーンの背景色を取得します。
| pColor | DXGI_RGBA* | out | スワップチェーンの背景色を受け取る DXGI_RGBA 構造体へのポインター。 |
戻り値
GetBackgroundColor は次を返します。
- 背景色の取得に成功した場合は S_OK。
- pColor パラメーターが無効な場合、たとえば pColor が NULL の場合は DXGI_ERROR_INVALID_CALL。
- その他、DXGI_ERROR のトピックで説明されているエラーコードが返される場合があります。
解説(Remarks)
スワップチェーンのバックバッファーの回転を設定します。
| Rotation | DXGI_MODE_ROTATION | in | スワップチェーンのバックバッファーの回転をどのように設定するかを指定する DXGI_MODE_ROTATION 型の値。 |
戻り値
SetRotation は次を返します。
- 回転の設定に成功した場合は S_OK。
- スワップチェーンがビットブロック転送(bitblt)モデルの場合は DXGI_ERROR_INVALID_CALL。SetRotation を正常に呼び出すには、スワップチェーンがフリップモデルである必要があります。
- その他、DXGI_ERROR のトピックで説明されているエラーコードが返される場合があります。
Windows 7 用のプラットフォーム更新プログラム: Windows 7 用のプラットフォーム更新プログラム がインストールされた Windows 7 または Windows Server 2008 R2 では、SetRotation は DXGI_ERROR_INVALID_CALL で失敗します。Windows 7 用のプラットフォーム更新プログラムの詳細については、Windows 7 用のプラットフォーム更新プログラム を参照してください。
解説(Remarks)
SetRotation は、ウィンドウモードで表示するフリップモデルのスワップチェーンのバックバッファーを回転させる場合にのみ使用できます。
SetRotation は、全画面モードで表示するフリップモデルのスワップチェーンのバックバッファーの回転をサポートしていません。この場合、SetRotation は失敗しませんが、スワップチェーンに回転なし(DXGI_MODE_ROTATION_IDENTITY)を指定していることを確認する必要があります。そうしないと、IDXGISwapChain1::Present1 または IDXGISwapChain::Present を呼び出してフレームを表示するときに、表示が失敗します。
スワップチェーンのバックバッファーの回転を取得します。
| pRotation | DXGI_MODE_ROTATION* | out | スワップチェーンのバックバッファーの回転を示す DXGI_MODE_ROTATION 型の値を受け取る変数へのポインター。 |
戻り値
成功した場合は S_OK を返し、それ以外の場合はエラーコードを返します。エラーコードの一覧については、DXGI_ERROR を参照してください。
Windows 7 用のプラットフォーム更新プログラム: Windows 7 用のプラットフォーム更新プログラム がインストールされた Windows 7 または Windows Server 2008 R2 では、GetRotation は DXGI_ERROR_INVALID_CALL で失敗します。Windows 7 用のプラットフォーム更新プログラムの詳細については、Windows 7 用のプラットフォーム更新プログラム を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDXGISwapChain1 "{790A45F7-0D42-4876-983A-0A55CFE6F4AA}" #usecom global IDXGISwapChain1 IID_IDXGISwapChain1 "{}" #comfunc global IDXGISwapChain1_GetDesc1 18 var #comfunc global IDXGISwapChain1_GetFullscreenDesc 19 var #comfunc global IDXGISwapChain1_GetHwnd 20 sptr #comfunc global IDXGISwapChain1_GetCoreWindow 21 var,sptr #comfunc global IDXGISwapChain1_Present1 22 int,int,var #comfunc global IDXGISwapChain1_IsTemporaryMonoSupported 23 #comfunc global IDXGISwapChain1_GetRestrictToOutput 24 sptr #comfunc global IDXGISwapChain1_SetBackgroundColor 25 var #comfunc global IDXGISwapChain1_GetBackgroundColor 26 var #comfunc global IDXGISwapChain1_SetRotation 27 int #comfunc global IDXGISwapChain1_GetRotation 28 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDXGISwapChain1 "{790A45F7-0D42-4876-983A-0A55CFE6F4AA}" #usecom global IDXGISwapChain1 IID_IDXGISwapChain1 "{}" #comfunc global IDXGISwapChain1_GetDesc1 18 sptr #comfunc global IDXGISwapChain1_GetFullscreenDesc 19 sptr #comfunc global IDXGISwapChain1_GetHwnd 20 sptr #comfunc global IDXGISwapChain1_GetCoreWindow 21 sptr,sptr #comfunc global IDXGISwapChain1_Present1 22 int,int,sptr #comfunc global IDXGISwapChain1_IsTemporaryMonoSupported 23 #comfunc global IDXGISwapChain1_GetRestrictToOutput 24 sptr #comfunc global IDXGISwapChain1_SetBackgroundColor 25 sptr #comfunc global IDXGISwapChain1_GetBackgroundColor 26 sptr #comfunc global IDXGISwapChain1_SetRotation 27 int #comfunc global IDXGISwapChain1_GetRotation 28 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。