스위즐된 할당 잠금

비디오 메모리 관리자는 스위즐된 할당에 대한 직접 CPU 액세스를 특별히 지원합니다(즉, 디스플레이 미니포트 드라이버의 DxgkDdiCreateAllocation 함수가 DXGK_ALLOCATIONINFO 구조의 Flags 멤버에서 Swizzled 플래그를 설정하는 할당).

비디오 메모리 관리자가 드라이버가 메모리 세그먼트에서 스위즐로 표시하지 않은 CPU 액세스 가능 할당을 제거하면 디스플레이 미니포트 드라이버는 항상 선형 형식으로 저장해야 합니다. 따라서 이러한 할당은 조리개 세그먼트에 있는 동안에는 스위즐할 수 없으며 드라이버의 DxgkDdiBuildPagingBuffer 함수에 의해 항상 스위즐되거나 스와이징되지 않아야 합니다.

반면에 스위즐로 표시된 할당은 메모리 세그먼트에서 제거될 때 항상 선형 형식으로 저장될 필요가 없습니다. 이러한 할당의 경우 비디오 메모리 관리자는 해당 할당의 스위즐링 상태를 추적하고 특정 전송 작업 중에 할당을 해제하려면 드라이버의 DxgkDdiBuildPagingBuffer 함수만 필요합니다.

사용자 모드 표시 드라이버가 Microsoft Direct3D 런타임의 pfnLockCb 함수를 호출한 후 비디오 메모리 관리자와 디스플레이 미니포트 드라이버는 할당 상태에 따라 다음과 같은 방식으로 작동합니다.

  1. 메모리 세그먼트에 있는 할당

    비디오 메모리 관리자는 CPU 조리개 획득을 시도하여 할당에 대한 선형 액세스를 제공합니다. 비디오 메모리 관리자가 조리개를 가져올 수 없는 경우 비디오 메모리 관리자는 할당을 시스템 메모리로 다시 제거합니다(드라이버가 D3DDDICB_LOCKFLAGS 구조의 DonotEvict 멤버를 설정하지 않는 한). 비디오 메모리 관리자가 디스플레이 미니포트 드라이버의 DxgkDdiBuildPagingBuffer 함수를 호출하여 할당을 전송하는 경우 디스플레이 미니포트 드라이버는 할당을 해제해야 합니다.

  2. 할당 제거(스위즐) 또는 조리개 세그먼트에 있음

    CPU가 액세스하려면 할당을 취소해야 합니다. 따라서 비디오 메모리 관리자는 먼저 할당의 페이지를 메모리 세그먼트로 이동하려고 시도합니다. 할당이 메모리 세그먼트에 있으면 비디오 메모리 관리자 및 디스플레이 미니포트 드라이버가 숫자 1과 같이 작동합니다.

  3. 할당 제거됨(언스위즈)

    할당이 시스템 메모리에 이미 없는 경우 비디오 메모리 관리자는 추가 처리 없이 기존 할당 포인터를 반환합니다.

    GPU가 이전에 섞지 않은 할당을 사용하려면 GPU에서 할당을 사용하기 전에 할당을 다시 써야 합니다. 따라서 표면 오류에서 비디오 메모리 관리자와 디스플레이 미니포트 드라이버는 다음과 같은 방식으로 작동합니다.

    • 메모리 세그먼트의 할당(CPU 조리개에 의해 즉석에서 섞이지 않음)

      할당은 이미 GPU에서 처리할 수 있는 스위즐 형식입니다. 따라서 비디오 메모리 관리자가 더 이상 처리할 필요가 없습니다.

    • 시스템 메모리에 할당 제거됨(덮어쓰지 않음)

      할당 페이지에는 스와이즈되지 않은 데이터가 포함되며 조리개 세그먼트에 매핑할 수 없습니다. 따라서 할당은 메모리 세그먼트에서 페이징되어야 합니다. 비디오 메모리 관리자가 디스플레이 미니포트 드라이버의 DxgkDdiBuildPagingBuffer 함수를 호출하여 할당에서 페이징하면 비디오 메모리 관리자는 디스플레이 미니포트 드라이버가 할당을 스위즐하도록 요청합니다.

참고 스위즐된 할당이 CPU 조리개를 통해 CPU 액세스 아래에 있으면 사용자 모드 표시 드라이버가 CPU 액세스를 종료하기 전에 제거될 수 있습니다. 이 사례는 숫자 2와 같이 처리됩니다. 제거는 애플리케이션 및 사용자 모드 표시 드라이버에 보이지 않는 방식으로 수행됩니다. 또한 덮어쓰지 않는 잠금(즉, D3DDDICB_LOCKFLAGSIgnoreSync 멤버를 설정하여 얻은 잠금)은 스위즐된 할당에서 허용되지 않습니다. CPU 또는 GPU만 지정된 시간에 이러한 할당에 액세스할 수 있습니다.