DMA 버퍼 분할

분할 지점은 비디오 메모리 관리자가 디스플레이 미니포트 드라이버에서 제출한 큰 작업 항목을 더 적은 GPU 리소스가 필요한 더 작은 작업 항목으로 나누는 데 사용됩니다. 예를 들어 큰 DMA 버퍼는 로컬 비디오 메모리 또는 비로컬 메모리에 맞지 않을 수 있는 할당 집합을 참조할 수 있습니다. 이러한 작업 항목을 처리하는 유일한 방법은 더 적은 GPU 리소스가 필요한 여러 개의 작은 작업 항목으로 나누는 것입니다.

참고 DMA 버퍼 분할 및 DMA 버퍼 선점은 서로 다른 독립적인 개념입니다. 디스플레이 미니포트 드라이버는 DMA 버퍼 선점이 불가능한 GPU가 있는 시스템에서도 항상 DMA 버퍼 분할을 지원해야 합니다. 컨텍스트 저장 및 복원이 불가능한 GPU가 있는 시스템에서 GPU 스케줄러는 DMA 버퍼의 분할 부분을 다시 예약하여 분할 부분이 다른 GPU 컨텍스트의 다른 DMA 버퍼와 인터리브되지 않도록 합니다. 그러나 페이징 작업은 DMA 버퍼의 분할 부분 간에 필요하므로 분할 DMA 버퍼의 일부 간에 페이징 버퍼를 제출해야 합니다. 드라이버가 애플리케이션 DMA 스트림을 빌드하는 데 사용하는 각 분할 지점은 비디오 메모리 관리자에서 사용됩니다. 제출된 DMA 버퍼는 각 분할 지점 이후에 해당 위치에 삽입될 수 있는 잠재적인 페이징 버퍼를 설명하기 위해 충분한 GPU 상태를 다시 프로그래밍해야 합니다.

분할 지점을 지정하기 위해 표시 미니포트 드라이버는 D3DDDI_PATCHLOCATIONLIST AllocationIndex 멤버에서 참조되는 각 할당에 대해 D3DDDI_PATCHLOCATIONLIST 구조의 SplitOffsetSlotId 멤버에 값을 지정합니다. 특정 DMA 버퍼 내에서 할당 사용량을 추적하기 위해 비디오 메모리 관리자는 드라이버가 DxgkDdiQueryAdapterInfo 함수를 호출하여 제공한 DXGK_DRIVERCAPS 구조체의 MaxAllocationListSlotId 멤버를 사용하여 배열의 필요한 차원을 만듭니다. 이 배열은 0에서 초기화되며 패치 위치 목록의 분할 부분 항목이 처리될 때 채워집니다. 패치 위치에 대한 D3DDDI_PATCHLOCATIONLISTSlotId 멤버는 업데이트해야 하는 리소스 테이블의 행을 나타내고 SplitOffset 멤버는 할당이 필요한 DMA 버퍼 내의 오프셋을 나타냅니다. DMA 버퍼는 GPU에 액세스할 수 있는 리소스 없이 SplitOffset 에서 지정한 지점까지 실행할 수 있습니다. 마찬가지로 새 패치 위치 분할 부분 항목이 동일한 SlotId를 참조하는 경우 이전 할당은 새 할당으로 대체되고 이전 할당은 더 이상 필요하지 않습니다(즉, 이전 할당은 페이징 아웃될 수 있음).

DMA 버퍼에 필요한 리소스에서 페이징하는 경우 비디오 메모리 관리자는 첫 번째 요소부터 시작하여 마지막 요소로 아래로 이동하여 패치 위치 목록을 처리합니다. 드라이버에 의해 채워진 D3DDDI_PATCHLOCATIONLIST 요소는 SplitOffset 멤버에 값을 포함해야 합니다. 요소는 엄격하게 증가합니다(즉, 할당이 스트림에서 사용되는 순서대로 표시되어야 합니다). 제공된 순서대로 패치 위치 목록에서 참조되는 할당의 비디오 메모리 관리자 페이지입니다. 낮은 메모리 조건으로 인해 비디오 메모리 관리자가 더 이상 할당에 페이지를 입력할 수 없는 지점에 도달하면 비디오 메모리 관리자는 실행을 위해 준비 중인 DMA 버퍼의 현재 부분을 GPU 스케줄러에 제출합니다. DMA 버퍼는 이전 분할 지점의 시작부터 가져올 수 없는 할당에 대해 지정된 SplitOffset 값까지 실행됩니다. 제출되면 비디오 메모리 관리자는 리소스 테이블을 사용하여 DMA 스트림의 현재 분할 오프셋에서 필요한 할당 목록을 결정합니다. 테이블의 모든 할당은 현재 물리적 위치에 유지되지만 더 이상 사용되지 않는 다른 할당은 제거될 수 있습니다. 그런 다음 비디오 메모리 관리자는 패치 위치 목록을 계속 처리하여 잠재적으로 여러 번 다시 분할할 수 있습니다.

드라이버는 할당이 바인딩되거나 바인딩되지 않은 경우 분할 지점을 지정해야 합니다. 할당이 바인딩되지 않음을 지정하기 위해 드라이버는 연결된 D3DDDI_PATCHLOCATIONLIST SlotId 멤버에 적절한 값을 사용하여 DXGK_ALLOCATIONLIST 구조체의 hDeviceSpecificAllocation 멤버에 NULL 할당 핸들을 지정할 수 있습니다. 드라이버는 비디오 메모리 관리자가 복잡한 메모리 배치 문제를 해결할 수 있는 가능성을 높이기 위해 큰 리소스를 바인딩 해제해야 합니다.

마찬가지로 드라이버는 모든 분할 지점에서 큰 리소스를 다시 프로그래밍해야 합니다. 분할 지점을 사용하는 경우 비디오 메모리 관리자는 이전에 바인딩된 할당을 이전 할당으로 남겨 두어야 합니다. 이로 인해 이전에 바인딩된 할당 제한이 아니라면 해결되었을 수 있는 복잡한 메모리 배치 문제를 해결하지 못할 수 있는 메모리 조각화가 발생합니다. 분할 지점에서 상태를 계산할 때 비디오 메모리 관리자는 해당 분할 지점에서 다시 프로그래밍되는 슬롯 식별자(SlotId)(즉, 동일한 SplitOffset 값을 다른 요소와 공유하는 각 패치 위치 목록 요소)를 결정하고 이 분할 지점에 대한 배치 제한을 무시합니다. 예를 들어 드라이버가 64MB 텍스처를 사용하는 경우 모든 분할 지점에서 해당 텍스처를 다시 프로그래밍하면 비디오 메모리 관리자가 필요한 경우 분할 지점 간에 메모리에서 해당 텍스처를 유연하게 이동할 수 있습니다.