共用方式為


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) 和 DXGI 1.1 (IDXGIFactory1) 。 在應用程式中使用 IDXGIFactoryIDXGIFactory1,但不同時使用兩者。
 

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 傳回碼

可能的傳回值包括針對 CreateDXGIFactory1IDXGIFactory::EnumAdapters 所記載的值。

如果 ppDeviceNULL 且函式成功,則會傳回 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是以 typedef 的形式提供,因此您可以使用動態鏈接技術 (GetProcAddress) ,而不是靜態連結。

您可以使用 __uuidof()宏取得裝置介面的 REFIIDGUID。 例如, __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 參考中的範例程式代碼

規格需求

需求
目標平台 Windows
標頭 d3d12.h
程式庫 D3D12.lib
Dll D3D12.dll

另請參閱

核心函式

工作範例