Поток операций windows Display Driver Model (WDDM)

На следующей схеме показан поток операций WDDM, выполняемых с момента создания устройства отрисовки до отображения содержимого на дисплее. Сведения, приведенные на схеме, более подробно описывают упорядоченную последовательность потока операций.

Схема, на котором показан поток операций WDDM от создания устройства отрисовки до представления содержимого на дисплее.

  • Создание устройства отрисовки

    После того, как приложение запросит создание устройства отрисовки, выполните приведенные далее действия.

    • 1. Подсистема ядра графики DirectX (Dxgkrnl) вызывает функцию DxgkDdiCreateDevice драйвера минипорта дисплея (KMD).

      KMD инициализирует прямой доступ к памяти (DMA), возвращая указатель на заполненную структуру DXGK_DEVICEINFO в элементе pInfoструктуры DXGKARG_CREATEDEVICE .

    • 2. Если вызов DxgkDdiCreateDevice завершается успешно, среда выполнения Direct3D вызывает функцию CreateDevice драйвера отображения пользовательского режима (UMD).

    • 3. В вызове CreateDevice UMD должен явным образом вызвать функцию pfnCreateContextCb среды выполнения для создания одного или нескольких контекстов GPU, которые являются потоками выполнения GPU на только что созданном устройстве. Среда выполнения возвращает сведения в UMD в элементах pCommandBuffer и CommandBufferSize структуры D3DDDICB_CREATECONTEXT для инициализации буфера команд.

  • Создание поверхностей для устройства

    После того как приложение запросит создание поверхностей для устройства отрисовки, выполните следующие действия.

    • 4. Среда выполнения Direct3D вызывает функцию CreateResource UMD.

    • 5. CreateResource вызывает предоставленную средой выполнения функцию pfnAllocateCb .

    • 6. Среда выполнения вызывает функцию DXGkDdiCreateAllocation KMD, указывая количество и типы создаваемых выделений. DxgkDdiCreateAllocation возвращает сведения о выделениях в массиве DXGK_ALLOCATIONINFO структур в элементе pAllocationInfoструктуры DXGKARG_CREATEALLOCATION .

  • Отправка буфера команд в режим ядра

    После того, как приложение запросит рисование на поверхность, выполните приведенные далее действия.

    • 7. Среда выполнения Direct3D вызывает функцию UMD, связанную с операцией рисования, например DrawPrimitive2.

    • 8. Среда выполнения Direct3D вызывает функцию UMD Present или Flush , чтобы вызвать отправку буфера команд в режим ядра. Примечание. UMD также отправляет буфер команд, когда буфер команд заполнен.

    • 9. В ответ на шаг 8 UMD вызывает одну из следующих функций, предоставляемых средой выполнения:

    • 10: функция DxgkDdiPresent в KMD вызывается, если был вызван pfnPresentCb , либо dxgkDdiRender или DxgkDdiRenderKm , если был вызван pfnRenderCb . KMD проверяет буфер команд, записывает в буфер DMA в формате оборудования и создает список выделения, описывающий используемые поверхности.

  • Отправка буфера DMA на оборудование

    • 11: Dxgkrnl вызывает функцию DXGkDdiBuildPagingBuffer KMD для создания буферов DMA специального назначения, которые перемещают выделения, указанные в списке выделения, в память, доступную для GPU, и из нее. Эти специальные буферы DMA называются буферами разбиения по страницам. DxgkDdiBuildPagingBuffer не вызывается для каждого кадра.

    • 12: Dxgkrnl вызывает функцию DXGkDdiSubmitCommand KMD для постановки буферов подкачки в единицу выполнения GPU.

    • 13: Dxgkrnl вызывает функцию DXGkDdiPatch KMD для назначения физических адресов ресурсам в буфере DMA.

    • 14: Dxgkrnl вызывает функцию DXGkDdiSubmitCommand KMD для постановки буфера DMA в единицу выполнения GPU. Каждый буфер DMA, отправленный в GPU, содержит идентификатор ограждения, который является числом. После того как GPU завершит обработку буфера DMA, GPU создает прерывание.

    • 15: KMD получает уведомление о прерывании в функции DxgkDdiInterruptRoutine . KMD должен считывать из GPU идентификатор ограждения только что завершенного буфера DMA.

    • 16: KMD должен вызвать функцию DxgkCbNotifyInterrupt , чтобы уведомить DXGK о завершении буфера DMA. KMD также должен вызывать функцию DxgkCbQueueDpc для постановки в очередь отложенного вызова процедуры (DPC).