D3D12엔진 개발 – ID3D12RootSignature 생성시 ref count에 주의할것

D3D12에서는 draw를 위한 각종 파라미터를 Descriptor Table로 전달한다.
그리고 이 Descriptor Table의 형식을 정의하는 것이 ID3D12RootSignature 오브젝트이다.
ID3D12Device::CreateRootSignature()함수로 ID3D12RootSignature 객체를 생성한다.

그런데 여기서 주의할 점이 있다.

ID3D12RootSignature*	pRootSignature = NULL;
HRESULT hr = m_pD3DDevice->CreateRootSignature(nodeMask,pBlobWithRootSignature,blobLengthInBytes,IID_PPV_ARGS(&pRootSignature));

이와같이 ID3D12RootSignature 객체를 생성했을때 pRootSignature의 ref count는 1일거라고 생각하는 것이 일반적이다. 그런데 1보다 큰 숫자일 수 있다. 이 경우 pRootSignature의 어드레스를 확인해보면 이전에 생성했던 ID3D12RootSignature객체이다.
즉 D3D내부에서 ID3D12RootSignature객체를 재활용하고 있는 것이다.
CreateRootSignature()함수에 전달한 IBlob의 내용을 보고 동일한 파라미터로 판단하면 이미 할당해둔 ID3D12RootSignature객체를 찾아서 ref count를 올리고 그 객체를 리턴해준다.

resourc leak check를 위해 별도 자료구조를 이용해서 d3d resource들을 관리하고 있었는데 생성하자마 ref count가 1보다 큰 경우는 생각을 하지 않았기 때문에 꽤 당황했다.
ref count가 2인 ID3D12RootSignature객체가 이전에 할당된 객체라는 것을 확인하고나서야 모든 정황을 이해했다.
뭐 실수없이 Release()만 꼬박꼬박 호출해준다면 신경쓸 필요는 없지만 나처럼 별도 자료구조로 관리하는 이가 있다면 알고 넘어가야할 내용이다.


답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중