Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 NULL pour utiliser l’adaptateur par défaut, qui est le premier adaptateur énuméré par IDXGIFactory1 ::EnumAdapters.
MinimumFeatureLevel
Type : D3D_FEATURE_LEVEL
La D3D_FEATURE_LEVEL minimale requise pour la création réussie de l’appareil.
[in] riid
Type : REFIID
Identificateur global unique (GUID) de 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 réellement créer l’appareil. Si la valeur NULL est passée et que la création de l’appareil réussit, S_FALSE est retournée.
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ée, 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 actuel pour une carte donnée, un appel ultérieur à 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 retourner l’appareil existant. La sameness de deux adaptateurs (autrement dit, 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 fonction PFN_D3D12_CREATE_DEVICE est fournie en tant que typedef, afin que vous puissiez utiliser des techniques de liaison dynamique (GetProcAddress) au lieu de lier statiquement.
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 sur un appareil.
Examples
Créez un appareil basé sur du matériel, sauf si vous demandez à créer 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.
Spécifications
| Requirement | Valeur |
|---|---|
| plateforme cible | Fenêtres |
| Header | d3d12.h |
| Library | D3D12.lib |
| DLL | D3D12.dll |