IDirect3DDeviceManager9
COM公式ドキュメント
2 つのスレッドが同じ Direct3D 9 デバイスを共有できるようにし、デバイスの DirectX Video Acceleration (DXVA) 機能へのアクセスを提供します。
解説(Remarks)
このインターフェイスは Direct3D Device Manager によって公開されます。Direct3D デバイスマネージャーを作成するには、DXVA2CreateDirect3DDeviceManager9 を呼び出します。
Enhanced Video Renderer (EVR) からこのインターフェイスを取得するには、IMFGetService::GetService を呼び出します。サービス GUID は MR_VIDEO_ACCELERATION_SERVICE です。DirectShow EVR フィルターの場合は、フィルターのピンに対して GetService を呼び出します。
Direct3D Device Manager は Direct3D 9 デバイスのみをサポートします。DXGI デバイスはサポートしません。
Windows ストアアプリは IMFDXGIDeviceManager と Direct3D 11 Video API を使用する必要があります。
メソッド 7
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Direct3D デバイスを設定するか、Direct3D デバイスがリセットされたことをデバイスマネージャーに通知します。
| pDevice | IDirect3DDevice9* | in | Direct3D デバイスの IDirect3DDevice9 インターフェイスへのポインター。 |
| resetToken | DWORD | in | DXVA2CreateDirect3DDeviceManager9 関数の pResetToken パラメーターで受け取ったトークン。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効なトークンです。 | |
|
Direct3D デバイスエラーです。 |
解説(Remarks)
Direct3D デバイスマネージャーを最初に作成したときは、Direct3D デバイスへのポインターを指定してこのメソッドを呼び出します。デバイスマネージャーはデバイスを作成しません。呼び出し側が最初にデバイスポインターを提供する必要があります。
Direct3D デバイスが失われ、デバイスをリセットまたは新しいデバイスを作成する必要がある場合にも、このメソッドを呼び出します。これは IDirect3DDevice9::TestCooperativeLevel が D3DERR_DEVICELOST または D3DERR_DEVICENOTRESET を返した場合に発生します。失われたデバイスの詳細については、Direct3D のドキュメントを参照してください。
resetToken パラメーターにより、デバイスマネージャーを最初に作成したコンポーネントのみが現在のデバイスを無効化できることが保証されます。
このメソッドが成功すると、開いているすべてのデバイスハンドルは無効になります。
Direct3D デバイスへのハンドルを取得します。
| phDevice | HANDLE* | out | デバイスハンドルを受け取ります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| Direct3D デバイスマネージャーが初期化されていません。デバイスの所有者は IDirect3DDeviceManager9::ResetDevice を呼び出す必要があります。 |
解説(Remarks)
Direct3D デバイスの IDirect3DDevice9 ポインターを取得するには、phDevice で返されたハンドルを指定して IDirect3DDeviceManager9::LockDevice を呼び出します。デバイスハンドルの使用が終わったら、IDirect3DDeviceManager9::CloseDeviceHandle を呼び出してハンドルを閉じます。
デバイスハンドルがまだ有効かどうかをテストするには、IDirect3DDeviceManager9::TestDevice を呼び出します。
Direct3D デバイスハンドルを閉じます。
| hDevice | HANDLE | in | Direct3D デバイスへのハンドル。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効なハンドルです。 |
Direct3D デバイスハンドルが有効かどうかをテストします。
| hDevice | HANDLE | in | Direct3D デバイスへのハンドル。デバイスハンドルを取得するには、IDirect3DDeviceManager9::OpenDeviceHandle を呼び出します。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| デバイスハンドルは有効です。 | |
| 指定されたハンドルは Direct3D デバイスハンドルではありません。 | |
| デバイスハンドルは無効です。 |
解説(Remarks)
このメソッドが DXVA2_E_NEW_VIDEO_DEVICE を返した場合は、IDirect3DDeviceManager9::CloseDeviceHandle を呼び出してハンドルを閉じ、その後 OpenDeviceHandle を再度呼び出して新しいハンドルを取得します。IDirect3DDeviceManager9::ResetDevice メソッドは、開いているすべてのデバイスハンドルを無効化します。
呼び出し側に Direct3D デバイスへの排他的アクセスを与えます。
| hDevice | HANDLE | in | Direct3D デバイスへのハンドル。デバイスハンドルを取得するには、IDirect3DDeviceManager9::OpenDeviceHandle を呼び出します。 |
| ppDevice | IDirect3DDevice9** | out | デバイスの IDirect3DDevice9 インターフェイスへのポインターを受け取ります。 |
| fBlock | BOOL | in | デバイスロックを待機するかどうかを指定します。デバイスがすでにロックされていて、このパラメーターが TRUE の場合、メソッドはデバイスのロックが解除されるまでブロックします。それ以外の場合、デバイスがロックされていてこのパラメーターが FALSE のときは、メソッドはただちにエラーコード DXVA2_E_VIDEO_DEVICE_LOCKED を返します。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| デバイスハンドルは無効です。 | |
| Direct3D デバイスマネージャーが初期化されていません。デバイスの所有者は IDirect3DDeviceManager9::ResetDevice を呼び出す必要があります。 | |
| デバイスがロックされており、fBlock が FALSE です。 | |
| 指定されたハンドルは Direct3D デバイスハンドルではありません。 |
解説(Remarks)
Direct3D デバイスの使用が終わったら、IDirect3DDeviceManager9::UnlockDevice を呼び出してデバイスのロックを解除します。
このメソッドが DXVA2_E_NEW_VIDEO_DEVICE を返した場合は、IDirect3DDeviceManager9::CloseDeviceHandle を呼び出してハンドルを閉じ、その後 OpenDeviceHandle を再度呼び出して新しいハンドルを取得します。IDirect3DDeviceManager9::ResetDevice メソッドは、開いているすべてのデバイスハンドルを無効化します。
fBlock が TRUE の場合、このメソッドはデッドロックする可能性があります。たとえば、あるスレッドが LockDevice を呼び出し、その後 LockDevice を呼び出す別のスレッドを待機する場合にデッドロックします。また、あるスレッドが間に UnlockDevice を呼び出さずに LockDevice を 2 回呼び出す場合にもデッドロックします。
例
HRESULT LockDevice(
IDirect3DDeviceManager9 *pDeviceManager,
BOOL fBlock,
IDirect3DDevice9 **ppDevice, // Receives a pointer to the device.
HANDLE *pHandle // Receives a device handle.
)
{
*pHandle = NULL;
*ppDevice = NULL;
HANDLE hDevice = 0;
HRESULT hr = pDeviceManager->OpenDeviceHandle(&hDevice);
if (SUCCEEDED(hr))
{
hr = pDeviceManager->LockDevice(hDevice, ppDevice, fBlock);
}
if (hr == DXVA2_E_NEW_VIDEO_DEVICE)
{
// Invalid device handle. Try to open a new device handle.
hr = pDeviceManager->CloseDeviceHandle(hDevice);
if (SUCCEEDED(hr))
{
hr = pDeviceManager->OpenDeviceHandle(&hDevice);
}
// Try to lock the device again.
if (SUCCEEDED(hr))
{
hr = pDeviceManager->LockDevice(hDevice, ppDevice, TRUE);
}
}
if (SUCCEEDED(hr))
{
*pHandle = hDevice;
}
return hr;
}
Direct3D デバイスのロックを解除します。
| hDevice | HANDLE | in | Direct3D デバイスへのハンドル。デバイスハンドルを取得するには、IDirect3DDeviceManager9::OpenDeviceHandle を呼び出します。 |
| fSaveState | BOOL | in | TRUE の場合、メソッドは Direct3D デバイスの状態をステートブロックに保存します。内部的には、メソッドは Direct3D の IDirect3DStateBlock9 インターフェイスを使用してデバイスの状態を保存します。次に同じデバイスハンドルで LockDevice を呼び出したときに、ステートブロックが復元されます。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 指定されたデバイスハンドルがロックされていないか、有効なハンドルではありません。 |
DirectX Video Acceleration (DXVA) サービスインターフェイスを取得します。
| hDevice | HANDLE | in | Direct3D デバイスへのハンドル。デバイスハンドルを取得するには、IDirect3DDeviceManager9::OpenDeviceHandle を呼び出します。 |
| riid | GUID* | in | 要求するインターフェイスのインターフェイス識別子 (IID)。Direct3D デバイスは、次の DXVA サービスインターフェイスをサポートしている場合があります。 |
| ppService | void** | out | 要求したインターフェイスへのポインターを受け取ります。呼び出し側はインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| デバイスハンドルは無効です。 | |
| Direct3D デバイスはビデオアクセラレーションをサポートしていません。 | |
| Direct3D デバイスマネージャーが初期化されていません。デバイスの所有者は IDirect3DDeviceManager9::ResetDevice を呼び出す必要があります。 | |
| 指定されたハンドルは Direct3D デバイスハンドルではありません。 |
解説(Remarks)
このメソッドが DXVA2_E_NEW_VIDEO_DEVICE を返した場合は、IDirect3DDeviceManager9::CloseDeviceHandle を呼び出してハンドルを閉じ、その後 OpenDeviceHandle を再度呼び出して新しいハンドルを取得します。IDirect3DDeviceManager9::ResetDevice メソッドは、開いているすべてのデバイスハンドルを無効化します。
例
HRESULT GetVideoProcessorService(
IDirect3DDeviceManager9 *pDeviceManager,
IDirectXVideoProcessorService **ppVPService
)
{
*ppVPService = NULL;
HANDLE hDevice;
HRESULT hr = pDeviceManager->OpenDeviceHandle(&hDevice);
if (SUCCEEDED(hr))
{
// Get the video processor service
HRESULT hr2 = pDeviceManager->GetVideoService(
hDevice,
IID_PPV_ARGS(ppVPService)
);
// Close the device handle.
hr = pDeviceManager->CloseDeviceHandle(hDevice);
if (FAILED(hr2))
{
hr = hr2;
}
}
if (FAILED(hr))
{
SafeRelease(ppVPService);
}
return hr;
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDirect3DDeviceManager9 "{A0CADE0F-06D5-4CF4-A1C7-F3CDD725AA75}" #usecom global IDirect3DDeviceManager9 IID_IDirect3DDeviceManager9 "{}" #comfunc global IDirect3DDeviceManager9_ResetDevice 3 sptr,int #comfunc global IDirect3DDeviceManager9_OpenDeviceHandle 4 sptr #comfunc global IDirect3DDeviceManager9_CloseDeviceHandle 5 sptr #comfunc global IDirect3DDeviceManager9_TestDevice 6 sptr #comfunc global IDirect3DDeviceManager9_LockDevice 7 sptr,sptr,int #comfunc global IDirect3DDeviceManager9_UnlockDevice 8 sptr,int #comfunc global IDirect3DDeviceManager9_GetVideoService 9 sptr,var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDirect3DDeviceManager9 "{A0CADE0F-06D5-4CF4-A1C7-F3CDD725AA75}" #usecom global IDirect3DDeviceManager9 IID_IDirect3DDeviceManager9 "{}" #comfunc global IDirect3DDeviceManager9_ResetDevice 3 sptr,int #comfunc global IDirect3DDeviceManager9_OpenDeviceHandle 4 sptr #comfunc global IDirect3DDeviceManager9_CloseDeviceHandle 5 sptr #comfunc global IDirect3DDeviceManager9_TestDevice 6 sptr #comfunc global IDirect3DDeviceManager9_LockDevice 7 sptr,sptr,int #comfunc global IDirect3DDeviceManager9_UnlockDevice 8 sptr,int #comfunc global IDirect3DDeviceManager9_GetVideoService 9 sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。