D3D12CreateDevice, fonction (d3d12.h)

Crée un appareil qui représente l’adaptateur d’affichage.

Syntaxe

HRESULT D3D12CreateDevice(
  [in, optional]  IUnknown          *pAdapter,
                  D3D_FEATURE_LEVEL MinimumFeatureLevel,
  [in]            REFIID            riid,
  [out, optional] void              **ppDevice
);

Paramètres

[in, optional] pAdapter

Type : IUnknown*

Pointeur vers la carte vidéo à utiliser lors de la création d’un appareil. Passez la valeur NULL pour utiliser l’adaptateur par défaut, qui est le premier adaptateur énuméré par IDXGIFactory1 ::EnumAdapters.

Note Ne mélangez pas l’utilisation de DXGI 1.0 (IDXGIFactory) et de DXGI 1.1 (IDXGIFactory1) dans une application. Utilisez IDXGIFactory ou IDXGIFactory1, mais pas les deux dans une application.
 

MinimumFeatureLevel

Type : D3D_FEATURE_LEVEL

Le D3D_FEATURE_LEVEL minimum requis pour une création d’appareil réussie.

[in] riid

Type : REFIID

Identificateur global unique (GUID) pour l’interface de l’appareil. Ce paramètre et ppDevice peuvent être traités avec la macro unique IID_PPV_ARGS.

[out, optional] ppDevice

Type : void**

Pointeur vers un bloc de mémoire qui reçoit un pointeur vers l’appareil. Passez la valeur NULL pour tester si la création de l’appareil réussit, mais pour ne pas créer réellement l’appareil. Si la valeur NULL est transmise et que la création de l’appareil réussit, S_FALSE est retourné.

Valeur retournée

Type : HRESULT

Cette méthode peut retourner l’un des codes de retour Direct3D 12.

Les valeurs de retour possibles incluent celles documentées pour CreateDXGIFactory1 et IDXGIFactory ::EnumAdapters.

Si ppDevice a la valeur NULL et que la fonction réussit, S_FALSE est retourné, plutôt que S_OK.

Remarques

Les appareils Direct3D 12 sont des singletons par adaptateur. Si un appareil Direct3D 12 existe déjà dans le processus en cours pour un adaptateur donné, un appel suivant à D3D12CreateDevice retourne l’appareil existant. Si l’appareil Direct3D 12 actuel est dans un état supprimé (autrement dit, ID3D12Device ::GetDeviceRemovedReason retourne un HRESULT défaillant), D3D12CreateDevice échoue au lieu de renvoyer l’appareil existant. L’identique de deux adaptateurs (c’est-à-dire qu’ils ont la même identité) est déterminé en comparant leurs LUID, et non leurs pointeurs.

Pour être sûr de récupérer le premier adaptateur prenant en charge D3D12, utilisez le code suivant.

void GetHardwareAdapter(IDXGIFactory4* pFactory, IDXGIAdapter1** ppAdapter)
{
    *ppAdapter = nullptr;
    for (UINT adapterIndex = 0; ; ++adapterIndex)
    {
        IDXGIAdapter1* pAdapter = nullptr;
        if (DXGI_ERROR_NOT_FOUND == pFactory->EnumAdapters1(adapterIndex, &pAdapter))
        {
            // No more adapters to enumerate.
            break;
        } 

        // Check to see if the adapter supports Direct3D 12, but don't create the
        // actual device yet.
        if (SUCCEEDED(D3D12CreateDevice(pAdapter, D3D_FEATURE_LEVEL_11_0, _uuidof(ID3D12Device), nullptr)))
        {
            *ppAdapter = pAdapter;
            return;
        }
        pAdapter->Release();
    }
}

La signature de la fonction PFN_D3D12_CREATE_DEVICE est fournie en tant que typedef, ce qui vous permet d’utiliser des techniques de liaison dynamique (GetProcAddress) au lieu d’une liaison statique.

Le REFIID, ou GUID, de l’interface d’un appareil peut être obtenu à l’aide de la __uuidof() macro. Par exemple, __uuidof(ID3D12Device) obtient le GUID de l’interface vers un appareil.

Exemples

Créez un appareil basé sur du matériel, sauf indication de création d’un appareil logiciel WARP.

ComPtr<IDXGIFactory4> factory;
ThrowIfFailed(CreateDXGIFactory1(IID_PPV_ARGS(&factory)));

if (m_useWarpDevice)
{
    ComPtr<IDXGIAdapter> warpAdapter;
    ThrowIfFailed(factory->EnumWarpAdapter(IID_PPV_ARGS(&warpAdapter)));

    ThrowIfFailed(D3D12CreateDevice(
        warpAdapter.Get(),
        D3D_FEATURE_LEVEL_11_0,
        IID_PPV_ARGS(&m_device)
        ));
}
else
{
    ComPtr<IDXGIAdapter1> hardwareAdapter;
    GetHardwareAdapter(factory.Get(), &hardwareAdapter);

    ThrowIfFailed(D3D12CreateDevice(
        hardwareAdapter.Get(),
        D3D_FEATURE_LEVEL_11_0,
        IID_PPV_ARGS(&m_device)
        ));
}

Reportez-vous à l’exemple de code dans la référence D3D12.

Configuration requise

Condition requise Valeur
Plateforme cible Windows
En-tête d3d12.h
Bibliothèque D3D12.lib
DLL D3D12.dll

Voir aussi

Fonctions Core

Exemples fonctionnels