ID3D11Device4
COM公式ドキュメント
デバイスインターフェイスは仮想アダプターを表し、リソースの作成に使用します。ID3D11Device4 は、RegisterDeviceRemovedEvent や UnregisterDeviceRemoved など、ID3D11Device3 のメソッドに加えて新しいメソッドを追加します。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
「デバイスが削除された」イベントを登録し、非同期通知メカニズムを使用して、何らかの理由で Direct3D デバイスが削除された状態になったことを通知します。
| hEvent | HANDLE | in | 「デバイスが削除された」イベントのハンドルです。 |
| pdwCookie | DWORD* | out | 「デバイスが削除された」イベントに関する情報へのポインターです。この情報は、イベントの登録を解除するために UnregisterDeviceRemoved で使用できます。 |
戻り値
型: HRESULT
Direct3D 11 のリターンコードを参照してください。
解説(Remarks)
何らかの理由で Direct3D デバイスが削除された状態になったことを、Present からの HRESULT としてではなく、非同期通知メカニズムを使用して通知します。デバイスが削除された理由は、通知を受け取った後に ID3D11Device::GetDeviceRemovedReason を使用して取得できます。
アプリケーションは、Win32 イベントハンドルを特定のデバイスに対して登録および登録解除します。 デバイスが削除された状態になると、そのイベントハンドルがシグナル状態になります。 デバイスの ID3D11Device::GetDeviceRemovedReason メソッドをポーリングすることで、デバイスが削除されたことを確認できます。
UWP アプリでは、ISignalableNotifier または SetThreadpoolWait を使用できます。
グラフィックスデバイスが失われると、アプリまたはタイトルはグラフィックスイベントを受け取ります。これにより、アプリまたはタイトルは自身のグラフィックスデバイスがすでに有効でないことを把握でき、DirectX デバイスを安全に再作成できます。 このイベントに応答して、アプリまたはタイトルはレンダリングデバイスを再作成し、 それをコンポジショングラフィックスデバイスオブジェクトの SetRenderingDevice 呼び出しに渡す必要があります。
この新しいレンダリングデバイスを設定した後、アプリまたはタイトルは、コンポジショングラフィックスデバイスの OnRenderingDeviceReplaced イベントが発生した後に、既存のすべてのサーフェスの内容を再描画する必要があります。
このメソッドは、デバイス消失に対する Composition をサポートします。
このイベントは、再作成に最も適したタイミングでシグナル状態になるわけではありません。 そのため、代わりにアダプターの序数を順に列挙し、最初に成功する序数で作成することをお勧めします。
アプリケーションは、デバイスにイベントを登録できます。 デバイスが削除された状態になると、アプリケーションに通知されます。
デバイスがすでに削除されている場合、RegisterDeviceRemovedEvent の呼び出しによってイベントは直ちにシグナル状態になります。 RegisterDeviceRemovedEvent からデバイス削除のエラーコードが返されることはありません。
個々の「デバイスが削除された」イベントは、シグナル状態にならないか、1 回だけシグナル状態になります。 これらのイベントは、デバイスの破棄中にはシグナル状態になりません。 これらのイベントは、破棄時に登録解除されます。
RegisterDeviceRemovedEvent のセマンティクスは、 IDXGIFactory2::RegisterOcclusionStatusEvent と同様です。
「デバイスが削除された」イベントの登録を解除します。
| dwCookie | DWORD | in | 「デバイスが削除された」イベントに関する情報です。 RegisterDeviceRemovedEvent の呼び出しが成功したときに取得されます。 |
解説(Remarks)
RegisterDeviceRemovedEvent を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID3D11Device4 "{8992AB71-02E6-4B8D-BA48-B056DCDA42C4}" #usecom global ID3D11Device4 IID_ID3D11Device4 "{}" #comfunc global ID3D11Device4_RegisterDeviceRemovedEvent 65 sptr,var #comfunc global ID3D11Device4_UnregisterDeviceRemoved 66 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ID3D11Device4 "{8992AB71-02E6-4B8D-BA48-B056DCDA42C4}" #usecom global ID3D11Device4 IID_ID3D11Device4 "{}" #comfunc global ID3D11Device4_RegisterDeviceRemovedEvent 65 sptr,sptr #comfunc global ID3D11Device4_UnregisterDeviceRemoved 66 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。