DirectX 12
To, co přineslo Mantle, převzal také Microsoft a společně s novými Windows 10 představil DirectX 12 a novou správu paměti pro grafické karty WDDM 2.0 (Virtuální paměť).
My už víme, že hlavním cílem DirectX 12 bylo především snížení celkové režie 3D API a zajištění rovnoměrné distribuce práce mezi všechna procesorová jádra. Tohoto cíle nelze dosáhnout jinak nežli přejít od sériového pojetí pipeline k paralelnímu. Pipeline DirectX 12 se tak smrskla pouze na to opravdu nejnutnější a přednost dostalo paralelní zpracování.
Asi tou nejpodstatnější změnou je samotný způsob volání API přímo v aplikaci. Zatímco u předchozích verzí byla tato volání 3D API (vytváření Draw Calls) svěřena pouze jedinému vláknu aplikace (Render thread), runtime DirextX 12 bylo upraveno tak, aby Draw Calls mohly být vytvářeny ve vláknech libovolného jádra procesoru paralelně, tedy nezávisle na sobě a záleží pouze na vývojáři, kolik jader k tomuto účelu využije.
Libovolné jádro procesoru tak může nyní vytvářet takzvané Command List, tedy jakési zásobníky příkazů, do kterých jsou Draw Calls nahrávány a jakmile je tento Command List dokončen, bez zbytečných okolků je okamžitě odeslán na zpracování do GPU. Tentokrát však ale ne za pomocí jediného univerzálního dopravníku (Command Queue), ale podle typu příkazu, hnedle pomocí několika front - Graphics Queue, Compute Queue a Copy Queue.
Graphics Queue (nebo také Direct Queue) je tou nejuniverzálnější frontou ze všech ostatních a její využití je stejné, jako u předchozích verzí DirectX. Pomocí Graphics Queue mohou být do grafické karty zasílány příkazy libovolného typu, tedy vykreslovací příkazy (Draw Calls), výpočetní příkazy (Dispatch Calls) i příkazy na kopírování zdrojů.
Za pomoci Compute Queue jsou pak do grafické karty přenášeny příkazy výpočetní (Dispatch Calls) a příkazy kopírovací, Copy Queue pak slouží výhradně pro kopírování zdrojů.
- DirectX 12 Multi-engine -
Ačkoliv informací o tom, jak přesně jednotlivé zastávky DirectX 12 tyto příkazy zpracovávají, je na internetu pramálo, je ale jasné, že tyto příkazy musejí být za pomoci User Mode Driver transformovány do formy srozumitelné dané grafické kartě a zároveň také shadery kompilovány do strojového kódu instrukčního setu dané grafické karty.
Stejně tak musejí být vytvářeny Command List pro více než jeden snímek (obdoba Context Queue), jinak by samozřejmě nemohla být zajištěna paralelní práce procesoru a grafické karty. Scheduling, tedy rozhodování o tom, jaké příkazy (Command List) a z jaké aplikace budou právě vykonávány, bylo svěřeno přímo grafické kartě.
Úloha User Mode Kernelu se smrskla na absolutní minimum. Zavedením virtuální paměti (Virtual memory), kterou přinesl WDDM 2.0, je paměť nyní jedinečná pro každou aplikaci využívající DirectX, takže žádná další aplikace k této izolované paměti nemůže přistupovat. Žádné přesuny zdrojů (textury apod.) správcem paměti se nekonají a tak není ani potřeba provádět kontrolu správnosti adres těchto zdrojů obsažených v Command List, jako tomu bylo u minulých verzí DirectX.
Kýženým výsledkem všech těchto změn pak je moderní 3D API s minimální režií a potenciálem maximálního využití všech zdrojů procesoru při přípravě snímku 3D scény, včetně paralelního odesílání příkazů ke zpracování na grafické kartě.