Condividi tramite


Gestione dispositivi Direct3D

Gestione dispositivi Microsoft Direct3D 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

Direct3D Device Manager supporta solo dispositivi Direct3D 9. Non supporta i dispositivi DXGI.

 

Per creare la gestione dispositivi Direct3D, chiamare DXVA2CreateDirect3DDeviceManager9. Questa funzione restituisce un puntatore all'interfaccia IDirect3DDeviceManager 9 del gestore 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 ottenere un puntatore all'interfacciaIDirect3DDeviceManager9. Il meccanismo standard consiste nell'implementare l'interfacciaIMFGetService. 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, chiamare IDirect3DDeviceManager9::CloseDeviceHandle per chiudere l'handle del dispositivo.

È consigliabile tenere premuto 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 è andato perso. La perdita del dispositivo può verificarsi per vari motivi, tra cui modifiche nella 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 metodoLockDevicerestituisce DXVA2_E_NEW_VIDEO_DEVICE. In questo caso, chiudere l'handle e chiamare OpenDeviceHandle di nuovo per ottenere un nuovo handle di 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;
}

l'accelerazione video DirectX 2.0