다음을 통해 공유


명령 버퍼 제출

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

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

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

    또한 UMD는 명령 버퍼가 가득 찼을 때마다 항상 명령 버퍼 제출을 시작합니다.

  2. UMD는 Direct3D 런타임의 pfnRenderCb 함수를 호출하여 명령 버퍼를 런타임에 제출합니다.

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

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

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

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

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

  8. KMD는 DxgkDdiInterruptRoutine 함수의 인터럽트에 대해 알림을 받습니다. KMD는 GPU에서 방금 완료된 DMA 버퍼의 펜스 식별자를 읽어야 합니다.

  9. KMD는 DxgkCbNotifyInterrupt 함수를 호출하여 DMA 버퍼가 완료되었음을 GPU 스케줄러에 알려야 합니다.

  10. KMD는 DxgkCbQueueDpc 함수를 호출하여 DPC(지연 프로시저 호출)를 큐에 대기시켜야 합니다.

  11. KMD의 DPC는 대부분의 DMA 버퍼 처리를 처리하라는 알림을 받습니다.