Device & Device Context

 

이 두 인터페이스는 Dx의 주된 인터페이스로 물리적인 그래픽 장치 하드웨어에 대한 제어기다.

ID3D11Device, ID3D11DeviceContext 의 맨 앞이 모두 ' I ' 이므로 인터페이스인걸 확인 알 수 있다.

ID3D11Device / 모두 순수가상함수로 이루어져있다.

 

가장 주요한 인터페이스기에 Direct3D 초기화의 시작은 Device와 Device Context의 생성으로 시작 된다.

 

생성의 함수는

D3D11CreateDevice ( 혹은 D3D11CreateDeviceAndSwapChain사용 )

 

HRESULT D3D11CreateDevice(

     IDXGIAdapter *pAdapter,

     D3D_DRIVER_TYPE DriverType,

     HMODULE Software,

     UINT Flags,

     const D3D_FEATURE_LEVEL *pFeatureLevels,

     UINT FeatureLevels,

     UINT SDKVersion,

     ID3D11Device **ppDevice,

     D3D_FEATURE_LEVEL *pFeatureLevel,

     ID3D11DeviceContext **ppImmediateContext

);

 

주요 매개변수만 보자면

pAdapter : 디스플레이 어댑터를 지정한다

디스플레이 어댑터 : 그래픽 카드

ID3D11Device **ppDevice : 생성된 Device를 돌려줌

ID3D11DeviceContext **ppImmediateContext : 생성된 DeviceContext를 돌려줌

 

이러한 매개변수를 받는다는게

이 함수에서 그래픽 카드를 연결해준다는걸 추리해볼수있다.

 

 

ID3D11Device의 함수를 보면 거의 다 함수 앞에 Create가 붙어있었다.

셰이더를 만들고(Create)

텍스처의 배열을 만들고(Create)

버퍼를 만들고(Craete)

이런걸로 봤을때 Device의 역할은 그래픽을 그리는 자원들을 생성하고 준비하게끔 도와주는 역할이라 생각한다.

 

ID3D11DeviceContext의 함수는 대부분 Set과 Get이 많이 들어가 보였다.

버퍼를 세팅하고, 가져오고(Set, Get)

셰이더를 세팅하고(Set)

각 파이프라인 단계를 세팅하고(Set)

이런걸로 봤을때 Device로 생성된 자원들을 디스플레이 어댑터에 세팅하고 세팅되었던걸 가져오고 이러한 역할같다.

 

+DeviceContext는 주 쓰레드와 그외의 쓰레드일때 다른 문맥을 생성해야한다고 한다.

주 쓰레드면 위의 방식으로 생성, 즉시문맥이 생성되고( immediate context )

멀티 쓰레딩 환경에서 그 외의 쓰레드(일꾼쓰레드)이면 ID3D11Device::CreateDeferredContext으로

지연문맥을 생성한다 ( deferred context )

 

그래서 일꾼쓰레드가 ID3D11CommandList에 그리기 명령을 기록한다.

주쓰레드에서 그 기록들을 실행한다고 한다.

 


COM 객체 (Component Object Model)

 

COM객체또한 액터가 아닌 언어의 독립성과 호환성을 가능하게 하는 기술이라고 한다.

언어의 독립성 : 극단적 예시로 A라는 COM객체를 c++ 에서도 사용하고 java에서도 사용하고 python에서도 사용한다

 

갑자기 왜 나왔냐면 Device & Device Context가 COM객체이기 때문이다.

이유는 모든 COM객체는 IUnknown이라는 COM 인터페이스 기능을 상속받기 때문이다.

IUKnown을 상속받는 이유는 모든 COM객체가 같은 고유한 방식으로 메모리를 관리하기때문

Device Context는 ID3D11DeviceChild를 상속받는다.

일단 언리얼에서 컴포넌트를 다뤘다면 대강 그림이 그려진다.

컴포넌트의 이유가 어느 액터이던간에 땟다 붙엿다 하려고 컴포넌트를 생성했었는데

 

이러한 COM객체는 인터페이스형태로 우리에게 보여지며

New처럼 객체를 생성하지 못하고 특별한 함수나 다른 COM인터페이스의 메서드를 이용하여 얻어야한다.

 


맨위 사진의 맨 첫줄 MIDL_INTERFACE("db6f6ddb-ac77-4e88-8253-819df9bbf140") 는

uuid라는걸 뜻하는데 개념이 아직 너무 막연하고 아직 필요성은 없는거 같아 나중에 필요해질때 다시 찾아보자

 

'DirectX 11 > 개념 정리' 카테고리의 다른 글

동차 표기법 (Homogeneous)  (0) 2022.02.09
D3D11_USAGE / Resource Usage Type  (0) 2022.02.08
Vertex Shader, Pixel Shader, Rasterizer  (0) 2022.02.07

+ Recent posts