7080 + 1

ゲームプログラミングの記事を書いてます。

IDXGIDebug::ReportLiveObjects()を使うまでの道のり その2

前回の続きです。

結論から言います。出来ました。
奮闘記を書いて教えを請う予定でしたが、出来てしまったのでやり方だけ書きます。

前回も言いましたが、このメソッドはというか、このインターフェース自体が Windows8以降じゃないと使えないとMSDNに書いてありました。

なので、まずはOSのバージョンによって分岐しておく必要があります。 俺の作ったプログラムはWindows8上でしか動かねえぜ!!というのなら不要な処理です。

バージョンの調べ方は自分の書いた記事がありますので、そちらをどうぞ。

IDXGIDebug::ReportLiveObjects()を呼び出す

if( VerifyVersionInfo( &OSver, VER_MAJORVERSION | VER_MINORVERSION, condition))
{
// Widows8.0以上なら
    if( pDxgiDebug == nullptr )
    {
        // 作成
        typedef HRESULT(__stdcall *fPtr)(const IID&, void**); 
        HMODULE hDll = GetModuleHandleW(L"dxgidebug.dll");
        fPtr DXGIGetDebugInterface = (fPtr)GetProcAddress(hDll, "DXGIGetDebugInterface"); 
 
        DXGIGetDebugInterface(__uuidof(IDXGIDebug), (void**)&pDxgiDebug);

        // 出力
        pDxgiDebug->ReportLiveObjects( DXGI_DEBUG_D3D11, DXGI_DEBUG_RLO_DETAIL);
    }
    else
        pDxgiDebug->ReportLiveObjects( DXGI_DEBUG_D3D11, DXGI_DEBUG_RLO_DETAIL);
}
else
{
    return pD3dDebug->ReportLiveDeviceObjects(D3D11_RLDO_DETAIL);
}

VerifyVersionInfo()はバージョンを調べています。if文の中が重要です。 が、はっきり言って、GetModuleHandle()あたりのところでを何しているかわかりません。コピペしたので。 関数ポインタってこんな使い方出来るんですね。

と、とにかく、これで出来ます。これだけです。
もしかしたら、リンクエラーが出ると思います。そういう時は、InitGUID.hIDXGIDebug.hよりも前にインクルードしてください。それでも駄目なら、d3d11.hよりも前にインクルードしてみてください。

これが出力結果です。ID3D11Debug::ReportLiveDeviceObjects()同様、メソッドを呼んだタイミングでのオブジェクトの状況が出力されます。 f:id:atori708:20150221191010p:plain

これでIDXGIDebug::ReportLiveObjects()によるRelease()忘れの調査が出来るようになりました。 渡している引数がDXGI_DEBUG_D3D11だと、前回の記事の出力と変化はあまりありません。 が、DXGI_DEBUG_DXGIやDXGI_DEBUG_APPなど、出力するものを変えることが出来ます。

以外と知られていないと思いますが、デバッグには必要な物だと思います。 実装してみてはいかがでしょうか。