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을 전달합니다.
MinimumFeatureLevel
디바이스를 성공적으로 만드는 데 필요한 최소 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 반환 코드 중 하나를 반환할 수 있습니다.
가능한 반환 값에는 CreateDXGIFactory1 및 IDXGIFactory::EnumAdapters에 대해 문서화된 값이 포함됩니다.
ppDevice가 NULL이고 함수가 성공하면 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)
));
}
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | Windows |
헤더 | d3d12.h |
라이브러리 | D3D12.lib |
DLL | D3D12.dll |