Device(그래픽 디바이스 생성)

순번 |
그림 요소 |
코드 예시 |
설명 |
1 |
응용 프로그램 |
GraphicDevice_DX12::CreateDevice() |
사용자 코드에서 DX12 초기화를 시작 |
2 |
D3D12 API |
D3D12CreateDevice(...) |
GPU 제어를 위한 DX12 디바이스를 생성 |
3 |
사용자-모드 드라이버 |
내부적으로 D3D12 호출 시 작동 |
GPU 제조사의 드라이버가 DX 명령 처리 |
4 |
DXGI |
CreateDXGIFactory2() 등 |
어댑터 탐색, 스왑체인 관리 등 |
5 |
커널-모드 드라이버 |
DXGI → GPU 연결 시 자동 개입 |
OS 레벨에서 하드웨어 명령 전달 |
6 |
하드웨어 |
GPU |
최종 렌더링 수행 |
① DXGI 팩토리 생성

if (FAILED(CreateDXGIFactory2(dxgiFactoryFlags, IID_PPV_ARGS(&mFactory))))
assert(NULL && "Create DXGI Factory Failed!");
- 그림에서:
DXGI
(초록색 상자)
- 역할: DXGI 팩토리를 생성하여 GPU 어댑터, 스왑체인(출력) 등을 관리할 준비를 합니다.
DXGI Factory로 얻을 수 있는 대표적인 정보들
기능 |
설명 |
관련 함수 |
어댑터 정보 (GPU 목록) |
시스템에 연결된 GPU(어댑터)의 수와 정보를 얻을 수 있습니다. |
EnumAdapters1() , EnumWarpAdapter() |
출력 장치 정보 (모니터) |
GPU에 연결된 디스플레이(모니터) 정보를 가져올 수 있습니다. |
IDXGIAdapter::EnumOutputs() |
디스플레이 모드 정보 |
해상도, 리프레시 레이트 등 모니터의 디스플레이 모드를 나열합니다. |
IDXGIOutput::GetDisplayModeList() |
어댑터 설명 |
GPU 이름, 전용 비디오 메모리 용량 등 하드웨어 상세 정보를 얻습니다. |
IDXGIAdapter1::GetDesc1() |
WARP 어댑터 접근 |
GPU가 없어도 CPU 렌더링용 WARP 어댑터 사용 가능 |
EnumWarpAdapter() |
스왑체인 생성 |
화면 출력용 스왑체인을 생성할 수 있습니다. |
CreateSwapChainForHwnd() 등 |
전체 시스템 그래픽 구성 |
디스플레이와 어댑터의 연결 관계를 확인 가능 |
어댑터 → 출력장치 → 모드 확인 트리 구조 |
② 디버그 레이어 활성화 (옵션)
#if defined(_DEBUG)
// Enable the debug layer (requires the Graphics Tools "optional feature").
// NOTE: Enabling the debug layer after device creation will invalidate the active device.
Microsoft::WRL::ComPtr<ID3D12Debug> debugController;
if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController))))
{
debugController->EnableDebugLayer();
// Enable additional debug layers.
dxgiFactoryFlags |= DXGI_CREATE_FACTORY_DEBUG;
}
#endif
- 응용 프로그램(Application) 내부에서 디버깅 기능을 켭니다.
- DX12의 내부 호출 및 리소스 생성을 점검할 수 있게 해줍니다.
③ 어댑터 선택 (하드웨어 or 소프트웨어)
if (mbUseWarpDevice)
{
Microsoft::WRL::ComPtr<IDXGIAdapter> warpAdapter;
if (FAILED(mFactory->EnumWarpAdapter(IID_PPV_ARGS(&warpAdapter))))
assert(NULL && "Enum Warp Adapter Failed!");
if (FAILED(D3D12CreateDevice(
warpAdapter.Get()
, D3D_FEATURE_LEVEL_11_0
, IID_PPV_ARGS(&mDevice))))
assert(NULL && "Create Device with Warp Adapter Failed!");
}
else
{
Microsoft::WRL::ComPtr<IDXGIAdapter1> hardwareAdapter;
GetHardwareAdapter(mFactory.Get(), &hardwareAdapter);
...
}
- 하드웨어 어댑터 사용 시 → 사용자-모드 드라이버 및 DXGI