Device Lost는 DirectX를 개발하면 반드시 거쳐야하는 관문 중 하나이다. (OpenGL도 Device Lost가 있겠지... ?)
Device Lost란 쉽게 말하면 시스템의 리소스를 모두 잃어버려서 사용할 수 없게 되어버린 상태이다.
Device Lost가 발생하게 되는 이유는 Alt+Tab, 실시간 화면 크기 변경, 그래픽 카드가 죽어버리는 현상등 다양한 이유가 있다.
DirectX 11 에서는 디바이스 로스트가 거의 일어나지 않지만, 몇가지 예외적 상황에서는 디바이스 로스트가 일어난다.
예를들어 GPU가 Hang Up 상태가 되어 장시간 응답이 없을 경우 OS의 타임 아웃처리가 발동하여 GPU가 리셋 된다.
이경우에도 OS의 재부팅은 필요없지만 어플리케이션측에서 만든 DirectX 11 디바이스 나 오브젝트등은 모두 파기하고
새로이 만들어야 한다.
디바이스 로스트가 일어났는지는 ID3D11Device::GetDeivceRemovedReason() 함수를 호출하여 조사 할 수 있다.
반환값이 S_OK가 아닌 경우 몇가지 이유로인해 디바이스 로스트가 발생한다
- DXGI_ERROR_DEVICE_HUNG : 어플리케이션에서 보낸 잘못된 형식의 명령으로 인해 디바이스가 실패했다.
- DXGI_ERROR_DEVICE_RESET : 잘못된 형식의 명령으로 인해 디바이스가 실패했다. 디바이스가 커맨드 실행에 타당하지 않은 시간을 필요로하고있는 하드웨어 크래시/행 상태이다
- DXGI_ERROR_DEVICE_REMOVED : 그래픽스 아답터(비디오 카드)의 플러그&플레이가 정지되었다. 아답터가 이용불능 상태일 가능성이 높음
- DXGI_ERROR_DRIVER_INTERVAL_ERROR : 드라이버가 정의되지 않은 오퍼레이션을 수행했다
- DXGI_ERROR_INVALID_CALL : 어플리케이션이 유효하지 않은 파라미터를 제공했다.
DXGI_ERROR_DEVICE_HUNG , DXGI_ERROR_DEVICE_RESET 일 경우에는 DirectX 11 디바이스나
오브젝트를 재생성함으로 복구할수 도 있다
DXGI_ERROR_DEVICE_REMOVED , DXGI_ERROR_INVALID_CALL 는 어플리케이션측에서 어쩔수없는 부분이다
BOOL CheckDeviceLost() {HRESULT hr; hr = g_pd3dDevice->GetDeviceRemovedReason(); //디바이스 로스트가 일어났는지 조사 switch(hr) { case S_OK : //정상 break; case DXGI_ERROR_DEVICE_HUNG: case DXGI_ERROR_DEVICE_RESET: CleanupDevice(); // device Release InitDevice(); // device Init if(FAILED(hr)) return FALSE; //실패. 어플리케이션 종료 break; case DXGI_ERROR_DEVICE_REMOVED: case DXGI_ERROR_DRIVER_INTERNAL_ERROR: case DXGI_ERROR_INVALID_CALL: default: return FALSE; //실패. 어플리케이션 종료 } return TRUE; } |
더 자세한 부분은 MSDN을 참조하길..
http://msdn.microsoft.com/en-us/library/windows/desktop/bb509553(v=vs.85).aspx
'Visualization Programming > DirectX11' 카테고리의 다른 글
DirectX11 - Windows 7이상 부터는 DXSDK_Jun10을 설치 하지 않아도 된다 (0) | 2016.11.29 |
---|---|
DirectX11 - D3DX11CreateShaderResourceViewFromMemory()에서 E_INVALIDARG 발생. (0) | 2016.11.22 |
DirectX11 - OMSetRenderTargets() 사용시 주의사항 (0) | 2016.10.06 |
DirectX11 - Deferred Context Memory Leak (0) | 2016.06.30 |
DirectX11 - UpdateSubResource(), Map() ~ Unmap(), CopyResource(), CopySubresourceRegion()의 팁 (0) | 2016.04.15 |