다음을 통해 공유


명령 버퍼 제출

Windows Vista 그래픽 스택을 통해 명령 버퍼를 전달하려면 다음 작업 시퀀스를 수행해야 합니다.

  1. Direct3D 런타임이 다음 사용자 모드 표시 드라이버 함수 중 하나를 호출하여 지정된 작업을 수행하는 경우 사용자 모드 표시 드라이버는 명령 버퍼 제출을 시작합니다.

    • 그래픽을 표시하는 Present 함수입니다.
    • 하드웨어 명령을 제출하는 Flush 함수입니다.
    • 현재 명령 일괄 처리에서 사용되는 리소스를 잠그는 Lock 함수입니다.

    또한 사용자 모드 표시 드라이버는 명령 버퍼가 가득 찼을 때마다 항상 명령 버퍼 제출을 시작합니다.

  2. 사용자 모드 표시 드라이버는 Direct3D 런타임의 pfnRenderCb 함수를 호출하여 명령 버퍼를 런타임에 제출합니다.

  3. DirectX 그래픽 커널 하위 시스템은 디스플레이 미니포트 드라이버의 DxgkDdiRender 또는 DxgkDdiRenderKm 함수를 호출하여 명령 버퍼의 유효성을 검사하고, 하드웨어 형식으로 DMA 버퍼를 작성하고, 사용되는 표면을 설명하는 할당 목록을 생성합니다. DMA 버퍼는 아직 패치되지 않았습니다(즉, 실제 주소가 할당됨). 참고 런타임이 사용자 모드 디스플레이 드라이버의 Present 함수를 호출하여 명령 버퍼 제출을 시작한 경우 그래픽 하위 시스템은 DxgkDdiRender 또는 DxgkDdiRenderKm이 아닌 디스플레이 미니포트 드라이버의 DxgkDdiPresent 함수를 호출합니다.

  4. 비디오 메모리 관리자는 디스플레이 미니포트 드라이버의 DxgkDdiBuildPagingBuffer 함수를 호출하여 DMA 버퍼와 함께 GPU 액세스 가능 메모리와 함께 할당 목록에 지정된 할당을 이동하는 특수 용도의 DMA 버퍼(페이징 버퍼라고 함)를 만듭니다. 자세한 내용은 비디오 메모리 리소스 페이징을 참조하세요.

  5. GPU 스케줄러는 디스플레이 미니포트 드라이버의 DxgkDdiPatch 함수를 호출하여 DMA 버퍼의 리소스에 물리적 주소를 할당합니다. 그러나 페이징 버퍼에 대한 물리적 주소가 전달되고 DxgkDdiBuildPagingBuffer 호출 중에 할당되었기 때문에 스케줄 러는 DxgkDdiPatch 를 호출하여 페이징 버퍼에 실제 주소를 할당할 필요가 없습니다.

  6. GPU 스케줄러는 디스플레이 미니포트 드라이버의 DxgkDdiSubmitCommand 함수를 호출하여 드라이버가 페이징 버퍼를 GPU 실행 단위로 큐에 대기하도록 요청합니다.

  7. GPU 스케줄러는 디스플레이 미니포트 드라이버의 DxgkDdiSubmitCommand 함수를 호출하여 드라이버가 DMA 버퍼를 GPU 실행 단위로 큐에 넣도록 요청합니다. GPU에 제출된 각 DMA 버퍼에는 펜스 식별자가 포함됩니다. GPU가 DMA 버퍼 처리를 완료하면 GPU는 인터럽트를 생성합니다.

  8. 디스플레이 미니포트 드라이버는 DxgkDdiInterruptRoutine 함수의 인터럽트에 대한 알림을 받습니다. 디스플레이 미니포트 드라이버는 GPU에서 방금 완료된 DMA 버퍼의 펜스 식별자를 읽어야 합니다.

  9. 디스플레이 미니포트 드라이버는 DxgkCbNotifyInterrupt 함수를 호출하여 DMA 버퍼가 완료되었음을 GPU 스케줄러에 알려야 합니다.

  10. 디스플레이 미니포트 드라이버는 DxgkCbQueueDpc 함수를 호출하여 DPC(지연 프로시저 호출)를 큐에 추가해야 합니다.

  11. 디스플레이 미니포트 드라이버의 DPC는 대부분의 DMA 버퍼 처리를 처리하라는 알림을 받습니다.