void DevReset() { SAFE_RELEASE(backBuf); SAFE_RELEASE(backDepthBuf); Image::AllRelease(); SAFE_RELEASE(scrDepthBuf); SAFE_RELEASE(scrBuf); SAFE_RELEASE(gameScr); g_d3dSprite->OnLostDevice(); HRESULT hr = g_d3dDev->Reset(&d3dpp); g_d3dSprite->OnResetDevice(); if (FAILED(hr)) { if (hr == D3DERR_DEVICELOST) { onDeviceLost(); } throw Error("デバイスのリセットエラー", hr); } ReadyResource(); SetRenderStates(); return; }
bool D3D9WPFRenderer::checkResize( bool isDeviceLost ) { bool isDeviceReset = false; //resize the system if the desired width or height is more than we can support. if ( mDesiredWidth > m_displayWidth || mDesiredHeight > m_displayHeight || isDeviceLost ) { m_displayWidth = PxMax( mDesiredWidth, m_displayWidth ); m_displayHeight = PxMax( mDesiredHeight, m_displayHeight ); if ( isDeviceLost ) { physx::PxU64 res = m_d3dDevice->TestCooperativeLevel(); if(res == D3D_OK || res == D3DERR_DEVICENOTRESET) //if device is lost, device has to be ready for reset { isDeviceReset = true; onDeviceLost(); onDeviceReset(); } } else { releaseSurface(); releaseDepthStencilSurface(); allocateSurface(); buildDepthStencilSurface(); // set out initial states... m_d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); m_d3dDevice->SetRenderState(D3DRS_LIGHTING, 0); m_d3dDevice->SetRenderState(D3DRS_ZENABLE, 1); } } //else just mess with the viewport so we only render pixel-by-pixel D3DVIEWPORT9 viewport = {0}; m_d3dDevice->GetViewport(&viewport); if ( viewport.Width != mDesiredWidth || viewport.Height != mDesiredHeight ) { viewport.X = 0; viewport.Y = 0; viewport.Width = (DWORD)mDesiredWidth; viewport.Height = (DWORD)mDesiredHeight; viewport.MinZ = 0.0f; viewport.MaxZ = 1.0f; m_d3dDevice->SetViewport(&viewport); } return isDeviceReset; }
void RecoverResource() { HRESULT hr = g_d3dDev->TestCooperativeLevel(); if (FAILED(hr)) { if (hr == D3DERR_DEVICELOST) { onDeviceLost(); return; } if (hr != D3DERR_DEVICENOTRESET) { throw Error("デバイスロスト時にエラー"); } devLost = false; DevReset(); } return; }
VOID MainProcess() { try { if (devLost) { RecoverResource(); return; } g_d3dDev->SetRenderTarget(0, scrBuf); g_d3dDev->SetDepthStencilSurface(scrDepthBuf); g_d3dDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0x80, 0x80, 0x80), 1.0f, 0); if (SUCCEEDED(g_d3dDev->BeginScene())) { g_d3dSprite->Begin(D3DXSPRITE_DONOTMODIFY_RENDERSTATE); { D3DXMATRIX mat; D3DXMatrixIdentity(&mat); D3DXMatrixScaling(&mat, 1.0f, 1.0f, 0.0f); g_d3dSprite->SetTransform(&mat); FrameProcess(); } g_d3dSprite->End(); g_d3dDev->EndScene(); } g_d3dDev->SetRenderTarget(0, backBuf); g_d3dDev->SetDepthStencilSurface(backDepthBuf); g_d3dDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0x40, 0x40, 0x40), 1.0f, 0); if (SUCCEEDED(g_d3dDev->BeginScene())) { g_d3dSprite->Begin(D3DXSPRITE_DONOTMODIFY_RENDERSTATE); { RECT rect = { 0, 0, Settings.screenWidth, Settings.screenHeight }; D3DXMATRIX mat; D3DXMatrixIdentity(&mat); D3DXMatrixScaling(&mat, (float)g_pixSz, (float)g_pixSz, 0.0f); g_d3dSprite->SetTransform(&mat); g_d3dSprite->Draw(gameScr, &rect, NULL, g_fullScr ? &scrPosFull : &scrPosWnd, 0xFFFFFFFF); } g_d3dSprite->End(); g_d3dDev->EndScene(); } HRESULT hr = g_d3dDev->Present(NULL, NULL, NULL, NULL); if (FAILED(hr)) { if (hr == D3DERR_DEVICELOST) { onDeviceLost(); return; } throw Error("表示エラー"); } } catch (Error e) { e.output(); DestroyWindow(hWindow); } return; }