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


Отправка буфера команд

Для передачи буфера команд через графический стек Windows Vista необходимо выполнить следующую последовательность операций:

  1. Драйвер отображения пользовательского режима инициирует отправку буфера команд, если среда выполнения Direct3D вызывает одну из следующих функций драйвера отображения пользовательского режима для выполнения указанной операции:

    • Функция Present для отображения графики.
    • Функция Flush для отправки аппаратных команд.
    • Функция Lock для блокировки ресурса, который используется в текущем пакете команд.

    Обратите внимание, что драйвер отображения пользовательского режима также всегда инициирует отправку буфера команд при заполнении буфера команд.

  2. Драйвер отображения пользовательского режима вызывает функцию pfnRenderCb среды выполнения Direct3D для отправки буфера команд в среду выполнения.

  3. Подсистема ядра графики DirectX вызывает функцию DxgkDdiRender драйвера дисплея или DxgkDdiRenderKm для проверки буфера команд, записи буфера DMA в формате оборудования и создания списка выделения, описывающего используемые поверхности. Обратите внимание, что буфер DMA еще не исправлен (т. е. назначенные физические адреса). Примечание Если среда выполнения инициировала отправку буфера команд, вызвав функцию Present драйвера дисплея пользовательского режима, графическая подсистема вызывает функцию DxgkDdiPresent драйвера мини-порта дисплея, а не DxgkDdiRender или DxgkDdiRenderKm.

  4. Диспетчер видеопамяти вызывает функцию DxgkDdiBuildPagingBuffer драйвера минипорта дисплея, чтобы создать специальные буферы DMA, известные как буферы подкачки, которые перемещают выделения, указанные в списке выделения, который сопровождает буфер DMA, в память, доступную для GPU, и из нее. Дополнительные сведения см. в разделе Ресурсы видеопаметь по страницам.

  5. Планировщик GPU вызывает функцию DxgkDdiPatch драйвера мини-порта дисплея для назначения физических адресов ресурсам в буфере DMA. Однако планировщику не требуется вызывать DxgkDdiPatch для назначения физических адресов буферу подкачки, так как физические адреса для буфера подкачки были переданы и назначены во время вызова DxgkDdiBuildPagingBuffer .

  6. Планировщик GPU вызывает функцию DxgkDdiSubmitCommand драйвера минипорта дисплея, чтобы запросить у драйвера очередь буфера подкачки в единицу выполнения GPU.

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

  8. Драйвер мини-порта дисплея получает уведомление о прерывании в функции DxgkDdiInterruptRoutine . Драйвер мини-порта дисплея должен считывать из GPU идентификатор ограждения только что завершенного буфера DMA.

  9. Драйвер минипорта дисплея должен вызвать функцию DxgkCbNotifyInterrupt , чтобы уведомить планировщик GPU о завершении буфера DMA.

  10. Драйвер мини-порта дисплея должен вызывать функцию DxgkCbQueueDpc для постановки в очередь отложенного вызова процедуры (DPC).

  11. DPC драйвера мини-порта дисплея получает уведомление об обработке большей части буфера DMA.