Direct3D Cihaz Yöneticisi
Microsoft Direct3D cihaz yöneticisi, iki veya daha fazla nesnenin aynı Microsoft Direct3D 9 cihazını paylaşmasını sağlar. Bir nesne Direct3D 9 cihazının sahibi gibi davranır. Cihazı paylaşmak için, cihazın sahibi Direct3D cihaz yöneticisini oluşturur. Diğer nesneler, cihaz sahibinden cihaz yöneticisine bir işaretçi alabilir ve ardından Direct3D cihazına bir işaretçi almak için cihaz yöneticisini kullanabilir. Cihazı kullanan herhangi bir nesne, diğer nesnelerin cihazı aynı anda kullanmasını engelleyen özel bir kilit tutar.
Not
Direct3D Cihaz Yöneticisi yalnızca Direct3D 9 cihazlarını destekler. DXGI cihazlarını desteklemez.
Direct3D cihaz yöneticisini oluşturmak için DXVA2CreateDirect3DDeviceManager9çağrısı yapın. Bu işlev, cihaz yöneticisinin IDirect3DDeviceManager9 arabirimine bir işaretçi ve sıfırlama belirteci döndürür. Sıfırlama belirteci, Direct3D cihazının sahibinin cihazı cihaz yöneticisinde ayarlamasını (ve sıfırlamasını) sağlar. Cihaz yöneticisini başlatmak için IDirect3DDeviceManager9::ResetDeviceçağrısı yapın. Sıfırlama belirteciyle birlikte Direct3D cihazına bir işaretçi geçirin.
Aşağıdaki kod, cihaz yöneticisinin nasıl oluşturulacağını ve başlatacağını gösterir.
HRESULT CreateD3DDeviceManager(
IDirect3DDevice9 *pDevice,
UINT *pReset,
IDirect3DDeviceManager9 **ppManager
)
{
UINT resetToken = 0;
IDirect3DDeviceManager9 *pD3DManager = NULL;
HRESULT hr = DXVA2CreateDirect3DDeviceManager9(&resetToken, &pD3DManager);
if (FAILED(hr))
{
goto done;
}
hr = pD3DManager->ResetDevice(pDevice, resetToken);
if (FAILED(hr))
{
goto done;
}
*ppManager = pD3DManager;
(*ppManager)->AddRef();
*pReset = resetToken;
done:
SafeRelease(&pD3DManager);
return hr;
}
Cihaz sahibi, diğer nesnelerin IDirect3DDeviceManager9 arabirimine işaretçi alması için bir yol sağlamalıdır. Standart mekanizma, IMFGetService arabirimini uygulamaktır. Hizmet GUID'i MR_VIDEO_ACCELERATION_SERVICE.
Cihazı birkaç nesne arasında paylaşmak için, her nesnenin (cihazın sahibi dahil) cihaz yöneticisi aracılığıyla aşağıdaki gibi cihaza erişmesi gerekir:
- Cihaza tanıtıcı almak için IDirect3DDeviceManager9::OpenDeviceHandleçağırın.
- Cihazı kullanmak için IDirect3DDeviceManager9::LockDeviceçağırın ve cihaz tutamacını geçirin. yöntemi, IDirect3DDevice9 arabirimine bir işaretçi döndürür. yöntemi, fBlock parametresinin değerine bağlı olarak engelleme modunda veya engelleme olmayan modda çağrılabilir.
- Cihazı kullanmayı bitirdiğinizde IDirect3DDeviceManager9::UnlockDeviceçağrısı yapın. Bu yöntem, cihazı diğer nesneler için kullanılabilir hale getirir.
- Çıkmadan önce IDirect3DDeviceManager9::CloseDeviceHandle çağırarak cihaz tutamacını kapatın.
Cihaz kilidinin basılı tutulması diğer nesnelerin cihazı kullanmasını engellediğinden, cihaz kilidini yalnızca cihazı kullanırken tutmalısınız.
Cihazın sahibi, genellikle özgün cihaz kaybolduğundan ResetDeviceçağrısı yaparak herhangi bir zamanda başka bir cihaza geçebilir. Cihaz kaybı, monitör çözünürlüğündeki değişiklikler, güç yönetimi eylemleri, bilgisayarın kilitlenmesi ve kilidinin açılması gibi çeşitli nedenlerle oluşabilir. Daha fazla bilgi için Direct3D belgelerine bakın.
ResetDevice yöntemi, daha önce açılmış olan tüm cihaz tanıtıcılarını geçersiz kılmıştır. Cihaz tanıtıcısı geçersiz olduğunda, LockDevice yöntemi DXVA2_E_NEW_VIDEO_DEVICEdöndürür. Bu durumda, aşağıdaki kodda gösterildiği gibi tanıtıcıyı kapatın ve OpenDeviceHandleyeniden çağırarak yeni bir cihaz tanıtıcısı alın.
Aşağıdaki örnekte bir cihaz tutamacını açma ve cihazı kilitleme gösterilmektedir.
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;
}
İlgili konular