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 によって列挙される最初のアダプターです。

メモ アプリケーションで DXGI 1.0 (IDXGIFactory) と DXGI 1.1 (IDXGIFactory1) の使用を混在させないでください。 IDXGIFactory または IDXGIFactory1 を使用しますが、アプリケーションでは両方を使用しないでください。
 

MinimumFeatureLevel

種類: D3D_FEATURE_LEVEL

デバイスの正常な作成に必要な最小 D3D_FEATURE_LEVEL

[in] riid

種類: REFIID

デバイス インターフェイスのグローバル一意識別子 (GUID)。 このパラメーターと ppDevice は、単一のマクロ IID_PPV_ARGSでアドレス指定できます。

[out, optional] ppDevice

型: void**

デバイスへのポインターを受け取るメモリ ブロックへのポインター。 NULL を渡して、デバイスの作成が成功するかどうかをテストしますが、実際にはデバイスを作成しません。 NULL が渡され、デバイスの作成が成功すると、S_FALSEが返されます。

戻り値

種類: HRESULT

このメソッドは、Direct3D 12リターン コードのいずれかを返すことができます。

可能な戻り値には、 CreateDXGIFactory1IDXGIFactory::EnumAdapters に関するドキュメントに記載されているものが含まれます。

ppDeviceNULL で、関数が成功した場合は、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 リファレンスのコード例を参照してください

要件

要件
対象プラットフォーム Windows
ヘッダー d3d12.h
Library D3D12.lib
[DLL] D3D12.dll

こちらもご覧ください

コア関数

実用的なサンプル