다음을 통해 공유


Surface 메모리 요청 및 사용

사용자 모드 디스플레이 드라이버는 Microsoft Direct3D 런타임에서 표면 목록을 만들어야 하는 경우 CreateResource 함수에 대한 호출을 받습니다. Direct3D 런타임은 사용자 모드 표시 드라이버가 런타임에 다시 호출하는 데 사용하는 표면 목록에 대한 리소스 핸들을 지정합니다. 사용자 모드 표시 드라이버는 표면 목록을 나타내는 리소스 개체를 만들고, 이 개체에 대한 고유한 핸들을 생성하고, 핸들을 Direct3D 런타임으로 다시 반환합니다. 런타임은 후속 드라이버 호출에서 이 고유 핸들을 사용하여 표면 목록을 식별합니다. 런타임은 D3DDDIARG_CREATERESOURCE 구조체의 pSurfList 멤버에 포함된 배열에서 표면의 인덱스를 지정하여 특정 표면을 식별합니다.

사용자 모드 표시 드라이버는 리소스를 참조하는 호출에서 드라이버 정의 리소스 핸들을 받기 때문에 드라이버가 드라이버 정의 리소스 개체를 찾기 위해 비용이 많이 드는 핸들 조회를 수행할 필요가 없습니다. 마찬가지로 런타임이 핸들 조회를 수행할 필요가 없도록 사용자 모드 표시 드라이버는 사용자 모드 표시 드라이버가 런타임으로 다시 호출할 때 Direct3D 런타임 정의 리소스 핸들을 사용합니다.

사용자 모드 디스플레이 드라이버는 pfnAllocateCb 함수를 호출하여 표면에 대한 메모리를 할당합니다. pfnAllocateCb 호출에서 사용자 모드 디스플레이 드라이버는 각각 D3DDDICB_ALLOCATE 및 D3DDDI_ALLOCATIONINFO 구조체의 pPrivateDriverData 멤버에 있는 각 개별 표면 및 표면 목록에 대한 프라이빗 데이터를 전달할 수 있습니다. 그러나 사용자 모드 표시 드라이버는 pPrivateDriverData 멤버로부터 개인 데이터를 받을 수 없습니다. 사용자 모드 디스플레이 드라이버는 이 개인 데이터에 대한 메모리를 할당할 수 있으며 pfnAllocateCb 호출이 반환된 후 메모리를 해제하거나 스택 메모리를 사용하여 이 개인 데이터를 전달할 수 있습니다. pfnAllocateCb 함수는 사용자 모드 디스플레이 드라이버에 할당된 각 표면에 대한 각 할당에 대한 핸들을 반환합니다.

참고 사용자 모드 디스플레이 드라이버는 각 디바이스의 공유 표면마다 pfnAllocateCb 함수를 한 번 호출해야 합니다. 예를 들어 디바이스 1이 디바이스 2, 3 및 4에서도 사용되는 공유 표면을 만드는 경우 디바이스 2, 3 및 4는 할당 핸들을 검색하기 위해 공유 표면에 대해 pfnAllocateCb 를 한 번 호출해야 합니다.

사용자 모드 디스플레이 드라이버는 일반적으로 표면-할당 핸들 테이블을 유지 관리하여 각 할당 핸들에 대한 각 표면을 추적해야 합니다. 사용자 모드 표시 드라이버는 드라이버 정의 리소스 개체 내에 각 할당 핸들을 저장해야 합니다.

Direct3D 런타임이 이전에 할당된 표면에서 작업을 수행할 때(예: 사용자 모드 디스플레이 드라이버의 Blt 함수 호출에서) 사용자 모드 디스플레이 드라이버는 표면 인덱스를 사용하여 리소스에 대한 핸들을 받습니다. 사용자 모드 표시 드라이버는 이 리소스 핸들을 사용하여 드라이버 정의 리소스 개체를 검색합니다. 드라이버는 리소스 개체에 저장된 할당 핸들을 가져와서 명령 버퍼에 어셈블합니다. 사용자 모드 디스플레이 드라이버는 pfnRenderCb 함수를 호출할 때 화면에 해당하는 할당 핸들을 사용하여 명령 버퍼를 디스플레이 미니포트 드라이버에 제출합니다. 디스플레이 미니포트 드라이버는 DxgkCbGetHandleData 함수를 호출하여 사용자 모드 디스플레이 드라이버가 참조하는 표면 할당을 결정할 수 있습니다.