#define D3D_DEBUG_INFO

1 minute read

Debugging시 Watch창으로 내부 변수들을 볼 수 있다. 위의 그림은 IDirect3DDevice9를 Watch창으로 본 화면. 어휴! 역시 DirectX 새로운 SDK 나오면 무조건 Document부터 다 훑어봐야 한다. 발견한 지 일주일이 안 됐지만 그전부터 사용 가능한듯하다.

#ifdef D3D_DEBUG_INFO
#define D3D_SDK_VERSION   (32 | 0x80000000)
#define D3D9b_SDK_VERSION (31 | 0x80000000)

#else
#define D3D_SDK_VERSION   32
#define D3D9b_SDK_VERSION 31
#endif

Direct3DCreate9 함수에서 IDirect3D9 object를 생성할때 사용하는 D3D_SDK_VERSION 값이 달라진다.

DECLARE_INTERFACE_(IDirect3DDevice9, IUnknown)
{
    ...
#ifdef D3D_DEBUG_INFO
    D3DDEVICE_CREATION_PARAMETERS CreationParameters;
    D3DPRESENT_PARAMETERS PresentParameters;
    D3DDISPLAYMODE DisplayMode;
    D3DCAPS9 Caps;

    UINT AvailableTextureMem;
    UINT SwapChains;
    UINT Textures;
    UINT VertexBuffers;
    UINT IndexBuffers;
    UINT VertexShaders;
    UINT PixelShaders;

    D3DVIEWPORT9 Viewport;
    D3DMATRIX ProjectionMatrix;
    D3DMATRIX ViewMatrix;
    D3DMATRIX WorldMatrix;
    D3DMATRIX TextureMatrices[8];

    DWORD FVF;
    UINT VertexSize;
    DWORD VertexShaderVersion;
    DWORD PixelShaderVersion;
    BOOL SoftwareVertexProcessing;

    D3DMATERIAL9 Material;
    D3DLIGHT9 Lights[16];
    BOOL LightsEnabled[16];

    D3DGAMMARAMP GammaRamp;
    RECT ScissorRect;
    BOOL DialogBoxMode;
#endif
}

interface만을 노출해서 내부 변수들은 원래 볼 수가 없다. Watch창에 보이는 건 가상함수 테이블 뿐~. interface에 변수들을 선언하고 implementation class에서 interface에서 노출한 전체 변수 크기만큼 할당해 변수 값을 집어넣었다. interface는 사용자가 수정할 수도 있기 때문에 위험하게 interface에 노출된 변수에 직접 실제 변수 포인터를 대입하지 않았다. 이건 interface에 노출된 변수들을 삭제해 보거나 변수들의 선언 순서를 바꿔서 테스트한 결과 알게 됐다.

한 사람만 이렇게 고생해주면 모두가 행복해진다. 아마 신입이 했을 듯…

출처 : Enabling Direct3D Debug Information (Direct3D 9) - MSDN