IDXGIDevice2
COM公式ドキュメント
IDXGIDevice2 インターフェイスは、画像データを生成する DXGI オブジェクト向けの派生クラスを実装します。このインターフェイスは、GPU の処理が完了するまで CPU の処理をブロックするメソッドや、リソースをオペレーティングシステムに提供(オファー)するメソッドを公開します。
解説(Remarks)
IDXGIDevice2 インターフェイスは、他の DXGI オブジェクトにアクセスする必要がある DXGI オブジェクトが使用することを想定して設計されています。このインターフェイスは、DXGI と通信するために Direct3D を使用しないアプリケーションにとって有用です。
Direct3D のデバイス作成関数は Direct3D デバイスオブジェクトを返します。この Direct3D デバイスオブジェクトは IUnknown インターフェイスを実装しています。この Direct3D デバイスオブジェクトに対してクエリを行い、デバイスに対応する IDXGIDevice2 インターフェイスを取得できます。Direct3D デバイスの IDXGIDevice2 インターフェイスを取得するには、次のコードを使用します。
IDXGIDevice2 * pDXGIDevice;
hr = g_pd3dDevice->QueryInterface(__uuidof(IDXGIDevice2), (void **)&pDXGIDevice);
Windows Phone 8: この API はサポートされています。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
リソースの内容を破棄することで、オペレーティングシステムがそのビデオメモリを解放できるようにします。(IDXGIDevice2.OfferResources)
| NumResources | DWORD | in | ppResources 引数の配列に含まれるリソースの数。 |
| ppResources | IDXGIResource** | in | 提供(オファー)するリソースの IDXGIResource インターフェイスへのポインターの配列。 |
| Priority | DXGI_OFFER_RESOURCE_PRIORITY | in | データの価値の高さを示す DXGI_OFFER_RESOURCE_PRIORITY 型の値。 |
戻り値
OfferResources は次の値を返します。
- リソースの提供(オファー)に成功した場合は S_OK
- 配列内のリソースまたは優先度が無効な場合は E_INVALIDARG
解説(Remarks)
Priority パラメーターで指定する優先度の値は、呼び出し元がその内容をどれだけ価値のあるものとみなしているかを表します。オペレーティングシステムはこの優先度の値を使用して、優先度の順にリソースを破棄します。オペレーティングシステムは、より高い優先度で提供(オファー)されたリソースを破棄する前に、低い優先度で提供されたリソースを破棄します。
リソースがパイプラインにバインドされている状態で OfferResources を呼び出してそのリソースを提供(オファー)すると、そのリソースのバインドは解除されます。マップされているリソースに対して OfferResources を呼び出すことはできません。リソースを提供した後は、IDXGIDevice2::ReclaimResource メソッドを呼び出してリソースを回収(リクレイム)するまで、そのリソースをマップしたりパイプラインにバインドしたりすることはできません。イミュータブル(変更不可)なリソースを提供するために OfferResources を呼び出すことはできません。
共有リソースを提供(オファー)するには、共有しているデバイスのうち 1 つでのみ OfferResources を呼び出します。リソースへの排他的アクセスを確保するには、IDXGIKeyedMutex オブジェクトを使用し、そのミューテックスを保持している間にのみ OfferResources を呼び出す必要があります。実際、IDXGIKeyedMutex を使用しない共有リソースの提供はサポートされていないため、IDXGIKeyedMutex を使用しない限り共有リソースを提供することはできません。
IDXGIDevice2::OfferResources を呼び出して以前に提供(オファー)したリソースへのアクセスを復元します。
| NumResources | DWORD | in | ppResources 引数および pDiscarded 引数の配列に含まれるリソースの数。 |
| ppResources | IDXGIResource** | in | 回収(リクレイム)するリソースの IDXGIResource インターフェイスへのポインターの配列。 |
| pDiscarded | BOOL* | outoptional | ブール値を受け取る配列へのポインター。配列内の各値は、ppResources パラメーターで指定された同じインデックスのリソースに対応します。ランタイムは、対応するリソースの内容が破棄されて現在は未定義である場合は各ブール値を TRUE に設定し、対応するリソースの以前の内容がそのまま残っている場合は FALSE に設定します。古い内容が破棄されたかどうかにかかわらず新しい内容でリソースを埋めるつもりであれば、呼び出し元は NULL を渡すことができます。 |
戻り値
ReclaimResources は次の値を返します。
- リソースの回収(リクレイム)に成功した場合は S_OK
- リソースが無効な場合は E_INVALIDARG
解説(Remarks)
IDXGIDevice2::OfferResources を呼び出して 1 つ以上のリソースを提供(オファー)した後、それらのリソースを再び使用するには、その前に ReclaimResources を呼び出す必要があります。各リソースの内容が破棄されたかどうかを判断するには、pDiscarded の配列内の値を確認する必要があります。リソースが提供されている間にその内容が破棄された場合、現在の内容は未定義です。したがって、そのリソースを使用する前にリソースの内容を上書きする必要があります。
共有リソースを回収(リクレイム)するには、共有しているデバイスのうち 1 つでのみ ReclaimResources を呼び出します。リソースへの排他的アクセスを確保するには、IDXGIKeyedMutex オブジェクトを使用し、そのミューテックスを保持している間にのみ ReclaimResources を呼び出す必要があります。
Windows 7 用プラットフォーム更新プログラム: ランタイムは、非共有リソースに対して ReclaimResources が正しく使用されているかを検証しますが、意図された機能は実行しません。Windows 7 用プラットフォーム更新プログラムの詳細については、Platform Update for Windows 7 を参照してください。
未処理のレンダリングコマンドをすべてフラッシュし、以前に送信されたすべてのレンダリングコマンドが完了した後に、指定されたイベントオブジェクトをシグナル状態に設定します。
| hEvent | HANDLE | in | イベントオブジェクトへのハンドル。このハンドルは CreateEvent 関数または OpenEvent 関数が返します。すべての種類のイベントオブジェクト(手動リセット、自動リセットなど)がサポートされています。 このハンドルには EVENT_MODIFY_STATE アクセス権が必要です。アクセス権の詳細については、Synchronization Object Security and Access Rights を参照してください。 |
戻り値
成功した場合は S_OK を返します。それ以外の場合は、次のいずれかの値を返します。
- 操作を完了するのに十分なメモリがない場合は E_OUTOFMEMORY。
- パラメーターが検証され、正しくないと判断された場合は E_INVALIDARG。
解説(Remarks)
EnqueueSetEvent は、以前に送信されたすべてのレンダリングコマンドが完了した後、またはデバイスが削除された後に、イベントオブジェクトに対して SetEvent 関数を呼び出します。
アプリケーションは EnqueueSetEvent を呼び出した後、直ちに WaitForSingleObject 関数を呼び出し、レンダリングコマンドが完了するまで自身をスリープ状態にすることができます。
表示(プレゼント)(IDXGISwapChain::Present)に関連する処理の完了を判断するために EnqueueSetEvent を使用することはできません。代わりに、IDXGISwapChain::GetFrameStatistics を使用することをお勧めします。
例
次のサンプルコードは、EnqueueSetEvent の使用方法を示しています。
void BlockingFinish( IDXGIDevice2* pDevice )
{
// Create a manual-reset event object.
hEvent = CreateEvent(
NULL, // default security attributes
TRUE, // manual-reset event
FALSE, // initial state is nonsignaled
FALSE
);
if (hEvent == NULL)
{
printf("CreateEvent failed (%d)\n", GetLastError());
return;
}
pDevice->EnqueueSetEvent(hEvent);
DWORD dwWaitResult = WaitForSingleObject(
hEvent, // event handle
INFINITE); // indefinite wait
switch (dwWaitResult)
{
// Event object was signaled
case WAIT_OBJECT_0:
// Commands completed
break;
// An error occurred
default:
printf("Wait error (%d)\n", GetLastError());
return 0;
}
CloseHandle(hEvent);
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDXGIDevice2 "{05008617-FBFD-4051-A790-144884B4F6A9}" #usecom global IDXGIDevice2 IID_IDXGIDevice2 "{}" #comfunc global IDXGIDevice2_OfferResources 14 int,sptr,int #comfunc global IDXGIDevice2_ReclaimResources 15 int,sptr,var #comfunc global IDXGIDevice2_EnqueueSetEvent 16 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDXGIDevice2 "{05008617-FBFD-4051-A790-144884B4F6A9}" #usecom global IDXGIDevice2 IID_IDXGIDevice2 "{}" #comfunc global IDXGIDevice2_OfferResources 14 int,sptr,int #comfunc global IDXGIDevice2_ReclaimResources 15 int,sptr,sptr #comfunc global IDXGIDevice2_EnqueueSetEvent 16 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。