Поток операций модели драйвера Windows (WDDM)
На следующей схеме показан поток операций WDDM, возникающих при создании устройства отрисовки до момента отображения содержимого. Сведения, приведенные на схеме, подробно описывают упорядоченную последовательность потока операций.
Создание устройства отрисовки
После запроса приложения на создание устройства отрисовки:
1. Подсистема ядра графики DirectX (Dxgkrnl) вызывает функцию драйвера минипорта (KMD) dxgkDdiCreateDevice .
KMD инициализирует прямой доступ к памяти (DMA), возвращая указатель на заполненную структуру DXGK_DEVICEINFO в элементе pInfo структуры DXGKARG_CREATEDEVICE.
2. Если вызов dxgkDdiCreateDevice завершается успешно, среда выполнения Direct3D вызывает функцию драйвера в режиме пользователя (UMD) CreateDevice.
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: функция DXGkDdiPresent KMD вызывается, если был вызван pfnPresentCb, или функция DxgkDdiRender или DxgkDdiRenderKm, если был вызван pfnRenderCb. KMD проверяет буфер команд, записывает в буфер DMA в формате оборудования и создает список выделения, описывающий используемые поверхности.
Отправка буфера DMA в оборудование
11. Dxgkrnl вызывает функцию KMD DxgkDdiBuildPagingBuffer для создания буферов DMA специального назначения, которые перемещают выделения, указанные в списке выделения, в память с поддержкой GPU и из нее. Эти специальные буферы DMA называются буферами разбиения по страницам. DxgkDdiBuildPagingBuffer не вызывается для каждого кадра.
12. Dxgkrnl вызывает функцию KMD DxgkDdiSubmitCommand, чтобы очередь буферов разбиения по страницам в единицу выполнения GPU.
13. Dxgkrnl вызывает функцию KMD DxgkDdiPatch, чтобы назначить физические адреса ресурсам в буфере DMA.
14. Dxgkrnl вызывает функцию KMD DxgkDdiSubmitCommand для очереди буфера DMA в единицу выполнения GPU. Каждый буфер DMA, отправленный в GPU, содержит идентификатор ограждения, который является числом. После завершения обработки буфера DMA GPU GPU создает прерывание.
15: KMD уведомляется о прерывании в функции DxgkDdiInterruptRoutine . KMD должен считывать из GPU идентификатор забора буфера DMA, который только что завершился.
16. KMD должен вызвать DxgkCbNotifyInterrupt , чтобы уведомить DXGK о завершении буфера DMA. KMD также должен вызывать DxgkCbQueueDpc в очередь отложенного вызова процедуры (DPC).