DirectX Graphics 프로그래밍 가이드 Direct3D 의 기초지식 장치 장치의 손실   [목차열람] [주소복사] [슬롯비우기]
장치의 손실
 
Microsoft DirectX 9.0

장치의 손실


Microsoft® Direct3D® 장치 상태에는, 처리 가능 상태와 손실 상태가 있다. 처리 가능 상태는 장치의 보통 상태이며, 모든 렌더링이 예측대로 실행되고 표시된다. 풀 스크린 애플리케이션으로 키보드 포커스가 손실하는 등의 이벤트가 발생해 렌더링 할 수 없게 되면 장치는 손실 상태가 된다. 손실 상태의 특성은, 표면적으로는 아무것도 나타나지 않고 모든 렌더링 처리가 실패하는 것이다. 즉, 렌더링 처리는 실패하고 있는데, 렌더링 메서드는 성공 코드를 돌려주는 일이 있다. 이러한 경우,IDirect3DDevice9::Present 에 의해 에러 코드 D3DERR_DEVICELOST 가 반환된다.

설계에서는, 장치가 손실하는 것 같은 모든 시나리오가 상정되고 있는 것은 아니다. 일반적인 예로서는, 사용자가 Alt + Tab 키를 눌렀을 때 등, 즉 시스템 다이얼로그가 초기화되었을 때에 포커스가 손실한다. 또, 전력 관리 이벤트에 의해, 또는 다른 애플리케이션이 풀 스크린 처리를 실시할 때도 장치가 손실하는 일이 있다. 게다가IDirect3DDevice9::Reset 가 실패 하면, 장치는 손실 상태가 된다.

IUnknown 로부터 파생하는 모든 메서드는, 장치가 손실한 후도 동작하는 것이 보증되고 있다. 장치 손실 후, 각 기능에는 보통 3 개의 옵션이 있다.

장치 손실에의 응답

손실한 장치는, 리셋 후에 리소스 (비디오 메모리 리소스를 포함한다)를 재생성 할 필요가 있다. 장치가 손실 하면, 애플리케이션은 그 장치에 대해서, 처리 가능 상태에 복원할 수 있을지 어떨지를 문의한다. 복원할 수 없는 경우는, 장치를 복원할 수 없을지 애플리케이션은 대기한다.

복원할 수 있는 경우, 애플리케이션은 모든 비디오 메모리 리소스와 스왑 체인을 파기해, 장치의 복원에 대비한다. 다음에, 애플리케이션은 IDirect3DDevice9::Reset 메서드를 호출한다. Reset 는, 장치가 손실 상태 때에 유효한 유일한 메서드이며, 애플리케이션이 장치를 손실 상태로부터 처리 가능 상태에 되돌릴 수가 있는 유일한 메서드이다. IDirect3DDevice9::CreateRenderTarget 메서드나 IDirect3DDevice9::CreateDepthStencilSurface 메서드로 생성 된 리소스 등, D3DPOOL_DEFAULT 로 할당할 수 있던 모든 리소스를 애플리케이션이 릴리즈 하지 않는 한,IDirect3DDevice9::Reset 는 실패한다.

대부분의 경우, Direct3D 를 빈번하게 호출해도 장치가 손실하고 있을지 어떨지에 관한 정보는 돌아가지 않는다. 애플리케이션은, 손실한 장치의 통지를 받지 않아도,IDirect3DDevice9::DrawPrimitive 등의 렌더링 메서드의 호출을 속행할 수 있다. 내부적으로는, 이러한 처리는, 장치가 처리 가능 상태에 리셋 될 때까지 파기된다.

애플리케이션은, 장치가 손실했을 때의 처리를 판정하기 위해서 IDirect3DDevice9::TestCooperativeLevel 메서드의 반환값을 조회한다.

잠금 처리

내부적으로는, Direct3D 에서는 장치가 손실해도 잠금 처리는 성공하도록(듯이) 기능한다. 그러나, 잠금 처리시에는 비디오 메모리 리소스의 데이터가 정확한가 어떤가는 보증되지 않는다. 에러 코드가 돌아가지 않는 것은 보증되고 있다. 따라서, 애플리케이션의 기술해서는, 잠금 처리시의 장치의 손실에 대해서는 고려하지 않아 좋다.

리소스

리소스는 비디오 메모리를 소비한다. 손실한 장치는, 어댑터가 소유하는 비디오 메모리로부터 접속 해제되기 (위해)때문에, 장치가 손실했을 때의 비디오 메모리의 할당을 보증할 수 없다. 그 때문에, 모든 리소스 생성 메서드는, D3D_OK 가 돌아가면 성공하지만 실제로는 더미의 시스템 메모리만을 할당하도록(듯이) 처리 되고 있다. 모든 비디오 메모리 리소스는, 사이즈 변경하기 전에 장치를 파기할 필요가 있기 (위해)때문에, 비디오 메모리의 과잉 할당은 발생하지 않는다. 이러한 더미 표면에 의해, 애플리케이션이 IDirect3DDevice9::Present 를 호출해 장치의 손실을 검출할 때까지, 잠금 처리나 복사 처리가 정상적으로 기능하고 있는 것처럼 보인다.

드라이버가 손실 상태로부터 처리 가능 상태에 복원하기 전에, 모든 비디오 메모리를 릴리즈 해야 한다. 즉, 애플리케이션은 IDirect3DDevice9::CreateAdditionalSwapChain 에 의해 생성 된 모든 스왑 체인이나 D3DPOOL_DEFAULT 메모리 클래스에 배치 떠날 수 있어 모든 리소스를 릴리즈 해야 한다. 애플리케이션은, D3DPOOL_MANAGED 메모리 클래스나 D3DPOOL_SYSTEMMEM 메모리 클래스에 배치되고 있는 리소스는 릴리즈 할 필요가 없다. 다른 상태 데이터는, 처리 가능 상태에의 처리에 의해 자동적으로 파기된다.

애플리케이션의 개발해서는, 장치의 손실에 대해서 1 개의 코드 패스로 대응하는 것을 추천 한다. 이 코드 패스는, 스타트 업시에 장치의 초기화에 사용한 코드 패스와 동일하지 않아도 유사한 것으로 하는 것.

데이터의 취득

Direct3D 에서는,IDirect3DDevice9::ValidateDevice 를 사용해, 하드웨어에 의한 싱글 패스 렌더링에 비추어 텍스처 스테이트 및 렌더링 스테이트를 검증할 수 있다. 이 메서드는, 보통은 애플리케이션의 초기화시에 불려 가 장치가 손실하고 있는 경우는 D3DERR_DEVICELOST 를 돌려준다.

Direct3D 에 의해 애플리케이션은, 생성된 화면 (또는 이전에 그려진 화면)을, 비디오 메모리 리소스로부터 불휘발성의 시스템 메모리 리소스에 복사 할 수 있다. 이러한 전송에서는 전송원화면은 언제라도 없어질 가능성이 있기 (위해)때문에, Direct3D 가, 장치가 손실했을 때는 복사 처리를 실패시키는 경우가 있다.

비동기 문의에 관해서는,IDirect3DQuery9::GetData 가 S_OK 를 돌려주지 않는 것을 애플리케이션에 나타내기 위해서(때문에), FLUSH 플래그가 지정되고 있는 경우는 IDirect3DQuery9::GetData 는 D3DERR_DEVICELOST 를 돌려준다.

장치를 손실 하면 1차 표면은 존재하지 않기 때문에, 복사 처리인 IDirect3DDevice9::GetFrontBufferData 는 D3DERR_DEVICELOST 로 실패한다. 장치가 손실 하면 백 버퍼를 생성 할 수 없기 때문에,IDirect3DDevice9::CreateAdditionalSwapChain 도 D3DERR_DEVICELOST 로 실패한다. 이러한 케이스는,IDirect3DDevice9::Present ,IDirect3DDevice9::TestCooperativeLevel ,IDirect3DDevice9::Reset 메서드 이외로 D3DERR_DEVICELOST 를 사용하는 유일한 예외인 것에 주의 해야 한다.

프로그래밍 가능한 셰이더

Microsoft DirectX® 9.0 에서는,정점 셰이더 1_1픽셀 셰이더 1_XReset 후에 재생성 할 필요는 없다. 이것들은 기억되고 있다. DirectX 의 이전의 버전에서는, 손실한 서비스에 대해서는 셰이더를 재생성 할 필요가 있었다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP