Sdílet prostřednictvím


Odeslání vyrovnávací paměti příkazu

Aby bylo možné předat vyrovnávací paměť příkazů prostřednictvím grafického zásobníku Windows, je nutné provést následující posloupnost operací:

  1. Ovladač zobrazení v uživatelském režimu (UMD) zahájí odeslání vyrovnávací paměti příkazů, pokud modul runtime Direct3D volá jednu z následujících funkcí UMD k provedení zadané operace:

    • Funkce Prezentovat pro zobrazení grafiky.
    • Funkce Flush pro odesílání hardwarových příkazů.
    • Funkce Lock k uzamčení prostředku, která se používá v aktuální skupině příkazů.

    UMD také vždy spustí odeslání příkazového bufferu pokaždé, když je příkazový buffer naplněn.

  2. UmD volá funkci pfnRenderCb modulu runtime Direct3D, která předá vyrovnávací paměť příkazů do modulu runtime.

  3. Grafický subsystém jádra DirectX (Dxgkrnl) volá ovladač miniportu v režimu jádra (KMD) DxgkDdiRender nebo DxgkDdiRenderKm k ověření vyrovnávací paměti příkazů, zápisu vyrovnávací paměti DMA ve formátu hardwaru a vytvoření seznamu přidělení popisující použité povrchy. Mějte na paměti, že vyrovnávací paměť DMA ještě nebyla opravena (to znamená přiřazené fyzické adresy). Poznámka Pokud modul runtime inicioval odeslání příkazové vyrovnávací paměti voláním funkce Present UMD, grafický subsystém volá funkci DxgkDdiPresent KMD, nikoli DxgkDdiRender nebo DxgkDdiRenderKm.

  4. Správce paměti videa volá funkci DxgkDdiBuildPagingBuffer KMD, která vytváří vyrovnávací paměti DMA pro zvláštní účely, známé jako vyrovnávací paměti stránkování. Tyto vyrovnávací paměti přesouvají přidělení specifikovaná v seznamu přidělení, který doprovází vyrovnávací paměť DMA, do paměti přístupné GPU a zpět. Další informace najdete v tématu Stránkování prostředků paměti videa.

  5. Plánovač GPU volá funkci DxgkDdiPatch KMD k přiřazení fyzických adres prostředkům ve vyrovnávací paměti DMA. Plánovač však nevyžaduje volání DxgkDdiPatch pro přiřazení fyzických adres do vyrovnávací paměti stránkování, protože fyzické adresy pro vyrovnávací paměť stránkování byly předány a přiřazeny během volání DxgkDdiBuildPagingBuffer .

  6. Plánovač GPU volá funkci DxgkDdiSubmitCommand KMD, aby požádal ovladač o zařazení vyrovnávací paměti stránkování do jednotky pro vykonávání úloh GPU.

  7. Plánovač GPU volá funkci DxgkDdiSubmitCommand KMD , která požaduje, aby ovladač zařadil vyrovnávací paměť DMA do jednotky spouštění GPU. Každá vyrovnávací paměť DMA odeslaná do GPU obsahuje identifikátor plotu. Poté, co GPU dokončí zpracování vyrovnávací paměti DMA, vygeneruje přerušení.

  8. KmD je upozorněn na přerušení ve své funkci DxgkDdiInterruptRoutine . KMD by měl z GPU přečíst identifikátor dokončení vyrovnávací paměti DMA, která se právě dokončila.

  9. KmD by měl volat funkci DxgkCbNotifyInterrupt , která plánovači GPU oznámí, že vyrovnávací paměť DMA byla dokončena.

  10. KmD by měl volat funkci DxgkCbQueueDpc , která zařadí do fronty odložené volání procedury (DPC).

  11. DPC služby KMD je pověřen zpracováním většiny vyrovnávací paměti DMA.