DirectX 8にて解説を行っているサイトでは、単純にReset()を呼べば良いと書かれているが、どうも上手くいかないので色々調べてみたところ、どうやら「ロストしたデバイスをリセットできない状態」というタイミングが存在するらしく、適切な関数でリセットできる状態かどうかを調べる必要があるらしい。以下にその手順を示す
if(DeviceLost){
if(FAILED(hr = pDevice->TestCooperativeLevel())){
if(hr == D3DERR_DEVICENOTRESET){
//デバイスのリセットを行う処理を書く。具体的には
//pDevice->Reset(&d3dpp)
//を呼び出してリセットを行うが、当然d3dppはDirect3Dを
//初期化するときに記述した形でもう一度記述を行う。
}
}else{
DeviceLost = false;
}
}else{
if(FAILED(pDevice->Present( NULL, NULL, NULL, NULL ))){
DeviceLost = true;
}
}まず、ロストするとPresent()が失敗するので、それをチェックする。次にTestCooperativeLevel()でデバイスをリセットできるかどうか確認を行う。もしTestCooperativeLevel()の戻り値がD3DERR_DEVICENOTRESETであれば、ロストしたデバイスの復旧が可能となり、Reset()が可能となる。