いつもお世話になっています。
Direct3D 11使用時、初期化に失敗すると強制終了する症状が発生したので報告させていただきます。
症状
Direct3D 11使用時、IDXGIOutputの取得に失敗する環境で強制終了が発生する
DXライブラリのバージョン
2016年8月30日01時14分現在での DxLibMakeTest.exe をコンパイルしたライブラリでも発生することを確認
原因
IDXGIOutputの取得に失敗した場合、DxGraphicsD3D11.cppのGraphics_D3D11_Terminate()で呼び出されているMV1TerminateVertexBufferAll()の内部で
強制終了が発生していた。
(具体的には
MV1TerminateVertexBufferAll() -> Graphics_Hardware_RenderVertex() ->
Graphics_D3D11_RenderVertex() -> D3D11DeviceContext_Map_ASync() -> D3D11DeviceContext_Map()
)
DxGraphicsD3D11.cppのGraphics_D3D11_OutputWindow_Add()内
Result = DXGISwapChain_GetContainingOutput( OWI->DXGISwapChain, &OWI->DXGIOutput ) ;
でデバッガなどを使いResultの値をS_OK以外の値に変更すれば再現します。
解決策
Direct3D 11の初期化が失敗したにもかかわらずMV1TerminateVertexBufferAll()を呼びだそうとしたのが原因とみて以下の様な修正を加えたところ、
強制終了は発生しなくなりDirect3D 9Exへのフォールバックが動くようになった。
DxGraphicsD3D11.cpp Graphics_D3D11_Terminate()内
// モデルの頂点バッファを解放
MV1TerminateVertexBufferAll() ;
↓
if (GSYS.Setting.ValidHardware)
{
// モデルの頂点バッファを解放
MV1TerminateVertexBufferAll() ;
}
以上です。
よろしければ修正をお願いします。