Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Met Microsoft Direct3D-apparaatbeheer kunnen twee of meer objecten hetzelfde Microsoft Direct3D 9-apparaat delen. Eén object fungeert als de eigenaar van het Direct3D 9-apparaat. Als u het apparaat wilt delen, maakt de eigenaar van het apparaat direct3D-apparaatbeheer. Andere objecten kunnen een aanwijzer naar de apparaatbeheerder verkrijgen van de apparaateigenaar en vervolgens de apparaatbeheerder gebruiken om een aanwijzer naar het Direct3D-apparaat te krijgen. Elk object dat het apparaat gebruikt, bevat een exclusieve vergrendeling, waardoor andere objecten het apparaat niet tegelijkertijd kunnen gebruiken.
Notitie
Direct3D Device Manager ondersteunt alleen Direct3D 9-apparaten. Het biedt geen ondersteuning voor DXGI-apparaten.
Als u direct3D-apparaatbeheer wilt maken, roept u DXVA2CreateDirect3DDeviceManager9aan. Deze functie retourneert een aanwijzer naar de IDirect3DDeviceManager9 interface van de apparaatbeheerder, samen met een token voor opnieuw instellen. Met het token voor opnieuw instellen kan de eigenaar van het Direct3D-apparaat het apparaat instellen (en opnieuw instellen) op het apparaatbeheer. Als u de apparaatbeheerder wilt initialiseren, roept u IDirect3DDeviceManager9::ResetDeviceaan. Geef een aanwijzer door aan het Direct3D-apparaat, samen met het token voor opnieuw instellen.
De volgende code laat zien hoe u apparaatbeheer maakt en initialiseert.
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;
}
De eigenaar van het apparaat moet een manier bieden voor andere objecten om een aanwijzer te krijgen naar de IDirect3DDeviceManager9 interface. Het standaardmechanisme is het implementeren van de IMFGetService interface. De service-GUID is MR_VIDEO_ACCELERATION_SERVICE.
Als u het apparaat wilt delen tussen verschillende objecten, moet elk object (inclusief de eigenaar van het apparaat) het apparaat als volgt openen via apparaatbeheer:
- Roep IDirect3DDeviceManager9::OpenDeviceHandle aan om een ingang op het apparaat te krijgen.
- Als u het apparaat wilt gebruiken, roept u IDirect3DDeviceManager9::LockDevice aan en geeft u de apparaatgreep door. De methode retourneert een aanwijzer naar de IDirect3DDevice9 interface. De methode kan worden aangeroepen in een blokkeringsmodus of een niet-blokkerende modus, afhankelijk van de waarde van de parameter fBlock.
- Wanneer u klaar bent met het apparaat, roept u IDirect3DDeviceManager9::UnlockDeviceaan. Met deze methode wordt het apparaat beschikbaar voor andere objecten.
- Voordat u afsluit, roept u IDirect3DDeviceManager9::CloseDeviceHandle aan om de apparaatgreep te sluiten.
U moet het apparaat alleen vergrendelen tijdens het gebruik van het apparaat, omdat het apparaatvergrendeling vasthoudt, voorkomt dat andere objecten het apparaat gebruiken.
De eigenaar van het apparaat kan op elk gewenst moment overschakelen naar een ander apparaat door ResetDevice-aan te roepen, meestal omdat het oorspronkelijke apparaat verloren is gegaan. Apparaatverlies kan om verschillende redenen optreden, waaronder wijzigingen in de resolutie van de monitor, energiebeheeracties, vergrendelen en ontgrendelen van de computer, enzovoort. Zie de Direct3D-documentatie voor meer informatie.
De methode ResetDevice ongeldige apparaatgrepen die eerder zijn geopend. Wanneer een apparaatgreep ongeldig is, retourneert de LockDevice-methodeDXVA2_E_NEW_VIDEO_DEVICE. Als dit gebeurt, sluit u de ingang en roept u OpenDeviceHandle opnieuw aan om een nieuwe apparaatgreep te verkrijgen, zoals wordt weergegeven in de volgende code.
In het volgende voorbeeld ziet u hoe u een apparaatgreep opent en het apparaat vergrendelt.
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;
}
Verwante onderwerpen