다음을 통해 공유


스레드 동기화 및 TDR

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

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

하드웨어 시간 제한이 발생하면 시스템에서 시간 제한 검색 및 복구(TDR) 프로세스를 시작합니다. GPU 스케줄러는 드라이버의 DxgkDdiResetFromTimeout 함수를 호출하여 GPU를 다시 설정합니다.

  • DxgkDdiResetFromTimeout런타임 전원 관리 함수 가운데DxgkDdiSetPowerComponentFStateDxgkDdiPowerRuntimeControlRequest을 제외한 다른 KMD 함수와 동기적으로 호출됩니다. 즉, DxgkDdiResetFromTimeout 스레드가 실행되는 동안 OS는 드라이버 내에서 다른 스레드가 실행되지 않도록 보장합니다.
  • OS는 DxgkDdiResetFromTimeout호출하는 동안 애플리케이션이 프레임 버퍼에 액세스할 수 없도록 보장합니다. 따라서 드라이버는 메모리 컨트롤러 PLL(단계 잠금 루프) 등을 다시 설정할 수 있습니다.

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

드라이버가 에서 DxgkDdiResetFromTimeout로 돌아오면, 드라이버 함수 대부분을 다시 호출할 수 있으며 OS는 더 이상 필요하지 않은 리소스를 정리하기 시작합니다. 정리 기간 동안 다음과 같은 드라이버 함수가 지정된 이유로 호출됩니다.

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

    예를 들어, 할당이 메모리 세그먼트에 페이징된 경우, 드라이버가 제거에 대해 알림을 받기 위해 드라이버의 DxgkDdiBuildPagingBuffer 함수가 호출됩니다. 이때 DXGKARG_BUILDPAGINGBUFFER 구조체의 Operation 멤버가 DXGK_OPERATION_TRANSFER로 설정되고, Transfer.Size 멤버가 0으로 설정됩니다. 다시 설정하는 동안 콘텐츠가 손실되었기 때문에 콘텐츠 전송은 관련되지 않습니다.

    할당이 조리개 세그먼트에 페이징된 경우, 드라이버의 DxgkDdiBuildPagingBuffer 함수가 호출되며, 이때 DXGKARG_BUILDPAGINGBUFFER의 Operation 멤버는 DXGK_OPERATION_UNMAP_APERTURE_SEGMENT로 설정되어, 드라이버에게 조리개에서 해당 할당을 해제하라는 명령을 전달합니다.

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

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

정리 기간이 끝난 후, OS는 드라이버의 DxgkDdiRestartFromTimeout 함수를 호출하여 드라이버에게 정리가 완료되었음을 알리고, 다시 어댑터를 이용해 렌더링을 시작합니다.