Megosztás a következőn keresztül:


Windows Display Driver Model (WDDM) műveleti folyamat

Az alábbi ábra a WDDM-műveletek folyamatát mutatja be, amelyek akkor következnek be, amikor egy renderelő eszköz létrejön, és amikor a tartalom megjelenik a kijelzőn. A diagramot követő információk részletesebben ismertetik a műveleti folyamat rendezett sorrendjét.

Diagram, amely a WDDM-műveletfolyamatot mutatja be a renderelő eszköz létrehozásától a kijelzőn lévő tartalom megjelenítéséig.

  • Renderelő eszköz létrehozása

    Miután egy alkalmazás egy renderelő eszköz létrehozását kérte:

    • 1: A DirectX grafikus kernel alrendszere (Dxgkrnl) meghívja a kernel módú megjelenítési miniportillesztő (KMD) DxgkDdiCreateDevice függvényét .

      A KMD inicializálja a közvetlen memóriahozzáférést (DMA) úgy, hogy visszaad egy mutatót egy kitöltött DXGK_DEVICEINFO struktúrára a DXGKARG_CREATEDEVICE struktúra pInfo tagjában.

    • 2: Ha a DxgkDdiCreateDevice hívása sikeres, a Direct3D futtatókörnyezet meghívja a felhasználói módú megjelenítési illesztőprogram (UMD) CreateDevice függvényét .

    • 3: A CreateDevice hívásban az UMD-nek explicit módon meg kell hívnia a futtatókörnyezet pfnCreateContextCb függvényét egy vagy több GPU-környezet létrehozásához, amelyek gpu-végrehajtási szálak az újonnan létrehozott eszközön. A futtatási környezet információkat ad vissza az UMD-nek a pCommandBuffer és CommandBufferSize tagokban a D3DDDICB_CREATECONTEXT struktúrában a parancspuffer inicializálásához.

  • Felületek létrehozása eszközhöz

    Miután egy alkalmazás felületeket kért a renderelő eszközhöz:

  • A parancspuffer elküldése kernel módba

    Miután egy alkalmazás egy felületre való rajzolásra vonatkozó kérést kér:

    • 7: A Direct3D futtatókörnyezet meghívja a rajzművelethez kapcsolódó UMD függvényt, például a DrawPrimitive2 függvényt.

    • 8: A Direct3D futtatókörnyezet meghívja az UMD Present vagy Flush függvényét, hogy a parancspuffer kernel módba legyen küldve. Megjegyzés: Az UMD akkor is elküldi a parancspuffert, ha a parancspuffer megtelt.

    • 9: A 8. lépésre válaszul az UMD a következő futtatókörnyezetben megadott függvények egyikét hívja meg:

      • A futtatókörnyezet pfnPresentCb függvénye, ha meghívták a Present-et.
      • A futtatókörnyezet pfnRenderCb függvénye, ha flush volt meghívva, vagy a parancspuffer megtelt.
    • 10: A KMD DxgkDdiPresent függvényét a rendszer meghívja , ha a pfnPresentCb meghívást kapott, vagy a DxgkDdiRender vagy a DxgkDdiRenderKm függvényt, ha pfnRenderCb volt meghívva. A KMD ellenőrzi a parancspuffert, a hardver formátumában írja a DMA-pufferbe, és létrehoz egy foglalási listát, amely leírja a használt felületeket.

  • A DMA-puffer elküldése hardverre

    • 11: A Dxgkrnl meghívja a KMD DxgkDdiBuildPagingBuffer függvényét, hogy olyan speciális célú DMA-puffereket hozzon létre, amelyek áthelyezik a foglalási listában megadott foglalásokat a GPU által elérhető memóriába és onnan. Ezeket a speciális DMA-puffereket lapozópuffereknek nevezzük. A DxgkDdiBuildPagingBuffer nem minden kerethez van meghívva.

    • 12: A Dxgkrnl meghívja a KMD DxgkDdiSubmitCommand függvényét, hogy a lapozópuffereket ütemezze a GPU végrehajtási egységére.

    • 13: A Dxgkrnl meghívja a KMD DxgkDdiPatch függvényét, hogy fizikai címeket rendeljen a DMA-puffer erőforrásaihoz.

    • 14: Dxgkrnl meghívja a KMD DxgkDdiSubmitCommand függvényét a DMA-puffer várólistára állításához a GPU végrehajtási egységéhez. A GPU-nak küldött összes DMA-puffer tartalmaz egy kerítésazonosítót, amely egy szám. Miután a GPU befejezte a DMA-puffer feldolgozását, a GPU megszakítást hoz létre.

    • 15: A KMD értesítést kap a megszakításról a DxgkDdiInterruptRoutine függvényben. A KMD-nek be kell olvasnia a befejezett DMA-puffer kerítésazonosítóját a GPU-ból.

    • 16: A KMD meghívja a DxgkCbNotifyInterruptet , hogy értesítse a Dxgkrnl-et a DMA-puffer befejezéséről. A KMD-nek a DxgkCbQueueDpc-t is meg kell hívnia a késleltetett eljáráshívás (DPC) várólistára helyezéséhez.