Поделиться через


Поток процесса работы модели драйвера Windows (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. Среда выполнения вызывает функцию DXGkDddiCreateAllocation , указывая количество и типы создаваемых выделений. DxgkDdiCreateAllocation возвращает сведения о выделениях в массиве структур DXGK_ALLOCATIONINFO в члене pAllocationInfo структуры DXGKARG_CREATEALLOCATION.

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

    После того как приложение запрашивает отрисовку на поверхности:

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

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

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

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

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

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

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

    • 13. Dxgkrnl вызывает функцию KMD DxgkDdiPatch , чтобы назначить физические адреса ресурсам в буфере DMA.

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

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

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