共用方式為


D3D12CreateDevice function (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

類型: 無效**

指向記憶體區塊的指標,該區塊接收到裝置的指標。 通過 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以類型定義形式提供,讓你可以使用動態連結技術(GetProcAddress)取代靜態連結。

裝置介面的 REFIID,或稱 GUID,可透過使用 __uuidof() 巨集取得。 例如, __uuidofID3D12Device)會取得裝置介面的 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 參考文獻中的範例程式碼

需求

Requirement 價值觀
目標平臺 窗戶
Header d3d12.h
Library D3D12.lib
DLL D3D12.dll

另請參閱

核心功能

工作樣本