Manajer Perangkat Direct3D

Manajer perangkat Microsoft Direct3D memungkinkan dua atau beberapa objek untuk berbagi perangkat Microsoft Direct3D 9 yang sama. Satu objek bertindak sebagai pemilik perangkat Direct3D 9. Untuk berbagi perangkat, pemilik perangkat membuat manajer perangkat Direct3D. Objek lain dapat memperoleh penunjuk ke manajer perangkat dari pemilik perangkat, lalu menggunakan manajer perangkat untuk mendapatkan penunjuk ke perangkat Direct3D. Objek apa pun yang menggunakan perangkat memegang kunci eksklusif, yang mencegah objek lain menggunakan perangkat secara bersamaan.

Catatan

Manajer Perangkat Direct3D hanya mendukung perangkat Direct3D 9. Ini tidak mendukung perangkat DXGI.

 

Untuk membuat manajer perangkat Direct3D, panggil DXVA2CreateDirect3DDeviceManager9. Fungsi ini mengembalikan penunjuk ke antarmuka IDirect3DDeviceManager9 manajer perangkat, bersama dengan token reset. Token reset memungkinkan pemilik perangkat Direct3D untuk mengatur (dan mengatur ulang) perangkat pada manajer perangkat. Untuk menginisialisasi manajer perangkat, panggil IDirect3DDeviceManager9::ResetDevice. Berikan penunjuk ke perangkat Direct3D, bersama dengan token reset.

Kode berikut menunjukkan cara membuat dan menginisialisasi manajer perangkat.

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

Pemilik perangkat harus menyediakan cara bagi objek lain untuk mendapatkan penunjuk ke antarmuka IDirect3DDeviceManager9 . Mekanisme standarnya adalah mengimplementasikan antarmuka IMFGetService . GUID layanan MR_VIDEO_ACCELERATION_SERVICE.

Untuk berbagi perangkat di antara beberapa objek, setiap objek (termasuk pemilik perangkat) harus mengakses perangkat melalui manajer perangkat, sebagai berikut:

  1. Panggil IDirect3DDeviceManager9::OpenDeviceHandle untuk mendapatkan handel ke perangkat.
  2. Untuk menggunakan perangkat, panggil IDirect3DDeviceManager9::LockDevice dan teruskan handel perangkat. Metode mengembalikan pointer ke antarmuka IDirect3DDevice9 . Metode ini dapat dipanggil dalam mode pemblokiran atau mode non-pemblokiran, tergantung pada nilai parameter fBlock .
  3. Setelah selesai menggunakan perangkat, panggil IDirect3DDeviceManager9::UnlockDevice. Metode ini membuat perangkat tersedia untuk objek lain.
  4. Sebelum keluar, panggil IDirect3DDeviceManager9::CloseDeviceHandle untuk menutup handel perangkat.

Anda harus menahan kunci perangkat hanya saat menggunakan perangkat, karena menahan kunci perangkat mencegah objek lain menggunakan perangkat.

Pemilik perangkat dapat beralih ke perangkat lain kapan saja dengan memanggil ResetDevice, biasanya karena perangkat asli hilang. Kehilangan perangkat dapat terjadi karena berbagai alasan, termasuk perubahan dalam resolusi monitor, tindakan manajemen daya, penguncian dan pembukaan kunci komputer, dan sebagainya. Untuk informasi selengkapnya, lihat dokumentasi Direct3D.

Metode ResetDevice membatalkan handel perangkat apa pun yang dibuka sebelumnya. Saat handel perangkat tidak valid, metode LockDevice mengembalikan DXVA2_E_NEW_VIDEO_DEVICE. Jika ini terjadi, tutup handel dan panggil OpenDeviceHandle lagi untuk mendapatkan handel perangkat baru, seperti yang ditunjukkan pada kode berikut.

Contoh berikut menunjukkan cara membuka handel perangkat dan mengunci perangkat.

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

Akselerasi Video DirectX 2.0