ディスプレイ アダプターを表すデバイスを作成します。
構文
HRESULT D3D12CreateDevice(
[in, optional] IUnknown *pAdapter,
D3D_FEATURE_LEVEL MinimumFeatureLevel,
[in] REFIID riid,
[out, optional] void **ppDevice
);
パラメーター
[in, optional] pAdapter
型: IUnknown*
デバイスの作成時に使用するビデオ アダプターへのポインター。 IDXGIFactory1::EnumAdapters によって列挙される最初のアダプターである既定のアダプターを使用するには、NULL を渡します。
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_OKではなく、S_FALSEが返されます。
注釈
Direct3D 12 デバイスは、アダプターごとにシングルトンです。 特定のアダプターの現在のプロセスに Direct3D 12 デバイスが既に存在する場合は、 D3D12CreateDevice への後続の呼び出しによって既存のデバイスが返されます。 現在の Direct3D 12 デバイスが削除された状態にある場合 ( つまり、ID3D12Device::GetDeviceRemovedReason は失敗した HRESULT を返します)、既存のデバイスを返す代わりに D3D12CreateDevice が 失敗します。 2 つのアダプター (つまり、同じ ID を持つ) の同一性は、ポインターではなく 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) を使用できます。
デバイスへのインターフェイスの 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 リファレンスのコード例を参照してください。
Requirements
| Requirement | 価値 |
|---|---|
| ターゲット プラットフォーム の | ウィンドウズ |
| Header | d3d12.h |
| Library | D3D12.lib |
| DLL | D3D12.dll |