建立一個代表顯示介面卡的裝置。
語法
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 。
[in] riid
類型: REFIID
裝置介面的全球唯一識別碼(GUID)。 此參數及 ppDevice 可用單一巨集 IID_PPV_ARGS尋址。
[out, optional] ppDevice
類型: 無效**
指向記憶體區塊的指標,該區塊接收到裝置的指標。 通過 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 參考文獻中的範例程式碼。
需求
| Requirement | 價值觀 |
|---|---|
| 目標平臺 | 窗戶 |
| Header | d3d12.h |
| Library | D3D12.lib |
| DLL | D3D12.dll |