KMD와 백업 저장소 공유

WDDM 3.1(Windows 11 버전 22H2)부터 WDDM은 커널 모드 드라이버(KMD)의 그래픽 할당 백업 저장소에 액세스할 수 있도록 확장되었습니다. 백업 저장소는 비디오 메모리에 상주하지 않을 때 그래픽 할당의 콘텐츠를 보유하는 커밋된 메모리 버퍼를 나타냅니다.

이 기능을 사용하면 UMD(사용자 모드 드라이버)와 KMD 모두 동일한 할당 메모리에 액세스할 수 있습니다. 이 기능은 GPU-PV(GPU 매개 변수화)를 사용하여 호스트 또는 가상 머신에서 UMD를 실행할 때 사용할 수 있습니다.

이 기능은 Windows 10 버전 20H1로 다시 이식되었습니다. DDI는 WDDM 3.1 드라이버 이상에서 사용할 수 있습니다.

WDDM 그래픽 할당 및 백업 저장소

WDDM 모델의 모든 그래픽 할당에는 백업 저장소가 있습니다. 그래픽 할당은 UMD가 Dxgkrnl의 D3DKMTCreateAllocation 함수를 호출할 때 생성됩니다. UMD는 Dxgkrnl이 DxgkddiCreateAllocation에 대한 호출을 통해 KMD에 전달하는 이 할당에 대한 프라이빗 데이터를 전달합니다. KMD는 Dxgkrnl에 원하는 할당 플래그를 반환합니다.

기능 가용성 확인

백업 저장소 공유 기능을 사용할 수 있는지 확인하려면 KMD는 먼저 FeatureId가 DXGK_FEATURE_SHARE_BACKING_STORE_WITH_KMD 설정하여 다음 콜백 중 하나를 호출해야 합니다.

이 기능은 콜백이 성공하고 Enable 이 TRUE로 설정된 경우에만 사용할 수 있습니다.

기능 흐름

KMD에서 기능이 사용하도록 설정된 것으로 확인되면 UMD는 D3DKMTCreateAllocation을 호출하여 공유 CPU 표시 할당을 만들고 개인 데이터를 통해 KMD에 할당을 KMD와 공유하도록 지시합니다. 이 호출 과정에서 다음이 발생합니다.

  • KMD는 OS가 KMD의 DxgkddiCreateAllocation 콜백을 호출할 때 DXGK_ALLOCATIONINFOFLAGS2 ShareBackingStoreWithKmd 플래그를 설정합니다. 이 기능을 사용하도록 설정하지 않으면 KMD에서 ShareBackingStoreWithKmd 플래그를 설정해서는 안됩니다.

  • Dxgkrnl은 DXGKDDI_SETALLOCATIONBACKINGSTORE DDI를 호출하여 KMD에 할당 백업 저장소에 커널 모드 주소를 제공합니다.

  • UMD는 D3DKMTLock2를 호출하여 할당의 사용자 모드 주소를 가져옵니다.

할당의 속성

이러한 방식으로 만든 할당에는 다음 속성이 있어야 합니다.

  • 할당은 시스템 메모리 세그먼트에만 허용됩니다.
  • 할당은 공유로 만들어야 합니다.
  • 할당은 기존 시스템 메모리를 백업 저장소로 사용할 수 없습니다.
  • UMD는 일반 할당에 대해 모든 작업을 수행할 수 있습니다.
    • UMD는 D3DKMTLock2를 호출하여 할당에 대한 포인터를 가져올 수 있습니다.
    • UMD는 D3DKMTMakeResident를 호출하여 GPU에서 할당에 액세스할 수 있도록 할 수 있습니다.