공부중

[DirectX12]Hello Wolrd Sample - D3D12HelloWindow - 3 본문

Programing/DirectX

[DirectX12]Hello Wolrd Sample - D3D12HelloWindow - 3

곤란 2018. 4. 7. 22:44
반응형

 

        UINT dxgiFactoryFlags = 0;

#if defined(_DEBUG)
	// 디버그 레이어를 활성화합니다 (그래픽 도구의 "선택적 기능"필요).
        // 참고 : 장치 생성 후 디버그 레이어를 활성화하면 활성 장치가 무효화됩니다.
	{
		ComPtr<ID3D12Debug> debugController;
		if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController))))
		{
			debugController->EnableDebugLayer();

			// 추가 디버그 레이어를 사용합니다.
			dxgiFactoryFlags |= DXGI_CREATE_FACTORY_DEBUG;
		}
	}
#endif

#if defined를 가지고 디버그(_DEBUG)모드에서  #endif 까지의 코드를 실행하도록 하였다.

디버그 레이어를 활성화 한다고 한다.

먼저 제일 보이는것이 ComPtr인데 COM(Component Object Model)은 DirectX의 프로그래밍언어 독립성과 하위호환성을 가능하게하는 기술이다.

음 뭔소린지는 자세히 모르겠지만 아 그런거구나 하고 넘어가야겠다 (무책임)

 

아무튼 COM객체는 흔히 COM 인터페이스라고 부르고 COM인터페이스를 C++의 new로 직접 생성하거나 delete로 삭제하는것이 아닌

그 인터페이스의 Release메소드를 호출해 주어야 한다.

COM객체의 수명 관리를 돕기 위해서 Windows 런타임 라이브러리(Windows Runtime Library, WRL)는 

Mircosoft::WRL::ComPtr이라는 클래스를 제공한다. (#include <wrl.h>)

저 ComPtr은 스마트 포인터이며 자동으로 Release를 호출해준다.

ComPtr을 보면 아래와 같다.

template <typename T>
class ComPtr
{
public:
    typedef T InterfaceType;

protected:
    InterfaceType *ptr_;
    template<class U> friend class ComPtr;

    void InternalAddRef() const throw()
    {
        if (ptr_ != nullptr)
        {
            ptr_->AddRef();
        }
    }

    unsigned long InternalRelease() throw()
    {
        unsigned long ref = 0;
        T* temp = ptr_;

        if (temp != nullptr)
        {
            ptr_ = nullptr;
            ref = temp->Release();
        }

        return ref;
    }

//생략...

레퍼런스카운팅 방식의 스마트 포인터 이며 Release( ) 를 호출하는걸 볼 수 있다.

 

ComPtr에 대해서 이정도 설명하고 내용을 보면 읽히는 대로 이해를 하면 될 것 같다.

 

중간에 IID_PPV_ARGS 라는 매크로 함수가 보이는데 아래와 같이 되어있다.

 

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

__uuidof 연산자 : 식에 연결된 GUID(Globally Unique IDentifier)를 검색합니다. 자세한것은 구글링을 해보도록하자

 

IID_PPV_ARGS_Helper는 인터페이스 타입인지 체크후 레퍼런스 return

template
void** IID_PPV_ARGS_Helper(_Inout_ ::Microsoft::WRL::Details::ComPtrRef pp) throw()
{
    static_assert(__is_base_of(IUnknown, typename T::InterfaceType), "T has to derive from IUnknown");
    return pp;
}

이런것들까지 머리속에 넣을 필요는 없고 전달인자에 저렇게 변환해서(매크로함수니까 컴파일시 변환)

많이 쓰인다는것을 알고 기억해두자.

 

아무튼 이 디버그 레이어가 어떻게 쓰이는지는 모르지만 아래와 같이 그냥 일단 받아들이는 형식으로 ....

 

ComPtr로 ID3D12Debug형의 변수를 만들어 두고

D3D12GetDebugInterface 함수를 통해서 디버그인터페이스를 받아오고 디버그 레이어를 활성화 시키고

위에서 UINT형으로 생성한 Flag 변수에 DXGI_CREATE_FACTORY_DEBUG를 추가해 주는것으로 끝.

 

다음글로!

 

 

 

 

반응형