IDXGIOutput
COM公式ドキュメント
IDXGIOutput インターフェイスは、アダプターの出力(モニターなど)を表します。
解説(Remarks)
利用可能な出力を確認するには、IDXGIAdapter::EnumOutputs を使用します。スワップチェーンが更新する特定の出力を確認するには、IDXGISwapChain::GetContainingOutput を使用します。
メソッド 12
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
出力の記述を取得します。
| pDesc | DXGI_OUTPUT_DESC* | out | 出力記述へのポインター(DXGI_OUTPUT_DESC を参照)。 |
戻り値
Type: HRESULT
成功または失敗を示すコードを返します。成功した場合は S_OK、pDesc が NULL として渡された場合は DXGI_ERROR_INVALID_CALL を返します。
解説(Remarks)
高 DPI デスクトップでは、アプリが高 DPI 対応としてマークされていない限り、GetDesc は視覚化された画面サイズを返します。DPI 対応の Win32 アプリの作成方法については、高 DPI を参照してください。
要求されたフォーマットおよびその他の入力オプションに一致するディスプレイモードを取得します。(IDXGIOutput.GetDisplayModeList)
| EnumFormat | DXGI_FORMAT | in | カラーフォーマット(DXGI_FORMAT を参照)。 |
| Flags | DXGI_ENUM_MODES | in | 含めるモードのオプション(DXGI_ENUM_MODES を参照)。スケーリングを必要とするディスプレイモードを列挙するには、DXGI_ENUM_MODES_SCALING を指定する必要があります。スケーリングを必要とせず、ディスプレイ出力に直接対応する中央揃えのモードは、既定で列挙されます。 |
| pNumModes | DWORD* | inout | pDesc を NULL に設定すると、pNumModes はフォーマットとオプションに一致するディスプレイモードの数を返します。それ以外の場合、pNumModes は pDesc に返されたディスプレイモードの数を返します。 |
| pDesc | DXGI_MODE_DESC* | outoptional | ディスプレイモードのリストへのポインター(DXGI_MODE_DESC を参照)。ディスプレイモードの数を取得するには NULL に設定します。 |
戻り値
Type: HRESULT
以下の DXGI_ERROR のいずれかを返します。まれではありますが、このメソッドの呼び出し直後に利用可能なディスプレイモードが変化することがあり、その場合(すべてのディスプレイモードを格納する十分な領域がない場合)は DXGI_ERROR_MORE_DATA が返されます。GetDisplayModeList がリモートデスクトップサービスセッション(旧称ターミナルサービスセッション)から呼び出された場合は、DXGI_ERROR_NOT_CURRENTLY_AVAILABLE が返されます。
解説(Remarks)
一般に、ウィンドウモードから全画面モードに切り替える際、スワップチェーンはスワップチェーンの解像度、色深度、リフレッシュレートを満たす(またはそれを上回る)ディスプレイモードを自動的に選択します。ディスプレイモードをより細かく制御するには、この API を使用して、モニターの機能に対して検証されたディスプレイモードのセット、または(デスクトップ設定がモニターに対して検証されない場合は)デスクトップに一致するすべてのモードをポーリングします。
示されているとおり、この API は 2 回呼び出すように設計されています。1 回目は利用可能なモードの数を取得するため、2 回目はモードの記述を返すためです。
UINT num = 0;
DXGI_FORMAT format = DXGI_FORMAT_R32G32B32A32_FLOAT;
UINT flags = DXGI_ENUM_MODES_INTERLACED;
pOutput->GetDisplayModeList( format, flags, &num, 0);
...
DXGI_MODE_DESC * pDescs = new DXGI_MODE_DESC[num];
pOutput->GetDisplayModeList( format, flags, &num, pDescs);
要求されたディスプレイモードに最も近いディスプレイモードを検索します。(IDXGIOutput.FindClosestMatchingMode)
| pModeToMatch | DXGI_MODE_DESC* | in | 希望するディスプレイモード(DXGI_MODE_DESC を参照)。DXGI_MODE_DESC のメンバーは未指定にすることができ、その場合そのメンバーに対する優先指定がないことを示します。Width または Height の値が 0 の場合は、その値が未指定であることを示します。Width または Height のいずれかが 0 の場合は、両方とも 0 でなければなりません。RefreshRate の分子と分母が 0 の場合は、未指定であることを示します。DXGI_MODE_DESC のその他のメンバーには、そのメンバーが未指定であることを示す列挙値があります。pConcernedDevice が NULL の場合、Format を DXGI_FORMAT_UNKNOWN にすることはできません。 |
| pClosestMatch | DXGI_MODE_DESC* | out | pModeToMatch に最も近いモード。 |
| pConcernedDevice | IUnknown* | inoptional | Direct3D デバイスインターフェイスへのポインター。このパラメーターが NULL の場合、フォーマットが pModeToMatch のフォーマットに一致するモードのみが返されます。それ以外の場合は、デバイスがスキャンアウトをサポートするフォーマットのみが返されます。各機能レベルでデバイスがスキャンアウトをサポートするフォーマットについては、以下を参照してください。 |
戻り値
Type: HRESULT
以下の DXGI_ERROR のいずれかを返します。
解説(Remarks)
FindClosestMatchingMode は IDXGIOutput1::FindClosestMatchingMode1 と同様に動作しますが、FindClosestMatchingMode はモノラルのディスプレイモードのみを考慮する点が異なります。IDXGIOutput1::FindClosestMatchingMode1 は、pModeToMatch が指す DXGI_MODE_DESC1 構造体の Stereo メンバーを設定した場合はステレオモードのみを考慮し、Stereo が設定されていない場合はモノラルモードのみを考慮します。
IDXGIOutput1::FindClosestMatchingMode1 は、ステレオモードのみ、またはモノラルモードのみで構成される、一致したディスプレイモードのセットを返します。 FindClosestMatchingMode は、入力モードをモノラルとして指定したかのように動作します。
次の垂直帰線(垂直ブランク)が発生するまでスレッドを停止します。
戻り値
Type: HRESULT
以下の DXGI_ERROR のいずれかを返します。
解説(Remarks)
垂直帰線は、次のフレームの描画を開始するためにラスターが右下隅から左上隅に移動するときに発生します。
出力の所有権を取得します。
| pDevice | IUnknown* | in | デバイス(ID3D10Device など)の IUnknown インターフェイスへのポインター。 |
| Exclusive | BOOL | in | 他のスレッドまたはアプリケーションがデバイスの所有権を取得できるようにするには TRUE に設定し、それ以外の場合は FALSE に設定します。 |
戻り値
Type: HRESULT
DXGI_ERROR の値のいずれかを返します。
解説(Remarks)
出力の使用を終えたら、IDXGIOutput::ReleaseOwnership を呼び出します。
TakeOwnership は、結果が予測できないため、アプリケーションから直接呼び出すべきではありません。これは全画面遷移の際に DXGI スワップチェーンオブジェクトによって暗黙的に呼び出されるものであり、スワップチェーンのメソッドの代替として使用すべきではありません。
Windows ストアアプリに関する注意
Windows ストアアプリが TakeOwnership を使用すると、DXGI_ERROR_NOT_CURRENTLY_AVAILABLE で失敗します。出力の所有権を解放します。
解説(Remarks)
スワップチェーンを使用していない場合は、IDXGIOutput::TakeOwnership を呼び出して出力へのアクセスを取得し、使用を終えたら IDXGIOutput::ReleaseOwnership を呼び出して解放します。スワップチェーンを使用するアプリケーションは、通常これらのメソッドのいずれも呼び出しません。
ガンマコントロール機能の記述を取得します。
| pGammaCaps | DXGI_GAMMA_CONTROL_CAPABILITIES* | out | ガンマコントロール機能の記述へのポインター(DXGI_GAMMA_CONTROL_CAPABILITIES を参照)。 |
戻り値
Type: HRESULT
DXGI_ERROR の値のいずれかを返します。
解説(Remarks)
ガンマコントロールを設定します。
| pArray | DXGI_GAMMA_CONTROL* | in | 設定するガンマカーブを記述する DXGI_GAMMA_CONTROL 構造体へのポインター。 |
戻り値
Type: HRESULT
DXGI_ERROR の値のいずれかを返します。
解説(Remarks)
ガンマコントロールの設定を取得します。
| pArray | DXGI_GAMMA_CONTROL* | out | ガンマコントロール設定の配列(DXGI_GAMMA_CONTROL を参照)。 |
戻り値
Type: HRESULT
DXGI_ERROR の値のいずれかを返します。
解説(Remarks)
ディスプレイモードを変更します。
| pScanoutSurface | IDXGISurface* | in | 画像を画面にレンダリングするために使用するサーフェス(IDXGISurface を参照)へのポインター。このサーフェスはバックバッファー(DXGI_USAGE_BACKBUFFER)として作成されている必要があります。 |
戻り値
Type: HRESULT
DXGI_ERROR の値のいずれかを返します。
解説(Remarks)
IDXGIOutput::SetDisplaySurface は、結果が予測できないため、アプリケーションから直接呼び出すべきではありません。これは全画面遷移の際に DXGI スワップチェーンオブジェクトによって暗黙的に呼び出されるものであり、スワップチェーンのメソッドの代替として使用すべきではありません。
このメソッドは、IDXGIOutput::TakeOwnership の呼び出しと IDXGIOutput::ReleaseOwnership の呼び出しの間でのみ呼び出す必要があります。
Windows ストアアプリに関する注意
Windows ストアアプリが SetDisplaySurface を使用すると、DXGI_ERROR_NOT_CURRENTLY_AVAILABLE で失敗します。現在のディスプレイサーフェスのコピーを取得します。
| pDestination | IDXGISurface* | in | コピー先のサーフェス(IDXGISurface を参照)へのポインター。 |
戻り値
Type: HRESULT
DXGI_ERROR の値のいずれかを返します。
解説(Remarks)
IDXGIOutput::GetDisplaySurfaceData は、出力が全画面モードのときにのみ呼び出すことができます。メソッドが成功すると、DXGI はコピー先のサーフェスを埋めます。
コピー先のサーフェス用の領域を割り当てる際は、IDXGIOutput::GetDesc を使用して出力のサイズ(幅と高さ)を判断します。これはターゲットモニターの回転に関係なく当てはまります。グラフィックスコンポーネント(Direct3D 10 など)によって作成されるコピー先のサーフェスは、CPU 書き込み権限(D3D10_CPU_ACCESS_WRITE を参照)付きで作成する必要があります。その他のサーフェスは、CPU 読み書き権限(D3D10_CPU_ACCESS_READ_WRITE を参照)付きで作成する必要があります。このメソッドは、コピー先のサーフェスに合わせてサーフェスデータを変更します(拡大、縮小、フォーマット変換、回転)。拡大と縮小はポイントサンプリングで実行されます。
最近レンダリングされたフレームに関する統計情報を取得します。
| pStats | DXGI_FRAME_STATISTICS* | out | フレーム統計情報(DXGI_FRAME_STATISTICS を参照)へのポインター。 |
戻り値
Type: HRESULT
この関数が成功した場合は S_OK を返します。それ以外の場合は DXGI_ERROR_INVALID_CALL を返すことがあります。
解説(Remarks)
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDXGIOutput "{AE02EEDB-C735-4690-8D52-5A8DC20213AA}" #usecom global IDXGIOutput IID_IDXGIOutput "{}" #comfunc global IDXGIOutput_GetDesc 7 var #comfunc global IDXGIOutput_GetDisplayModeList 8 int,int,var,var #comfunc global IDXGIOutput_FindClosestMatchingMode 9 var,var,sptr #comfunc global IDXGIOutput_WaitForVBlank 10 #comfunc global IDXGIOutput_TakeOwnership 11 sptr,int #comfunc global IDXGIOutput_ReleaseOwnership 12 #comfunc global IDXGIOutput_GetGammaControlCapabilities 13 var #comfunc global IDXGIOutput_SetGammaControl 14 var #comfunc global IDXGIOutput_GetGammaControl 15 var #comfunc global IDXGIOutput_SetDisplaySurface 16 sptr #comfunc global IDXGIOutput_GetDisplaySurfaceData 17 sptr #comfunc global IDXGIOutput_GetFrameStatistics 18 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDXGIOutput "{AE02EEDB-C735-4690-8D52-5A8DC20213AA}" #usecom global IDXGIOutput IID_IDXGIOutput "{}" #comfunc global IDXGIOutput_GetDesc 7 sptr #comfunc global IDXGIOutput_GetDisplayModeList 8 int,int,sptr,sptr #comfunc global IDXGIOutput_FindClosestMatchingMode 9 sptr,sptr,sptr #comfunc global IDXGIOutput_WaitForVBlank 10 #comfunc global IDXGIOutput_TakeOwnership 11 sptr,int #comfunc global IDXGIOutput_ReleaseOwnership 12 #comfunc global IDXGIOutput_GetGammaControlCapabilities 13 sptr #comfunc global IDXGIOutput_SetGammaControl 14 sptr #comfunc global IDXGIOutput_GetGammaControl 15 sptr #comfunc global IDXGIOutput_SetDisplaySurface 16 sptr #comfunc global IDXGIOutput_GetDisplaySurfaceData 17 sptr #comfunc global IDXGIOutput_GetFrameStatistics 18 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。