COM 인터페이스 : DirectX

개발하는 곰댕이·2023년 3월 14일
0

DirectX

목록 보기
2/8

COM은 DirectX의 프로그래밍 언어 독립성과 하위 호환성을 도와주는 인터페이스이며 Direct3D12 인터페이스를 조금 더 편하게 사용하고, 관리할 수 있게 만들어준다.

간단하게 기억해야 할 부분은 COM인터페이스를 사용할 때는 Comptr _device처럼 Comptr을 이용해서 사용하며 COM인터페이스를 사용하는 Direct3D12 인터페이스는 앞에 I 가 붙는다.
이렇게 만들어진 COM 객체는 스마트 포인터처럼 참조 횟수가 0이되면 자동으로 메모리에서 해제가 되게 된다.

만약 Comptr을 사용하지 않고 객체를 만든다면 한 가지 기억해둬야 할 부분이 있다. 이 COM 객체는 C++처럼 Delete로 메모리를 해제하지 않고 Release라는 메서드를 통해서 메모리를 해제해야 한다.

그리고 이 COM 인터페이스를 통해서 만들어진 객체들을 사용하는 메서드들은 보통 COM 인터페이스의 ID인 riid해당 객체를 void**의 형태로 변환한 것을 인자로 받는데 IID_PPV_ARGS 매크로를 이용하면 해당 부분을 쉽게 해결할 수 있다.

HRESULT D3D12CreateDevice(
  [in, optional]  IUnknown          *pAdapter,
                  D3D_FEATURE_LEVEL MinimumFeatureLevel,
  [in]            REFIID            riid,
  [out, optional] void              **ppDevice
);

위 함수는 D3D12 인터페이스의 기본이 되는 Device 객체를 생성하는 함수인데 3, 4번째 매개변수를 보면 riid와 void** 형태의 Device를 받는 걸 볼 수 있다.
여기서 IID_PPV_ARGS 매크로를 사용하면 다음과 같이 사용할 수 있다.

Comptr<ID3D12Device> _device;
  
::D3D12CreateDevice(nullptr, 0, IID_PPV_ARGS(&_device));

이 매크로는 다음과 같이 정의되어 있다.

#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)

IID_PPV_ARGS_Helper함수는 해당 객체를 void**의 형태로 캐스팅 해준다.

0개의 댓글