Direct3D 11 dne 12
D3D11On12 je mechanismus, pomocí kterého můžou vývojáři používat rozhraní A objekty D3D11 k řízení rozhraní API D3D12. D3D11on12 umožňuje, aby komponenty napsané pomocí D3D11 (například textu D2D a uživatelského rozhraní) spolupracovaly s komponentami, které cílí na rozhraní API D3D12. D3D11on12 také umožňuje přírůstkové přenosy aplikace z D3D11 do D3D12 tím, že umožňuje, aby části aplikace pokračovaly v cílení na D3D11, zatímco ostatní cílí na D3D12 na výkon, zatímco vždy mají dokončené a správné vykreslování. D3D11On12 usnadňuje použití technik vzájemné spolupráce ke sdílení prostředků a synchronizaci práce mezi těmito dvěma rozhraními API.
- Inicializace D3D11On12
- příklad využití
- pozadí
- Čištění
- omezení
- rozhraní API
- související témata
Inicializace D3D11On12
Pokud chcete začít používat D3D11On12, prvním krokem je vytvoření zařízení a fronty příkazů D3D12. Tyto objekty jsou poskytovány jako vstup metody inicializace D3D11On12CreateDevice. Tuto metodu si můžete představit jako vytvoření zařízení D3D11 s imaginárním typem ovladače D3D_DRIVER_TYPE_11ON12, kde ovladač D3D11 zodpovídá za vytváření objektů a odesílání seznamů příkazů do rozhraní API D3D12.
Jakmile budete mít zařízení D3D11 a okamžitý kontext, můžete QueryInterface
zařízení pro rozhraní ID3D11On12Device. Toto je primární rozhraní, které se používá pro interoperabilitu mezi D3D11 a D3D12. Pokud chcete, aby kontext zařízení D3D11 i seznamy příkazů D3D12 fungovaly na stejných prostředcích, je nutné vytvořit "zabalené prostředky" pomocí CreateWrappedResource API. Tato metoda "propaguje" prostředek D3D12, aby byl srozumitelný v D3D11. Zabalený prostředek začíná ve stavu "acquired", vlastnost, která je manipulována AcquireWrappedResources a ReleaseWrappedResources metody.
Příklad použití
Typické použití D3D11On12 by bylo použít D2D k vykreslení textu nebo obrázků nad vyrovnávací pamětí D3D12 zpět. Příklad kódu najdete v ukázce D3D11On12. Tady je hrubý přehled kroků, které je třeba provést:
- Vytvořte zařízení D3D12 (D3D12CreateDevice) a řetězec prohození D3D12 (CreateSwapChain s ID3D12CommandQueue jako vstup).
- Vytvořte zařízení D3D11On12 pomocí zařízení D3D12 a stejné fronty příkazů jako vstup.
- Načtěte vyrovnávací paměti zpětného řetězu prohození a vytvořte pro každý z nich zabalené prostředky D3D11. Použitý vstupní stav by měl být posledním způsobem, jak ho D3D12 použil (např. RENDER_TARGET) a výstupní stav by měl být způsob, jakým ho D3D12 použije po dokončení D3D11 (např. PRESENT).
- Inicializace D2D a poskytnutí zabalených prostředků D3D11 do D2D k přípravě na vykreslování
Pak na každém snímku udělejte toto:
- Vykreslení do aktuální vyrovnávací paměti řetězu prohození zpět pomocí seznamu příkazů D3D12 a jeho spuštění.
- Získejte zabalený prostředek aktuální vyrovnávací paměti zpět (AcquireWrappedResources).
- Vyřešte příkazy vykreslování D2D.
- Uvolněte zabalený prostředek (ReleaseWrappedResources).
- Vyprázdněte okamžitý kontext D3D11.
- Present (IDXGISwapChain1::P resent1).
Pozadí
D3D11On12 pracuje systematicky. Každé volání rozhraní API D3D11 prochází typickým ověřováním za běhu a vytváří cestu k ovladači. Ve vrstvě ovladače speciální 11on12 driver zaznamenává stav a problémy vykreslují operace do seznamů příkazů D3D12. Tyto seznamy příkazů se odesílají podle potřeby (například dotaz GetData
nebo prostředek, Map
můžou vyžadovat vyprázdnění příkazů) nebo podle požadavku vyprázdnění. Vytvoření objektu D3D11 obvykle vede k vytvoření odpovídajícího objektu D3D12. Některé operace vykreslování pevných funkcí v D3D11, jako jsou GenerateMips
nebo DrawAuto
, nejsou podporovány v D3D12, a proto je D3D11On12 emuluje pomocí shaderů a dalších prostředků.
Pro interoperabilitu je důležité pochopit, jak D3D11On12 komunikuje s objekty D3D12, které aplikace vytvořila a poskytla. Aby se zajistilo, že k práci dojde ve správném pořadí, musí být okamžitý kontext D3D11 vyprázdněn, aby bylo možné do této fronty odeslat další práci D3D12. Je také důležité zajistit, aby fronta zadaná D3D11On12 byla vždy vyprázdněná. To znamená, že všechny čekání ve frontě musí být nakonec splněny, a to i v případě, že vlákno D3D11 po neomezenou dobu blokuje. Buďte opatrní, abyste se nemuseli spoléhat na to, kdy D3D11On12 vloží vyprázdnění nebo čekání, protože se to může v budoucích verzích změnit. Kromě toho D3D11On12 sleduje a manipuluje se stavy prostředků samostatně. Jediným způsobem, jak zajistit soulad přechodů stavu, je využít rozhraní API pro získání/vydání k manipulaci se sledováním stavu tak, aby odpovídala potřebám aplikace.
Vyčištění
Aby bylo možné uvolnit zabalený prostředek D3D11On12, musí v tomto pořadí proběhnout dvě věci:
- Všechny odkazy na prostředek, včetně všech zobrazení prostředku, musí být vydány.
- Zpracování odložené zničení musí proběhnout. Nejjednodušší způsob, jak to zajistit, je vyvolat okamžitý kontext
Flush
rozhraní API.
Po dokončení oboutěchtoch prostředků by měly být vydány všechny odkazy provedené zabaleným prostředkem a prostředek D3D12 bude vlastněný výhradně komponentou D3D12. Mějte na paměti, že D3D12 stále vyžaduje čekání na dokončení GPU před úplně uvolněním prostředku, proto před provedením výše uvedených dvou kroků nezapomeňte držet odkaz na prostředek, pokud jste ještě nepotvrdili, že GPU už prostředek nepoužívá.
Všechny ostatní prostředky nebo objekty vytvořené D3D11On12 se v příslušné době vyčistí, jakmile je GPU dokončí, pomocí mechanismu odloženého zničení D3D11. Pokud se ale pokusíte uvolnit samotné zařízení D3D11On12, zatímco GPU se stále spouští, může zničení blokovat, dokud se GPU dokončí.
Omezení
Vrstva D3D11On12 implementuje velmi velkou podmnožinu rozhraní API D3D11, ale existují některé známé mezery (kromě chyb v implementaci, které mohou způsobit nesprávné vykreslování).
Od Windows 10 verze 1809 (10.0; Build 17763), pokud je D3D11On12 spuštěný na ovladači, který podporuje Shader Model 6.0 nebo novější, pak může spouštět shadery, které používají rozhraní. Ve starších verzích Windows není funkce shaderu implementovaná v D3D11On12 a pokus o použití této funkce způsobí chyby a zprávy ladění.
Od Windows 10 verze 1803 (10.0; Build 17134), swapové řetězy se podporují na zařízeních D3D11On12. Ve starších verzích Windows nejsou.
D3D11On12 není optimalizovaný pro výkon. Ve srovnání se standardním ovladačem D3D11, minimální režií GPU a je pravděpodobné, že se jedná o značné režijní náklady na paměť. Proto se nedoporučuje používat D3D11On12 pro složité 3D scény a místo toho se doporučuje pro jednoduché scény nebo 2D vykreslování.
Rozhraní api
Rozhraní API, která tvoří vrstvu 11on12, jsou popsána v 11on12 Reference.
Související témata