다음을 통해 공유


D3D12CreateDevice 함수(d3d12.h)

디스플레이 어댑터를 나타내는 디바이스를 만듭니다.

구문

HRESULT D3D12CreateDevice(
  [in, optional]  IUnknown          *pAdapter,
                  D3D_FEATURE_LEVEL MinimumFeatureLevel,
  [in]            REFIID            riid,
  [out, optional] void              **ppDevice
);

매개 변수

[in, optional] pAdapter

형식: IUnknown*

디바이스를 만들 때 사용할 비디오 어댑터에 대한 포인터입니다. IDXGIFactory1::EnumAdapters로 열거된 첫 번째 어댑터인 기본 어댑터를 사용하도록 NULL을 전달합니다.

참고 애플리케이션에서 DXGI 1.0(IDXGIFactory) 및 DXGI 1.1(IDXGIFactory1) 사용을 혼합하지 마세요. IDXGIFactory 또는 IDXGIFactory1을 사용하지만 애플리케이션에서 둘 다 사용하지는 않습니다.
 

MinimumFeatureLevel

형식: D3D_FEATURE_LEVEL

디바이스를 성공적으로 만드는 데 필요한 최소 D3D_FEATURE_LEVEL .

[in] riid

형식: REFIID

디바이스 인터페이스에 대한 GUID(Globally Unique Identifier)입니다. 이 매개 변수 및 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 가 실패합니다. 두 어댑터의 동일성(즉, 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
라이브러리 D3D12.lib
DLL D3D12.dll

추가 정보

핵심 함수

작업 샘플