Quick Comparison
ID3D11Device -> CreateBuffer, CreateTexture2D, Create*Shader, Create*State
ID3D11DeviceContext -> *Set* bindings, Update/Map, Clear, Draw, Dispatch
IDXGISwapChain -> display buffers, Present, ResizeBuffers, fullscreen state하나를 다른 객체의 별칭으로 보지 않습니다. Device가 만든 resource를 Context가 pipeline에 연결하고, 렌더링 결과가 기록된 swap-chain back buffer를 DXGI가 표시합니다.
생성 결과
D3D11CreateDeviceAndSwapChain은 adapter·driver·feature level·swap-chain description을 받아 세 핵심 객체를 한 번에 돌려줄 수 있습니다. 최신 DXGI factory 흐름에서는 Device를 만든 뒤 CreateSwapChainForHwnd 계열을 사용하기도 합니다.
Microsoft::WRL::ComPtr<ID3D11Device> device;
Microsoft::WRL::ComPtr<ID3D11DeviceContext> context;
Microsoft::WRL::ComPtr<IDXGISwapChain> swapChain;
D3D_FEATURE_LEVEL featureLevel{};대부분의 작은 애플리케이션은 Device 하나와 immediate Context 하나를 사용합니다. 여러 window나 swap chain을 사용해도 같은 Device resource를 공유할 수 있지만 adapter와 device ownership을 일관되게 유지해야 합니다.
수명과 연결
Resource와 view, context는 Device에 연결된 COM 객체입니다. Device를 직접 먼저 해제하는 순서를 수동으로 맞추기보다 ComPtr로 참조 수명을 관리합니다. Swap Chain buffer를 resize하기 전에는 buffer를 참조하는 RTV와 Context binding도 해제해야 합니다.
자주 틀리는 점
- Device는 매 frame 생성하지 않습니다.
- Context를 resource factory로 사용하지 않습니다.
- Swap Chain과 Back Buffer texture를 같은 객체로 보지 않습니다.
- 서로 다른 Device에서 만든 resource를 임의로 같은 Context에 bind하지 않습니다.
참고 링크
2 sources