다음을 통해 공유


WDDM(Windows 디스플레이 드라이버 모델) 작업 흐름

다음 다이어그램은 렌더링 디바이스를 만들 때부터 콘텐츠가 디스플레이에 표시될 때 발생하는 WDDM 작업의 흐름을 보여 줍니다. 다이어그램 뒤에 있는 정보는 작업 흐름의 순서가 지정된 시퀀스를 자세히 설명합니다.

렌더링 디바이스를 만드는 것부터 디스플레이에 콘텐츠를 표시하는 것까지 WDDM 작업 흐름을 보여 주는 다이어그램

  • 렌더링 디바이스 만들기

    애플리케이션이 렌더링 디바이스를 만들도록 요청한 후:

    • 1: DirectX 그래픽 커널 하위 시스템(Dxgkrnl)은 커널 모드 디스플레이 미니포트 드라이버(KMD) DxgkDdiCreateDevice 함수를 호출합니다.

      KMD는 DXGKARG_CREATEDEVICE 구조체의 pInfo 멤버에 채워진 DXGK_DEVICEINFO 구조체에 대한 포인터를 반환하여 DMA(직접 메모리 액세스)를 초기화합니다.

    • 2: DxgkDdiCreateDevice대한 호출이 성공하면 Direct3D 런타임에서 UMD(사용자 모드 표시 드라이버) CreateDevice 함수를 호출합니다.

    • 3: CreateDevice 호출에서 UMD는 런타임의 pfnCreateContextCb 함수를 명시적으로 호출하여 새로 만든 디바이스에서 실행되는 GPU 스레드인 하나 이상의 GPU 컨텍스트를 만들어야 합니다. 런타임은 D3DDDICB_CREATECONTEXT 구조체의 pCommandBuffer 및 CommandBufferSize 멤버에서 UMD로 정보를 반환하여 명령 버퍼를 초기화합니다.

  • 디바이스에 대한 Surface 만들기

    애플리케이션이 렌더링 디바이스에 대한 표면을 만들도록 요청한 후:

  • 커널 모드로 명령 버퍼 제출

    애플리케이션이 화면에 그리기를 요청한 후:

  • 하드웨어에 DMA 버퍼 제출

    • 11: Dxgkrnl은 KMD의 DxgkDdiBuildPagingBuffer 함수를 호출하여 할당 목록에 지정된 할당을 GPU 액세스 가능 메모리로 이동하는 특수 용도의 DMA 버퍼를 만듭니다. 이러한 특수 DMA 버퍼를 페이징 버퍼라고 합니다. DxgkDdiBuildPagingBuffer 는 모든 프레임에 대해 호출되지 않습니다.

    • 12: Dxgkrnl은 KMD의 DxgkDdiSubmitCommand 함수를 호출하여 페이징 버퍼를 GPU 실행 단위로 큐에 대기합니다.

    • 13: Dxgkrnl은 KMD의 DxgkDdiPatch 함수를 호출하여 DMA 버퍼의 리소스에 물리적 주소를 할당합니다.

    • 14: Dxgkrnl은 KMD의 DxgkDdiSubmitCommand 함수를 호출하여 DMA 버퍼를 GPU 실행 단위로 큐에 대기합니다. GPU에 제출된 각 DMA 버퍼에는 숫자인 펜스 식별자가 포함됩니다. GPU가 DMA 버퍼 처리를 완료하면 GPU에서 인터럽트를 생성합니다.

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

    • 16: KMD는 DXgkCbNotifyInterrupt를 호출하여 DMA 버퍼가 완료되었음을 DXGK에 알려야 합니다. 또한 KMD는 DxgkCbQueueDpc를 호출하여 DPC(지연 프로시저 호출)를 큐에 대기시켜야 합니다.