WDDM 2.0부터는 분할 모델을 사용하여 실제 메모리에 대한 GPU 액세스를 추상화합니다. KMD(커널 모드 드라이버)는 세그먼트 집합을 열거하여 GPU에서 사용할 수 있는 실제 메모리 리소스를 표현합니다. 그런 다음 비디오 메모리 관리자(VidMm)는 이러한 세그먼트를 관리합니다.
세그먼트 형식
세그먼트에는 세 가지 유형이 있습니다.
메모리 세그먼트
메모리 세그먼트는 GPU 전용 메모리를 나타냅니다. 개별 GPU의 VRAM 또는 통합 GPU의 펌웨어/드라이버 예약 메모리일 수 있습니다. 드라이버는 여러 메모리 세그먼트를 열거할 수 있습니다.
WDDM 2.0부터 VidMm 은 메모리 세그먼트를 4KB 또는 64KB 크기의 실제 페이지 풀로 관리합니다. Surface 데이터는 Fill/Transfer/Discard/FillVirtual/TransferVirtual 페이징 작업을 사용하여 메모리 세그먼트로부터 또는 메모리 세그먼트로 복사됩니다.
CPU는 다음 두 가지 방법 중 하나로 메모리 세그먼트의 콘텐츠에 액세스할 수 있습니다.
- 메모리 세그먼트는 CPU의 실제 주소 공간에 표시될 수 있습니다. 이 경우 VidMm 은 단순히 CPU 가상 주소를 세그먼트 내의 할당에 직접 매핑합니다.
- WDDM 2.0부터 VidMm 은 해당 세그먼트와 연결된 프로그래밍 가능한 CPU 호스트 조리개를 통해 메모리 세그먼트의 콘텐츠에 액세스할 수도 있습니다.
조리개 세그먼트
조리개 세그먼트는 GPU 엔진의 관점에서 불연속 시스템 메모리 페이지를 연속으로 표시하도록 하는 데 사용되는 전역 페이지 테이블입니다.
WDDM 2.0에서는 단일 조리개 세그먼트를 보고해야 합니다.
시스템 메모리 세그먼트
시스템 메모리 세그먼트는 시스템 메모리 참조(즉, 게스트 실제 주소)를 나타내는 암시적 세그먼트입니다. KMD는 시스템 메모리 세그먼트를 직접 열거하지 않습니다. 대신 VidMm 은 암시적으로 열거하고 항상 할당합니다 SegmentId==0. 시스템 메모리 세그먼트에 할당을 배치하려면 KMD에서 조리개 세그먼트 ID를 사용해야 합니다.
실제 메모리 참조
DDI에서 실제 메모리 참조는 항상 세그먼트 ID와 세그먼트 오프셋 쌍의 형태를 취합니다.
물리 주소를 통한 할당 접근
GPU 가상 주소 지정을 지원하지 않는 GPU 엔진은 실제 주소를 통해 할당에 액세스해야 합니다. 이 요구 사항은 할당이 세그먼트에서 할당된 리소스를 가져오는 방법에 영향을 줍니다. 물리적 참조는 할당이 메모리 세그먼트에서 연속적으로 할당되거나 조리개 세그먼트의 연속 범위를 차지해야 함을 의미합니다.
불필요하고 비용이 많이 드는 연속 할당을 방지하기 위해 KMD는 렌더링 엔진이 물리적으로 액세스해야 하는 할당을 명시적으로 식별해야 합니다. KMD는 할당을 생성하는 동안 DXGK_ALLOCATIONINFOFLAGS2::AccessedPhysically 플래그를 설정합니다.
이러한 할당은 시스템 메모리에 상주할 때 조리개 세그먼트에 매핑됩니다. 할당은 메모리 세그먼트에 상주할 때 연속됩니다. 이러한 방식으로 생성된 할당은 실제 주소 지정 모드에서 작동하는 엔진의 할당 목록을 통해 참조할 수 있습니다.
이 플래그가 설정되지 않은 할당의 경우 VidMm 은 메모리 세그먼트의 페이지 집합 또는 시스템 메모리의 페이지 집합으로 할당하며, 이 중 하나가 GPU 가상 주소를 통해 액세스됩니다. 이러한 방식으로 생성된 할당은 할당 목록을 통해 참조할 수 없습니다. 이러한 방식으로 할당을 참조하는 모든 명령 버퍼 제출은 거부됩니다.
컴퓨터에서 표시하는 기본 이미지인 기본 표면은 디스플레이 컨트롤러에서 암시적으로 물리적으로 액세스합니다. 이러한 표면은 메모리 세그먼트에서 연속적으로 할당되거나 표시될 때 조리개 세그먼트에 매핑됩니다. KMD는 렌더링 엔진이 할당에 물리적으로 액세스할 때만 AccessedPhysically 플래그를 설정해야 합니다. 기본 표면의 암시적 물리적 액세스와 명시적 플래그 간의 차이점은 할당이 조리개에 매핑되는 시기입니다.
AccessedPhysically 플래그가 설정되면 할당은 상주할 때마다 조리개에 매핑됩니다.
이 플래그 집합이 없는 기본 표면은 표시되는 경우에만 조리개에 매핑됩니다. 이 방법은 조리개 세그먼트에 대한 압력을 제거하는 데 도움이 됩니다. 즉, 일반적으로 자주 표시되는 기본 표면은 몇 개뿐이지만 많은 수의 표면이 존재하여 렌더링될 수 있습니다. 예를 들어 모든 FlipEx 스왑 체인은 dFlip iFlip/ 시나리오에서 기본 및 잠재적으로 표시 가능한 표면으로 만들어집니다.
다음 표에서는 GPU 세그먼트 내의 다양한 유형의 할당에 물리적 액세스 요구 사항에 따라 액세스하는 방법을 요약합니다.
| 세그먼트 유형 | AccessedPhysically==0 | AccessedPhysically==1 | Primary &&AccessedPhysically==0 |
|---|---|---|---|
| 메모리 세그먼트 | 페이지 집합입니다. GPU 가상 액세스만 허용됩니다. | 연속적인. GPU 물리적 액세스가 허용됨 | 연속된. 렌더링 엔진에서 GPU 가상 액세스만 허용됩니다. |
| 조리개 세그먼트 | 매핑되지 않음 GPU 페이지 테이블에 의해서만 매핑되는 시스템 메모리 페이지로, 조리개 세그먼트에는 매핑되지 않습니다. GPU 가상 액세스만 허용됩니다. | 상주할 때 매핑됩니다. GPU 물리적 액세스가 허용됩니다. | 표시될 때에 매핑됩니다. 렌더링 엔진에서 GPU 가상 액세스만 허용됩니다. |