示例#1
0
	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;
	}
示例#3
0
	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;
	}
示例#4
0
	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;
	}