IMFDXGIDeviceManager
COM公式ドキュメント
2つのスレッドが同じ Microsoft Direct3D 11 デバイスを共有できるようにします。
解説(Remarks)
このインターフェイスは Microsoft DirectX Graphics Infrastructure (DXGI) Device Manager によって公開されます。DXGI Device Manager を作成するには、MFCreateDXGIDeviceManager 関数を呼び出します。
MFCreateDXGIDeviceManager で IMFDXGIDeviceManager を作成した時点では、Direct3D 11 デバイスはデバイスマネージャーに関連付けられていません。Direct3D 11 デバイスをデバイスマネージャーに関連付けるには、IMFDXGIDeviceManager::ResetDevice を呼び出し、Direct3D 11 デバイスへのポインターを渡します。Direct3D 11 デバイスを作成するには、D3D11CreateDevice を呼び出します。デバイスは、D3D11_CREATE_DEVICE_FLAG 列挙体で定義されている D3D11_CREATE_DEVICE_VIDEO_SUPPORT デバイス作成フラグを指定して作成する必要があります。
Microsoft Direct3D 9 デバイスの場合は、IDirect3DDeviceManager9 インターフェイスを使用します。
Windows ストアアプリでは、IMFDXGIDeviceManager と Direct3D 11 Video API を使用する必要があります。
メソッド 7
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Microsoft Direct3D デバイスハンドルを閉じます。
| hDevice | HANDLE | in | Direct3D デバイスへのハンドル。 |
戻り値
解説(Remarks)
IMFDXGIDeviceManager::OpenDeviceHandle メソッドで取得したデバイスハンドルを解放するには、このメソッドを呼び出します。
Microsoft Direct3D デバイスにインターフェイスを問い合わせます。
| hDevice | HANDLE | in | Direct3D デバイスへのハンドル。デバイスハンドルを取得するには、IMFDXGIDeviceManager::OpenDeviceHandle を呼び出します。 |
| riid | GUID* | in | 要求するインターフェイスのインターフェイス識別子 (IID)。Direct3D デバイスは次のインターフェイスをサポートします。
|
| ppService | void** | out | 要求されたインターフェイスへのポインターを受け取ります。呼び出し元はインターフェイスを解放する必要があります。 |
戻り値
このメソッドは、次のいずれかの値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| 指定されたハンドルは Direct3D デバイスハンドルではありません。 | |
| DXGI Device Manager が初期化されていません。デバイスの所有者が IMFDXGIDeviceManager::ResetDevice を呼び出す必要があります。 | |
| デバイスハンドルが無効です。 | |
| ID3D11VideoDevice が指定されており、作成された D3D デバイスがリファレンスラスタライザーまたは WARP を使用している場合。または、ハードウェアデバイスであり、Microsoft Basic Display Adapter を使用している場合。 |
解説(Remarks)
このメソッドが MF_E_DXGI_NEW_VIDEO_DEVICE を返した場合は、IMFDXGIDeviceManager::CloseDeviceHandle を呼び出してハンドルを閉じ、その後 OpenDeviceHandle を再度呼び出して新しいハンドルを取得します。IMFDXGIDeviceManager::ResetDevice メソッドは、開いているすべてのデバイスハンドルを無効化します。
詳細については、Supporting Direct3D 11 Video Decoding in Media Foundation を参照してください。
呼び出し元に Microsoft Direct3D デバイスへの排他アクセスを与えます。
| hDevice | HANDLE | in | Direct3D デバイスへのハンドル。デバイスハンドルを取得するには、IMFDXGIDeviceManager::OpenDeviceHandle を呼び出します。 |
| riid | GUID* | in | 要求するインターフェイスのインターフェイス識別子 (IID)。Direct3D デバイスは次のインターフェイスをサポートします。 |
| ppUnkDevice | void** | out | 要求されたインターフェイスへのポインターを受け取ります。呼び出し元はインターフェイスを解放する必要があります。 |
| fBlock | BOOL | in | デバイスロックを待機するかどうかを指定します。デバイスがすでにロックされていて、このパラメーターが TRUE の場合、メソッドはデバイスのロックが解除されるまでブロックします。それ以外の場合、デバイスがロックされていて、このパラメーターが FALSE の場合、メソッドはエラーコード DXVA2_E_VIDEO_DEVICE_LOCKED を返して直ちに戻ります。 |
戻り値
このメソッドは、次のいずれかの値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| 指定されたハンドルは Direct3D デバイスハンドルではありません。 | |
| DXGI Device Manager が初期化されていません。デバイスの所有者が IMFDXGIDeviceManager::ResetDevice を呼び出す必要があります。 | |
| デバイスハンドルが無効です。 | |
| デバイスがロックされており、fBlock が FALSE です。 |
解説(Remarks)
Direct3D デバイスの使用が終わったら、IMFDXGIDeviceManager::UnlockDevice を呼び出してデバイスのロックを解除します。
このメソッドが MF_E_DXGI_NEW_VIDEO_DEVICE を返した場合は、IMFDXGIDeviceManager::CloseDeviceHandle を呼び出してハンドルを閉じ、その後 OpenDeviceHandle を再度呼び出して新しいハンドルを取得します。IMFDXGIDeviceManager::ResetDevice メソッドは、開いているすべてのデバイスハンドルを無効化します。
fBlock が TRUE の場合、このメソッドはデッドロックする可能性があります。たとえば、あるスレッドが LockDevice を呼び出した後、LockDevice を呼び出す別のスレッドを待機する場合、デッドロックします。また、あるスレッドが UnlockDevice を間に呼び出さずに LockDevice を2回呼び出した場合もデッドロックします。
Microsoft Direct3D デバイスへのハンドルを取得します。
| phDevice | HANDLE* | out | デバイスハンドルを受け取ります。 |
戻り値
このメソッドは、次のいずれかの値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| DXGI Device Manager が初期化されていません。デバイスの所有者が IMFDXGIDeviceManager::ResetDevice を呼び出す必要があります。 |
Microsoft Direct3D デバイスを設定するか、Direct3D デバイスがリセットされたことをデバイスマネージャーに通知します。
| pUnkDevice | IUnknown* | in | DXGI デバイスの IUnknown インターフェイスへのポインター。 |
| resetToken | DWORD | in | MFCreateDXGIDeviceManager 関数の pResetToken パラメーターで受け取ったトークン。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
DXGI Device Manager を最初に作成したときは、Direct3D デバイスへのポインターを指定してこのメソッドを呼び出します。(デバイスマネージャーはデバイスを作成しません。呼び出し元が最初にデバイスポインターを提供する必要があります。) また、Direct3D デバイスがロストし、デバイスをリセットするか新しいデバイスを作成する必要がある場合にも、このメソッドを呼び出します。
resetToken パラメーターは、デバイスマネージャーを最初に作成したコンポーネントだけが現在のデバイスを無効化できるようにします。
このメソッドが成功すると、開いているすべてのデバイスハンドルが無効になります。
Microsoft Direct3D 11 デバイスを作成するには、D3D11CreateDevice を呼び出します。
デバイスは、D3D11_CREATE_DEVICE_FLAG 列挙体で定義されている D3D11_CREATE_DEVICE_VIDEO_SUPPORT デバイス作成フラグを指定して作成する必要があります。
ID3D11VideoContext::GetDecoderBuffer または ID3D11VideoContext::ReleaseDecoderBuffer を呼び出すときにまれに発生するデッドロックの問題を防ぐため、デバイスコンテキストにマルチスレッド保護を使用することが推奨されます。マルチスレッド保護を設定するには、まず ID3D11Device に対して QueryInterface を呼び出して ID3D10Multithread ポインターを取得します。次に、bMTProtect に true を渡して ID3D10Multithread::SetMultithreadProtected を呼び出します。
Microsoft Direct3D デバイスハンドルが有効かどうかをテストします。
| hDevice | HANDLE | in | Direct3D デバイスへのハンドル。デバイスハンドルを取得するには、IMFDXGIDeviceManager::OpenDeviceHandle を呼び出します。 |
戻り値
このメソッドは、次のいずれかの値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| 指定されたハンドルは Direct3D デバイスハンドルではありません。 | |
| デバイスハンドルが無効です。 |
解説(Remarks)
このメソッドが MF_E_DXGI_NEW_VIDEO_DEVICE を返した場合は、IMFDXGIDeviceManager::CloseDeviceHandle を呼び出してハンドルを閉じ、その後 OpenDeviceHandle を再度呼び出して新しいハンドルを取得します。IMFDXGIDeviceManager::ResetDevice メソッドは、開いているすべてのデバイスハンドルを無効化します。
Microsoft Direct3D デバイスのロックを解除します。
| hDevice | HANDLE | in | Direct3D デバイスへのハンドル。デバイスハンドルを取得するには、IMFDXGIDeviceManager::OpenDeviceHandle を呼び出します。 |
| fSaveState | BOOL | in | 予約済みです。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
IMFDXGIDeviceManager::LockDevice を呼び出した後にデバイスを解放するには、このメソッドを呼び出します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFDXGIDeviceManager "{EB533D5D-2DB6-40F8-97A9-494692014F07}" #usecom global IMFDXGIDeviceManager IID_IMFDXGIDeviceManager "{}" #comfunc global IMFDXGIDeviceManager_CloseDeviceHandle 3 sptr #comfunc global IMFDXGIDeviceManager_GetVideoService 4 sptr,var,sptr #comfunc global IMFDXGIDeviceManager_LockDevice 5 sptr,var,sptr,int #comfunc global IMFDXGIDeviceManager_OpenDeviceHandle 6 sptr #comfunc global IMFDXGIDeviceManager_ResetDevice 7 sptr,int #comfunc global IMFDXGIDeviceManager_TestDevice 8 sptr #comfunc global IMFDXGIDeviceManager_UnlockDevice 9 sptr,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMFDXGIDeviceManager "{EB533D5D-2DB6-40F8-97A9-494692014F07}" #usecom global IMFDXGIDeviceManager IID_IMFDXGIDeviceManager "{}" #comfunc global IMFDXGIDeviceManager_CloseDeviceHandle 3 sptr #comfunc global IMFDXGIDeviceManager_GetVideoService 4 sptr,sptr,sptr #comfunc global IMFDXGIDeviceManager_LockDevice 5 sptr,sptr,sptr,int #comfunc global IMFDXGIDeviceManager_OpenDeviceHandle 6 sptr #comfunc global IMFDXGIDeviceManager_ResetDevice 7 sptr,int #comfunc global IMFDXGIDeviceManager_TestDevice 8 sptr #comfunc global IMFDXGIDeviceManager_UnlockDevice 9 sptr,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。