다음을 통해 공유


EvtIddCxMonitorAssignSwapChain 오류 처리

EvtIddCxMonitorAssignSwapChain 오류 처리 변경

버전 1903 이전의 Windows 10 릴리스에서는 EvtIddCxMonitorAssignSwapChain이 실패한 경우 데스크톱 컴퍼지션의 나머지 부분을 인식하지 못했습니다. 간접 디스플레이 어댑터가 처리하지 않은 프레임을 계속 렌더링하고 표시하여 IddCx가 잠시 후 IDD(간접 디스플레이 드라이버)를 종료했습니다.

Windows 10 버전 1903(IddCx 1.4)부터 이 콜백에 대한 IddCx 오류 처리가 모든 드라이버 버전에 대해 변경되었으며 STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN 상태 코드가 도입되었습니다. 자세한 내용은 EvtIddCxMonitorAssignSwapChain을 참조하세요.

프레임 처리 루프 스레드에서 오류 처리

IDD가 EvtIddCxMonitorAssignSwapChain에서 성공적으로 반환되면 hSwapChain 개체를 소유합니다. 드라이버에서 프레임을 계속 처리하지 못하는 오류가 발생하면 WdfObjectDelete를 호출하여 소유권을 해제할 수 있습니다. OS는 삭제를 검색하고 새 스왑 체인을 만듭니다.

드라이버가 이 오류에서 복구할 수 없다는 것을 알고 있는 경우 IddCxReportCriticalError를 호출하여 디바이스를 중지해야 합니다.

스왑 체인 오류를 처리하는 제안된 방법

EvtIddCxMonitorAssignSwapChain 콜백 내에서 또는 프레임을 처리하는 동안 실패하는 몇 가지 이유가 있습니다. 오류 분류는 다음과 같습니다.

  • 하드웨어에 대한 일시적인 문제와 같이 솔루션과 관련된 일시적인 문제입니다. 이러한 유형의 문제는 복구가 빠르게 수행되고(일반적으로 1초 미만) 화면의 시각적 콘텐츠에 영향을 주지 않기 때문에 사용자 환경에 영향을 주지 않는 간단한 복구 메커니즘으로 해결할 수 있습니다(예: 깜박임 없음).
  • 드라이버의 교착 상태 또는 하드웨어와 관련된 심각한 문제와 같이 솔루션과 관련된 영구적인 문제입니다. 이러한 유형의 문제는 일반적으로 전혀 복구할 수 없는 경우 신속하게 복구할 수 없습니다.
  • 드라이버 외부의 이벤트로 인해 발생하는 DirectX API 오류입니다. 예를 들어 드라이버는 D3D 디바이스가 데스크톱 이미지를 처리할 어댑터가 PnpStopped되었거나 GPU 차원의 오류가 있고 다시 설정되는 경우와 같은 이벤트를 제어할 수 없습니다.
  • 드라이버로 인한 DirectX API 오류입니다. 드라이버 버그로 인해 D3D 디바이스가 오류 또는 중단될 수 있습니다. 예를 들어 텍스처의 경계를 벗어난 요형을 사용하여 CopySubResource를 호출하면 디바이스가 오류 상태가 됩니다.
  • 다른 IHV GPU 드라이버로 인한 DirectX API 오류입니다. 이러한 오류는 IHV GPU 드라이버 버그를 트리거하는 IDD의 올바른 호출 패턴의 결과일 수 있습니다.

드라이버가 서로 다른 DirectX 오류를 정확하게 구분하기는 어렵습니다. 기본 차이점은 외부 DirectX 구성 요소로 인한 오류가 일시적일 가능성이 높고 시스템이 안정적인 상태로 복구된다는 점입니다. 반면 간접 디스플레이 또는 GPU 드라이버로 인해 오류가 발생하면 버그가 다시 발생할 수 있습니다.

OS가 다시 시도하도록 이러한 오류를 OS로 다시 전파하는 방법에 대한 자세한 내용은 EvtIddCxMonitorAssignSwapChain을 참조하세요.

다음은 드라이버의 각 오류 유형을 처리하는 방법에 대한 몇 가지 지침입니다.

솔루션과 관련된 일시적인 문제

드라이버는 프레임을 처리하는 동안 문제를 해결해야 합니다. 이 작업을 수행하면 프레임 처리가 약간 지연될 수 있습니다. 오류가 정기적으로 발생하는 경우 드라이버는 오류를 영구 문제에 선점하는 것을 고려할 수 있습니다.

솔루션과 관련된 영구적인 문제

드라이버는 0x100 이상에 해당하는 주 코드를 사용하고 고유한 주/부 코드를 사용하여 IddCxReportCriticalError를 호출하여 고객/원격 분석 조사에 도움이 되는 오류 유형을 나타내야 합니다.

DirectX 오류

DirectX 오류를 처리하는 가장 간단한 방법은 다시 시도하도록 OS로 다시 전파하는 것입니다. 드라이버는 EvtIddCxMonitorAssignSwapChain에서 STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN 반환하거나, 프레임을 처리하는 동안 오류가 발생하면 드라이버가 WdfObjectDelete를 호출하여 스왑 체인을 해제해야 합니다.

이 간단한 방법은 OS가 안정화되고 새 Dxgi 어댑터에서 새 스왑 체인을 만들기 때문에 외부 이벤트에 의해 트리거되는 오류를 처리합니다. 드라이버의 DirectX 사용이 제한된 경우 이 방법이 잘 작동합니다.

IDD의 버그 또는 이전/버그가 있는 DirectX 드라이버에서 실행되는 드라이버로 인해 DirectX 오류가 발생할 수 있는 더 복잡한 드라이버의 경우 이 방법은 ID 스왑 체인 오류의 끝없는 루프로 끝날 수 있습니다. 무한 루프를 방지하기 위해 IDD는 이러한 오류의 빈도를 모니터링하고 지정된 단계가 충분한 오류 주기에 도달한 경우 복구 단계를 통해 이동할 수 있습니다. DirectX 오류가 발생하면 DX 디바이스가 오류 상태에 있으면 복구되지 않으며 다시 만들어야 하므로 드라이버에서 해당 DX 디바이스를 삭제하고 새 디바이스를 만드는 것이 중요합니다.

현재 단계 너무 많은 연속 스왑 체인 DirectX 오류를 감지하는 경우 드라이버 작업
EvtIddCxMonitorAssignSwapChain제공된 렌더링 어댑터 LUID는 하드웨어 어댑터입니다. Dxgi를 사용하여 소프트웨어 어댑터의 LUID를 찾고 IddCxAdapterSetRenderAdapter를 호출하여 OS가 데스크톱 렌더링에 소프트웨어 어댑터를 사용하도록 요청합니다.
EvtIddCxMonitorAssignSwapChain제공된 렌더링 어댑터 LUID는 소프트웨어 어댑터입니다. 드라이버는 0x100 이상의 주 코드를 사용하고 고유한 주/부 코드를 사용하여 IddCxReportCriticalError를 호출하여 고객/원격 분석 조사에 도움이 되는 오류 유형을 나타내야 합니다.

예를 들어 드라이버는 EvtIddCxMonitorAssignSwapChain에서 5회 연속 DirectX 오류를 고려하거나, 위의 표에서 현재 단계에 대한 복구 작업을 수행하는 조건으로 1분 동안 프레임을 처리하는 동안 5개의 오류를 고려할 수 있습니다.