Gestione dispositivi Direct3D

Microsoft Direct3D Device Manager consente a due o più oggetti di condividere lo stesso dispositivo Microsoft Direct3D 9. Un oggetto funge da proprietario del dispositivo Direct3D 9. Per condividere il dispositivo, il proprietario del dispositivo crea la gestione dispositivi Direct3D. Altri oggetti possono ottenere un puntatore al gestore dispositivi dal proprietario del dispositivo, quindi usare gestione dispositivi per ottenere un puntatore al dispositivo Direct3D. Qualsiasi oggetto che usa il dispositivo contiene un blocco esclusivo, che impedisce ad altri oggetti di usare contemporaneamente il dispositivo.

Nota

Il Gestione dispositivi Direct3D supporta solo i dispositivi Direct3D 9. Non supporta i dispositivi DXGI.

 

Per creare la gestione dispositivi Direct3D, chiama DXVA2CreateDirect3DDeviceManager9. Questa funzione restituisce un puntatore all'interfaccia IDirect3DDeviceManager9 di Gestione dispositivi, insieme a un token di reimpostazione. Il token di reimpostazione consente al proprietario del dispositivo Direct3D di impostare (e reimpostare) il dispositivo nella gestione dispositivi. Per inizializzare gestione dispositivi, chiamare IDirect3DDeviceManager9::ResetDevice. Passare un puntatore al dispositivo Direct3D, insieme al token di reimpostazione.

Il codice seguente illustra come creare e inizializzare gestione dispositivi.

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;
}

Il proprietario del dispositivo deve fornire un modo per consentire ad altri oggetti di ottenere un puntatore all'interfaccia IDirect3DDeviceManager9 . Il meccanismo standard consiste nell'implementare l'interfaccia IMFGetService . Il GUID del servizio è MR_VIDEO_ACCELERATION_SERVICE.

Per condividere il dispositivo tra diversi oggetti, ogni oggetto (incluso il proprietario del dispositivo) deve accedere al dispositivo tramite Gestione dispositivi, come indicato di seguito:

  1. Chiama IDirect3DDeviceManager9::OpenDeviceHandle per ottenere un handle per il dispositivo.
  2. Per usare il dispositivo, chiama IDirect3DDeviceManager9::LockDevice e passa l'handle del dispositivo. Il metodo restituisce un puntatore all'interfaccia IDirect3DDevice9 . Il metodo può essere chiamato in modalità di blocco o in modalità non bloccante, a seconda del valore del parametro fBlock .
  3. Al termine dell'uso del dispositivo, chiamare IDirect3DDeviceManager9::UnlockDevice. Questo metodo rende il dispositivo disponibile per altri oggetti.
  4. Prima di uscire, chiama IDirect3DDeviceManager9::CloseDeviceHandle per chiudere l'handle del dispositivo.

È consigliabile mantenere il blocco del dispositivo solo durante l'uso del dispositivo, perché tenendo premuto il blocco del dispositivo si impedisce l'uso del dispositivo da parte di altri oggetti.

Il proprietario del dispositivo può passare a un altro dispositivo in qualsiasi momento chiamando ResetDevice, in genere perché il dispositivo originale è stato perso. La perdita del dispositivo può verificarsi per vari motivi, tra cui modifiche alla risoluzione del monitoraggio, azioni di risparmio energia, blocco e sblocco del computer e così via. Per altre informazioni, vedere la documentazione di Direct3D.

Il metodo ResetDevice invalida tutti gli handle di dispositivo aperti in precedenza. Quando un handle di dispositivo non è valido, il metodo LockDevice restituisce DXVA2_E_NEW_VIDEO_DEVICE. In questo caso, chiudere l'handle e chiamare nuovamente OpenDeviceHandle per ottenere un nuovo handle del dispositivo, come illustrato nel codice seguente.

L'esempio seguente illustra come aprire un handle di dispositivo e bloccare il dispositivo.

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;
}

Accelerazione video DirectX 2.0