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_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)
));
}
要件
要件 | 値 |
---|---|
対象プラットフォーム | Windows |
ヘッダー | d3d12.h |
Library | D3D12.lib |
[DLL] | D3D12.dll |