Поделиться через


Функция D3D12CreateDevice (d3d12.h)

Создает устройство, представляющее адаптер дисплея.

Синтаксис

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

Параметры

[in, optional] pAdapter

Тип: IUnknown*

Указатель на видеоадаптер, используемый при создании устройства. Передайте значение NULL для использования адаптера по умолчанию, который является первым адаптером, перечисляемым IDXGIFactory1::EnumAdapters.

Заметка Не смешивайте использование DXGI 1.0 (IDXGIFactory) и DXGI1.1 (IDXGIFactory1) в приложении. Используйте IDXGIFactory или IDXGIFactory1, но не оба в приложении.
 

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

См. также

Основные функции

Рабочие примеры