Freigeben über


Direct3D-Geräte-Manager

Mit dem Microsoft Direct3D-Geräte-Manager können zwei oder mehr Objekte dasselbe Microsoft Direct3D 9-Gerät gemeinsam nutzen. Ein Objekt fungiert als Besitzer des Direct3D 9-Geräts. Zum Freigeben des Geräts erstellt der Besitzer des Geräts den Direct3D-Geräte-Manager. Andere Objekte können einen Zeiger auf den Geräte-Manager vom Gerätebesitzer abrufen und dann den Geräte-Manager verwenden, um einen Zeiger auf das Direct3D-Gerät abzurufen. Jedes Objekt, das das Gerät verwendet, enthält eine exklusive Sperre, die verhindert, dass andere Objekte das Gerät gleichzeitig verwenden.

Anmerkung

Der Direct3D-Geräte-Manager unterstützt nur Direct3D 9-Geräte. Es unterstützt keine DXGI-Geräte.

 

Rufen Sie zum Erstellen des Direct3D-Geräte-Managers DXVA2CreateDirect3DDeviceManager9auf. Diese Funktion gibt einen Zeiger auf die IDirect3DDeviceManager9 Schnittstelle des Geräte-Managers zusammen mit einem Zurücksetzungstoken zurück. Mit dem Reset-Token kann der Besitzer des Direct3D-Geräts das Gerät im Geräte-Manager festlegen (und zurücksetzen). Rufen Sie zum Initialisieren des Geräte-Managers IDirect3DDeviceManager9::ResetDeviceauf. Übergeben Sie einen Zeiger an das Direct3D-Gerät zusammen mit dem Zurücksetzungstoken.

Der folgende Code zeigt, wie Sie den Geräte-Manager erstellen und initialisieren.

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

Der Gerätebesitzer muss eine Möglichkeit für andere Objekte bereitstellen, um einen Zeiger auf die IDirect3DDeviceManager9 Schnittstelle abzurufen. Der Standardmechanismus besteht darin, die IMFGetService- Schnittstelle zu implementieren. Die Dienst-GUID ist MR_VIDEO_ACCELERATION_SERVICE.

Um das Gerät unter mehreren Objekten zu teilen, muss jedes Objekt (einschließlich des Besitzers des Geräts) wie folgt über den Geräte-Manager auf das Gerät zugreifen:

  1. Rufen Sie IDirect3DDeviceManager9::OpenDeviceHandle- auf, um ein Handle zum Gerät zu erhalten.
  2. Rufen Sie zum Verwenden des Geräts IDirect3DDeviceManager9::LockDevice auf, und übergeben Sie den Gerätehandle. Die Methode gibt einen Zeiger auf die IDirect3DDevice9 Schnittstelle zurück. Die Methode kann in einem Blockierungsmodus oder in einem nicht blockierenden Modus aufgerufen werden, abhängig vom Wert des fBlock--Parameters.
  3. Wenn Sie mit der Verwendung des Geräts fertig sind, rufen Sie IDirect3DDeviceManager9::UnlockDeviceauf. Mit dieser Methode wird das Gerät anderen Objekten zur Verfügung gestellt.
  4. Rufen Sie vor dem Beenden IDirect3DDeviceManager9::CloseDeviceHandle auf, um den Gerätehandle zu schließen.

Sie sollten die Gerätesperre nur während der Verwendung des Geräts halten, da durch Halten der Gerätesperre verhindert wird, dass andere Objekte das Gerät verwenden.

Der Besitzer des Geräts kann jederzeit zu einem anderen Gerät wechseln, indem ResetDeviceaufgerufen wird, in der Regel, weil das ursprüngliche Gerät verloren ging. Geräteverlust kann aus verschiedenen Gründen auftreten, einschließlich Änderungen der Monitorauflösung, Energieverwaltungsaktionen, Sperren und Entsperren des Computers usw. Weitere Informationen finden Sie in der Direct3D-Dokumentation.

Die ResetDevice Methode ungültige Gerätehandles, die zuvor geöffnet wurden. Wenn ein Gerätehandle ungültig ist, gibt die LockDevice--Methode DXVA2_E_NEW_VIDEO_DEVICEzurück. Schließen Sie in diesem Fall das Handle, und rufen Sie OpenDeviceHandle erneut auf, um ein neues Gerätehandle abzurufen, wie im folgenden Code gezeigt.

Das folgende Beispiel zeigt, wie Sie ein Gerätehandle öffnen und das Gerät sperren.

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

DirectX VideoBeschleunigung 2.0