IDXGISurface1
COM公式ドキュメント
IDXGISurface1 インターフェースは、Windows Graphics Device Interface (GDI) を使用して Microsoft DirectX Graphics Infrastructure (DXGI) サーフェスへ描画するためのサポートを追加することで、IDXGISurface を拡張します。
解説(Remarks)
このインターフェースは、Windows Vista および Windows Server 2008 に搭載された DXGI 1.0 ではサポートされません。DXGI 1.1 のサポートが必要であり、これは Windows 7、Windows Server 2008 R2、および Windows Vista with Service Pack 2 (SP2) (KB 971644) と Windows Server 2008 (KB 971512) 向けの更新プログラムとして利用できます。
イメージデータオブジェクトはメモリ上の 2D 領域であり、一般にサーフェスと呼ばれます。出力(アウトプット)からサーフェスを取得するには、IDXGIOutput::GetDisplaySurfaceData を呼び出します。次に、IDXGIOutput::GetDisplaySurfaceData が返す IDXGISurface オブジェクトに対して QueryInterface を呼び出し、IDXGISurface1 インターフェースを取得します。
IDXGISurface をサポートするオブジェクトはすべて IDXGISurface1 もサポートします。
ランタイムは、サーフェスを表す Direct3D リソースオブジェクトを作成する際に、IDXGISurface1 インターフェースを自動的に作成します。たとえば、2D テクスチャを作成するために ID3D11Device::CreateTexture2D または ID3D10Device::CreateTexture2D を呼び出すと、ランタイムは IDXGISurface1 インターフェースを作成します。2D テクスチャサーフェスを表す IDXGISurface1 インターフェースを取得するには、ID3D11Texture2D::QueryInterface または ID3D10Texture2D::QueryInterface を呼び出します。この呼び出しでは、IDXGISurface1 の識別子を渡す必要があります。2D テクスチャが単一の MIP マップレベルのみを持ち、テクスチャの配列で構成されていない場合、QueryInterface は成功し、IDXGISurface1 インターフェースポインターへのポインターを返します。それ以外の場合、QueryInterface は失敗し、IDXGISurface1 へのポインターを返しません。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Windows Graphics Device Interface (GDI) を使用して Microsoft DirectX Graphics Infrastructure (DXGI) サーフェスへ描画できるデバイスコンテキスト (DC) を返します。
| Discard | BOOL | in | GDI DC 内で Direct3D のコンテンツを保持するかどうかを指定するブール値です。TRUE はランタイムに対して GDI DC 内で Direct3D のコンテンツを保持しないよう指示します。つまり、ランタイムは Direct3D のコンテンツを破棄します。FALSE は Direct3D のコンテンツが GDI DC 内で利用可能であることを保証します。 |
| phdc | HDC* | out | GDI 描画のための現在のデバイスコンテキストを表す HDC ハンドルへのポインターです。 |
戻り値
解説(Remarks)
このメソッドは、Windows Vista および Windows Server 2008 に搭載された DXGI 1.0 ではサポートされません。DXGI 1.1 のサポートが必要であり、これは Windows 7、Windows Server 2008 R2、および Windows Vista with Service Pack 2 (SP2) (KB 971644) と Windows Server 2008 (KB 971512) 向けの更新プログラムとして利用できます。
GetDC メソッドで DC を取得した後は、GDI を使用して DXGI サーフェスへ描画できます。GetDC メソッドはサーフェスを GDI 描画用に準備し、DXGI と GDI の各技術間の相互運用を可能にします。
このメソッドを使用する際は、次の点に注意してください。
- サーフェスの場合は D3D11_RESOURCE_MISC_GDI_COMPATIBLE フラグを使用し、スワップチェーンの場合は DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE フラグを使用してサーフェスを作成する必要があります。そうしないと、このメソッドは失敗します。
- 新しい Direct3D コマンドを発行する前に、デバイスを解放し、IDXGISurface1::ReleaseDC メソッドを呼び出す必要があります。
- このメソッドによって作成された未解放の DC が既に存在する場合、このメソッドは失敗します。
- サーフェスまたはスワップチェーンのフォーマットは、DXGI_FORMAT_B8G8R8A8_UNORM_SRGB または DXGI_FORMAT_B8G8R8A8_UNORM である必要があります。
- GetDC の実行時、Direct3D パイプラインの出力マージャーにあるレンダーターゲットはサーフェスからバインド解除されます。GDI 描画の後に Direct3D 描画を行う前に、デバイスに対して ID3D11DeviceContext::OMSetRenderTargets メソッドを呼び出す必要があります。
- バッファーをリサイズする前に、すべての未解放の DC を解放する必要があります。
IDXGISwapChain* g_pSwapChain = NULL;
IDXGISurface1* g_pSurface1 = NULL;
...
//デバイスとスワップチェーンをセットアップする
g_pSwapChain->GetBuffer(0, __uuidof(IDXGISurface1), (void**) &g_pSurface1);
g_pSurface1->GetDC( FALSE, &g_hDC );
...
//GDI を使用して DC に描画する
...
//描画が終わったら DC を解放する
g_pSurface1->ReleaseDC( NULL );
現在のサーフェスに関連付けられた GDI デバイスコンテキスト (DC) を解放し、Direct3D を使用して描画できるようにします。
| pDirtyRect | RECT* | inoptional | サーフェスのダーティ領域を示す RECT 構造体へのポインターです。ダーティ領域とは、GDI 描画に使用し、保持しておきたいサーフェスの部分を指します。この領域は、特定のシナリオにおいてグラフィックスサブシステムへのパフォーマンスヒントとして使用されます。このパラメーターを、描画を指定した矩形領域に制限する目的で使用しないでください。NULL を渡した場合、ReleaseDC はサーフェス全体をダーティとみなします。それ以外の場合、ReleaseDC は RECT で指定された領域を、GDI 描画によって操作された領域を示すパフォーマンスヒントとして使用します。 コンテンツを一切変更していない場合は、空の RECT 構造体(位置も面積も持たない矩形)へのポインターを渡すことができます。 |
戻り値
解説(Remarks)
このメソッドは、Windows Vista および Windows Server 2008 に搭載された DXGI 1.0 ではサポートされません。DXGI 1.1 のサポートが必要であり、これは Windows 7、Windows Server 2008 R2、および Windows Vista with Service Pack 2 (SP2) (KB 971644) と Windows Server 2008 (KB 971512) 向けの更新プログラムとして利用できます。
ReleaseDC メソッドを使用して DC を解放し、アプリケーションがこのサーフェスへのすべての GDI 描画を完了したことを示します。追加の描画を行うために Direct3D を使用する前に、ReleaseDC メソッドを呼び出す必要があります。
バッファーをリサイズする前に、すべての未解放の DC を解放する必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDXGISurface1 "{4AE63092-6327-4C1B-80AE-BFE12EA32B86}" #usecom global IDXGISurface1 IID_IDXGISurface1 "{}" #comfunc global IDXGISurface1_GetDC 11 int,sptr #comfunc global IDXGISurface1_ReleaseDC 12 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDXGISurface1 "{4AE63092-6327-4C1B-80AE-BFE12EA32B86}" #usecom global IDXGISurface1 IID_IDXGISurface1 "{}" #comfunc global IDXGISurface1_GetDC 11 int,sptr #comfunc global IDXGISurface1_ReleaseDC 12 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。