스레드 동기화 및 TDR

다음 그림에서는 WDDM(Windows 디스플레이 드라이버 모델)의 디스플레이 미니포트 드라이버에 대해 스레드 동기화가 작동하는 방식을 보여 줍니다.

WDDM의 스레드 동기화를 보여 주는 다이어그램

하드웨어 시간 제한이 발생하면 TDR(시간 제한 검색 및 복구) 프로세스가 시작됩니다. GPU 스케줄러는 GPU를 다시 설정하는 드라이버의 DxgkDdiResetFromTimeout 함수를 호출합니다. DxgkDdiResetFromTimeout 은 런타임 전원 관리 함수 DxgkDdiSetPowerComponentFStateDxgkDdiPowerRuntimeControlRequest를 제외하고 다른 디스플레이 미니포트 드라이버 함수와 동기적으로 호출됩니다. 즉, DxgkDdiResetFromTimeout 스레드가 실행되는 동안 드라이버에서 다른 스레드가 실행되지 않습니다. 또한 운영 체제는 DxgkDdiResetFromTimeout을 호출하는 동안 애플리케이션에서 프레임 버퍼에 대한 액세스가 발생하지 않도록 보장합니다. 따라서 드라이버는 메모리 컨트롤러 PLL(단계 잠금 루프) 등을 다시 설정할 수 있습니다.

복구 스레드가 DxgkDdiResetFromTimeout을 실행하는 동안 인터럽트 및 DPC(지연 프로시저 호출)를 계속 호출할 수 있습니다. KeSynchronizeExecution 함수를 사용하여 초기화 프로시저의 일부를 디바이스 인터럽트와 동기화할 수 있습니다.

드라이버가 DxgkDdiResetFromTimeout에서 반환되면 대부분의 드라이버 함수를 다시 호출할 수 있으며 운영 체제는 더 이상 필요하지 않은 리소스를 클린 시작합니다. 정리 기간 동안 다음과 같은 드라이버 함수가 지정된 이유로 호출됩니다.

  • 제거되는 할당에 대해 알리기 위해 드라이버가 호출됩니다.

    예를 들어 할당이 메모리 세그먼트에서 페이징된 경우 드라이버의 DxgkDdiBuildPagingBuffer 함수는 DXGKARG_BUILDPAGINGBUFFER 구조체의 Operation 멤버를 DXGK_OPERATION_TRANSFER 로 설정하고 Transfer.Size 멤버를 0으로 설정하여 드라이버에 제거에 대해 알립니다. 초기화 중에 콘텐츠가 손실되었기 때문에 콘텐츠 전송이 관련되지 않습니다.

    할당이 조리개 세그먼트에서 페이징된 경우 드라이버의 DxgkDdiBuildPagingBuffer 함수는 DXGKARG_BUILDPAGINGBUFFER Operation 멤버를 DXGK_OPERATION_UNMAP_APERTURE_SEGMENT 설정하여 드라이버가 조리개에서 할당의 매핑을 해제하도록 알리도록 설정하여 호출됩니다.

  • 드라이버의 DxgkDdiReleaseSwizzlingRange 함수가 호출되어 언스위즐링 조리개 및 세그먼트 조리개 범위를 해제합니다.

절대적으로 필요한 경우가 아니면 드라이버는 이전 호출 중에 GPU에 액세스해서는 안 됩니다.

정리 기간이 끝나면 운영 체제는 드라이버의 DxgkDdiRestartFromTimeout 함수를 호출하여 정리가 완료되었으며 렌더링을 위해 어댑터를 사용하여 운영 체제가 다시 시작된다는 것을 드라이버에 알릴 수 있습니다.