Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Создает устройство, представляющее адаптер дисплея.
Синтаксис
HRESULT D3D12CreateDevice(
[in, optional] IUnknown *pAdapter,
D3D_FEATURE_LEVEL MinimumFeatureLevel,
[in] REFIID riid,
[out, optional] void **ppDevice
);
Параметры
[in, optional] pAdapter
Тип: IUnknown*
Указатель на видеоадаптер, используемый при создании устройства. Передайте значение NULL для использования адаптера по умолчанию, который является первым адаптером, перечисляемым IDXGIFactory1::EnumAdapters.
MinimumFeatureLevel
Тип: D3D_FEATURE_LEVEL
Минимальное D3D_FEATURE_LEVEL , необходимое для успешного создания устройства.
[in] riid
Тип: REFIID
Глобальный уникальный идентификатор (GUID) для интерфейса устройства. Этот параметр и ppDevice можно устранить с помощью одного макроса IID_PPV_ARGS.
[out, optional] ppDevice
Тип: void**
Указатель на блок памяти, который получает указатель на устройство. Передайте значение NULL , чтобы проверить успешность создания устройства, но не создавать устройство. Если значение NULL передано и устройство будет выполнено успешно, S_FALSE возвращается.
Возвращаемое значение
Тип: HRESULT
Этот метод может возвращать один из кодов возврата Direct3D 12.
Возможные возвращаемые значения включают те, которые описаны для CreateDXGIFactory1 и IDXGIFactory::EnumAdapters.
Если ppDevice имеет значение NULL и функция завершается успешно, возвращается S_FALSE , а не S_OK.
Замечания
Устройства Direct3D 12 являются однотонными для каждого адаптера. Если устройство Direct3D 12 уже существует в текущем процессе для данного адаптера, последующий вызов D3D12CreateDevice возвращает существующее устройство. Если текущее устройство Direct3D 12 находится в удаленном состоянии (то есть ID3D12Device::GetDeviceRemovedReason возвращает сбой HRESULT), то D3D12CreateDevice завершается ошибкой вместо возврата существующего устройства. То жесть двух адаптеров (то есть они имеют одно и то же удостоверение) определяется путем сравнения идентификаторов LUID, а не их указателей.
Чтобы не забудьте выбрать первый адаптер, поддерживающий D3D12, используйте следующий код.
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();
}
}
Сигнатура функции PFN_D3D12_CREATE_DEVICE предоставляется в виде типа, чтобы можно было использовать методы динамического связывания (GetProcAddress) вместо статического связывания.
Идентификатор REFIID или GUID интерфейса к устройству можно получить с помощью макроса __uuidof().
Например, __uuidof(ID3D12Device) получит GUID интерфейса на устройстве.
Примеры
Создайте аппаратное устройство, если не будет указано, как создать программное устройство 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)
));
}
См. пример кода в справочнике D3D12.
Требования
| Требование | Ценность |
|---|---|
| целевая платформа | Виндоус |
| Header | d3d12.h |
| Library | D3D12.lib |
| DLL | D3D12.dll |