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 所列舉的第一個配接器。
MinimumFeatureLevel
成功建立裝置所需的最小 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是以 typedef 的形式提供,因此您可以使用動態鏈接技術 (GetProcAddress) ,而不是靜態連結。
您可以使用 __uuidof()
宏取得裝置介面的 REFIID 或 GUID。
例如, __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 |