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.
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 |