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

image.png


순번 그림 요소 코드 예시 설명
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 팩토리 생성

image.png

		if (FAILED(CreateDXGIFactory2(dxgiFactoryFlags, IID_PPV_ARGS(&mFactory))))
			assert(NULL && "Create DXGI Factory Failed!");

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


③ 어댑터 선택 (하드웨어 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);
			...
		}