Win32 API 日本語リファレンス
ホームMedia.MediaFoundation › IMFDXGIDeviceManager

IMFDXGIDeviceManager

COM
IIDeb533d5d-2db6-40f8-97a9-494692014f07継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

2つのスレッドが同じ Microsoft Direct3D 11 デバイスを共有できるようにします。

解説(Remarks)

このインターフェイスは Microsoft DirectX Graphics Infrastructure (DXGI) Device Manager によって公開されます。DXGI Device Manager を作成するには、MFCreateDXGIDeviceManager 関数を呼び出します。

MFCreateDXGIDeviceManagerIMFDXGIDeviceManager を作成した時点では、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 ストアアプリでは、IMFDXGIDeviceManagerDirect3D 11 Video API を使用する必要があります。

メソッド 7

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT CloseDeviceHandle(HANDLE hDevice)

Microsoft Direct3D デバイスハンドルを閉じます。

hDeviceHANDLEinDirect3D デバイスへのハンドル。

戻り値

このメソッドは、次のいずれかの値を返すことがあります。

戻り値 説明
S_OK
成功しました。
E_HANDLE
指定されたハンドルは Direct3D デバイスハンドルではありません。

解説(Remarks)

IMFDXGIDeviceManager::OpenDeviceHandle メソッドで取得したデバイスハンドルを解放するには、このメソッドを呼び出します。

vtbl 4 HRESULT GetVideoService(HANDLE hDevice, GUID* riid, void** ppService)

Microsoft Direct3D デバイスにインターフェイスを問い合わせます。

hDeviceHANDLEinDirect3D デバイスへのハンドル。デバイスハンドルを取得するには、IMFDXGIDeviceManager::OpenDeviceHandle を呼び出します。
riidGUID*in

要求するインターフェイスのインターフェイス識別子 (IID)。Direct3D デバイスは次のインターフェイスをサポートします。

  • ID3D11Device。Direct3D11 デバイスへのポインターを取得するには、riidIID_ID3D11Device を使用します。
  • ID3D11VideoDevice。Direct3D11 ビデオデバイスへのポインターを取得するには、riidIID_ID3D11VideoDevice を使用します。
ppServicevoid**out要求されたインターフェイスへのポインターを受け取ります。呼び出し元はインターフェイスを解放する必要があります。

戻り値

このメソッドは、次のいずれかの値を返すことがあります。

戻り値 説明
S_OK
成功しました。
E_HANDLE
指定されたハンドルは Direct3D デバイスハンドルではありません。
MF_E_DXGI_DEVICE_NOT_INITIALIZED
DXGI Device Manager が初期化されていません。デバイスの所有者が IMFDXGIDeviceManager::ResetDevice を呼び出す必要があります。
MF_E_DXGI_NEW_VIDEO_DEVICE
デバイスハンドルが無効です。
E_NOINTERFACE
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 を参照してください。

vtbl 5 HRESULT LockDevice(HANDLE hDevice, GUID* riid, void** ppUnkDevice, BOOL fBlock)

呼び出し元に Microsoft Direct3D デバイスへの排他アクセスを与えます。

hDeviceHANDLEinDirect3D デバイスへのハンドル。デバイスハンドルを取得するには、IMFDXGIDeviceManager::OpenDeviceHandle を呼び出します。
riidGUID*in

要求するインターフェイスのインターフェイス識別子 (IID)。Direct3D デバイスは次のインターフェイスをサポートします。

ppUnkDevicevoid**out要求されたインターフェイスへのポインターを受け取ります。呼び出し元はインターフェイスを解放する必要があります。
fBlockBOOLinデバイスロックを待機するかどうかを指定します。デバイスがすでにロックされていて、このパラメーターが TRUE の場合、メソッドはデバイスのロックが解除されるまでブロックします。それ以外の場合、デバイスがロックされていて、このパラメーターが FALSE の場合、メソッドはエラーコード DXVA2_E_VIDEO_DEVICE_LOCKED を返して直ちに戻ります。

戻り値

このメソッドは、次のいずれかの値を返すことがあります。

戻り値 説明
S_OK
成功しました。
E_HANDLE
指定されたハンドルは Direct3D デバイスハンドルではありません。
MF_E_DXGI_DEVICE_NOT_INITIALIZED
DXGI Device Manager が初期化されていません。デバイスの所有者が IMFDXGIDeviceManager::ResetDevice を呼び出す必要があります。
MF_E_DXGI_NEW_VIDEO_DEVICE
デバイスハンドルが無効です。
MF_E_DXGI_VIDEO_DEVICE_LOCKED
デバイスがロックされており、fBlockFALSE です。

解説(Remarks)

Direct3D デバイスの使用が終わったら、IMFDXGIDeviceManager::UnlockDevice を呼び出してデバイスのロックを解除します。

このメソッドが MF_E_DXGI_NEW_VIDEO_DEVICE を返した場合は、IMFDXGIDeviceManager::CloseDeviceHandle を呼び出してハンドルを閉じ、その後 OpenDeviceHandle を再度呼び出して新しいハンドルを取得します。IMFDXGIDeviceManager::ResetDevice メソッドは、開いているすべてのデバイスハンドルを無効化します。

fBlockTRUE の場合、このメソッドはデッドロックする可能性があります。たとえば、あるスレッドが LockDevice を呼び出した後、LockDevice を呼び出す別のスレッドを待機する場合、デッドロックします。また、あるスレッドが UnlockDevice を間に呼び出さずに LockDevice を2回呼び出した場合もデッドロックします。

vtbl 6 HRESULT OpenDeviceHandle(HANDLE* phDevice)

Microsoft Direct3D デバイスへのハンドルを取得します。

phDeviceHANDLE*outデバイスハンドルを受け取ります。

戻り値

このメソッドは、次のいずれかの値を返すことがあります。

戻り値 説明
S_OK
成功しました。
MF_E_DXGI_DEVICE_NOT_INITIALIZED
DXGI Device Manager が初期化されていません。デバイスの所有者が IMFDXGIDeviceManager::ResetDevice を呼び出す必要があります。
vtbl 7 HRESULT ResetDevice(IUnknown* pUnkDevice, DWORD resetToken)

Microsoft Direct3D デバイスを設定するか、Direct3D デバイスがリセットされたことをデバイスマネージャーに通知します。

pUnkDeviceIUnknown*inDXGI デバイスの IUnknown インターフェイスへのポインター。
resetTokenDWORDinMFCreateDXGIDeviceManager 関数の 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 ポインターを取得します。次に、bMTProtecttrue を渡して ID3D10Multithread::SetMultithreadProtected を呼び出します。

vtbl 8 HRESULT TestDevice(HANDLE hDevice)

Microsoft Direct3D デバイスハンドルが有効かどうかをテストします。

hDeviceHANDLEinDirect3D デバイスへのハンドル。デバイスハンドルを取得するには、IMFDXGIDeviceManager::OpenDeviceHandle を呼び出します。

戻り値

このメソッドは、次のいずれかの値を返すことがあります。

戻り値 説明
S_OK
成功しました。
E_HANDLE
指定されたハンドルは Direct3D デバイスハンドルではありません。
MF_E_DXGI_NEW_VIDEO_DEVICE
デバイスハンドルが無効です。

解説(Remarks)

このメソッドが MF_E_DXGI_NEW_VIDEO_DEVICE を返した場合は、IMFDXGIDeviceManager::CloseDeviceHandle を呼び出してハンドルを閉じ、その後 OpenDeviceHandle を再度呼び出して新しいハンドルを取得します。IMFDXGIDeviceManager::ResetDevice メソッドは、開いているすべてのデバイスハンドルを無効化します。

vtbl 9 HRESULT UnlockDevice(HANDLE hDevice, BOOL fSaveState)

Microsoft Direct3D デバイスのロックを解除します。

hDeviceHANDLEinDirect3D デバイスへのハンドル。デバイスハンドルを取得するには、IMFDXGIDeviceManager::OpenDeviceHandle を呼び出します。
fSaveStateBOOLin予約済みです。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

IMFDXGIDeviceManager::LockDevice を呼び出した後にデバイスを解放するには、このメソッドを呼び出します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。