Direct3D 11 on 12
A D3D11On12 egy olyan mechanizmus, amellyel a fejlesztők D3D11 interfészeket és objektumokat használhatnak a D3D12 API meghajtóihoz. A D3D11on12 lehetővé teszi, hogy a D3D11 használatával írt összetevők (például D2D szöveg és felhasználói felület) együttműködjenek a D3D12 API-val megírt összetevőkkel. A D3D11on12 lehetővé teszi az alkalmazások Növekményes portolását a D3D11-ről a D3D12-be, mivel lehetővé teszi, hogy az alkalmazás egyes részei továbbra is a D3D11-et célba vegyenek az egyszerűség kedvéért, míg mások a D3D12-t célják a teljesítmény érdekében, miközben mindig teljes és helyes renderelést végeznek. A D3D11On12 egyszerűbbé teszi az erőforrások megosztását és a munka szinkronizálását a két API között, mint az interop technikák használata.
A D3D11On12 inicializálása
A D3D11On12 használatának első lépése egy D3D12-eszköz és parancssor létrehozása. Ezek az objektumok a D3D11On12CreateDevice inicializálási módszer bemeneteként vannak megadva. Erre a módszerre úgy gondolhat, mint egy D3D11-eszköz létrehozására a képzeletbeli illesztőtípusú D3D_DRIVER_TYPE_11ON12, ahol a D3D11 illesztőprogram feladata objektumok létrehozása és parancslisták küldése a D3D12 API-nak.
Miután rendelkezik D3D11-eszközzel és közvetlen környezettel, QueryInterface
kikapcsolhatja az eszközt az ID3D11On12Device interfészhez. Ez az elsődleges interfész, amelyet a D3D11 és a D3D12 közötti együttműködéshez használnak. Ahhoz, hogy a D3D11 eszközkörnyezet és a D3D12 parancslisták ugyanazon az erőforráson működjenek, létre kell hozni a "burkolt erőforrásokat" a CreateWrappedResource API használatával. Ez a módszer "előléptet" egy D3D12-erőforrást, hogy érthető legyen a D3D11-ben. A burkolt erőforrás a "beolvasva" állapotból indul ki, amely a AcquireWrappedResources és ReleaseWrappedResources metódusok által manipulált tulajdonság.
Használati példa
A D3D11On12 tipikus használata a D2D használata szöveg vagy képek D3D12 háttérpufferen való megjelenítésére. Példakódként tekintse meg a D3D11On12 mintát. Az alábbiakban az ehhez szükséges lépések vázlatát mutatjuk be:
- Hozzon létre egy D3D12-eszközt (D3D12CreateDevice) és egy D3D12 swapláncot (CreateSwapChain egy ID3D12CommandQueue bemenetként).
- Hozzon létre egy D3D11On12-eszközt a D3D12 eszközzel, és ugyanazt a parancssort, mint a bemenet.
- Kérje le a felcserélési lánc visszapuffereit, és hozzon létre D3D11 burkolt erőforrásokat mindegyikhez. A használt bemeneti állapotnak kell lennie a D3D12 utolsó felhasználási módjának (például RENDER_TARGET), és a kimeneti állapotnak a D3D12 által a D3D11 befejezése után használtnak kell lennie (pl. PRESENT).
- Inicializálja a D2D-t, és adja meg a D3D11 burkolt erőforrásait a D2D-nek a renderelésre való felkészüléshez.
Ezután minden egyes kereten tegye a következőket:
- Renderelje az aktuális felcserélési lánc visszapufferét egy D3D12 parancslistával, és hajtsa végre.
- Szerezze be az aktuális háttérpuffer burkolt erőforrását (AcquireWrappedResources).
- D2D-renderelési parancsok kiadása.
- Engedje fel a burkolt erőforrást (ReleaseWrappedResources).
- A D3D11 közvetlen környezetének kiürítése.
- Present (IDXGISwapChain1::P resent1).
Háttér
A D3D11On12 szisztematikusan működik. Minden D3D11 API-hívás végighalad a tipikus futtatókörnyezet-ellenőrzésen, és utat tesz az illesztőprogramhoz. Az illesztőprogram-rétegben a speciális 11on12 illesztőprogram rögzíti az állapotot, és a D3D12 parancslisták renderelési műveleteivel kapcsolatos problémákat tapasztal. Ezeket a parancslistákat szükség szerint küldi el (például egy lekérdezés GetData
vagy erőforrás-Map
megkövetelheti a parancsok kiürítését), vagy a Flush kérésének megfelelően. A D3D11 objektum létrehozása általában a megfelelő D3D12-objektum létrehozását eredményezi. A D3D11 egyes rögzített függvénymegjelenítési műveletei, például GenerateMips
vagy DrawAuto
nem támogatottak a D3D12-ben, ezért a D3D11On12 árnyékolók és további erőforrások használatával emulálja őket.
Az interop esetében fontos megérteni, hogy a D3D11On12 hogyan kommunikál az alkalmazás által létrehozott és megadott D3D12 objektumokkal. Annak érdekében, hogy a munka a megfelelő sorrendben történjen, a D3D11 közvetlen környezetét ki kell üríteni, mielőtt további D3D12-munkákat lehetne elküldeni az üzenetsorba. Azt is fontos biztosítani, hogy a D3D11On12-nek adott üzenetsornak mindig üríthetőnek kell lennie. Ez azt jelenti, hogy az üzenetsoron való várakozásnak végül teljesülnie kell, még akkor is, ha a D3D11 renderelési szál korlátlan ideig blokkolva van. Ügyeljen arra, hogy ne függjön attól, ha a D3D11On12 beszúrja a öblítést vagy várakozást, mivel ez a jövőbeli kiadásokban változhat. Emellett a D3D11On12 önállóan követi nyomon és módosítja az erőforrás-állapotokat. Az állapotváltások egységességének egyetlen módja az, ha a beolvasási/kiadási API-k használatával manipulálják az állapotkövetést az alkalmazás igényeinek megfelelően.
Tisztítás
A D3D11On12 burkolt erőforrás kiadásához két dolognak kell ebben a sorrendben történnie:
- Az erőforrásra mutató összes hivatkozást, beleértve az erőforrás bármely nézetét, közzé kell tenni.
- A késleltetett megsemmisítés feldolgozását el kell végezni. Ennek legegyszerűbb módja az, ha meghívja a közvetlen környezetet
Flush
API-t.
Mindkét lépés elvégzése után a burkolt erőforrás által készített hivatkozásokat fel kell szabadítani, és a D3D12 erőforrás kizárólagos tulajdonosa a D3D12 összetevő lesz. Vegye figyelembe, hogy a D3D12-nek még várnia kell a GPU befejezésére az erőforrás teljes felszabadítása előtt, ezért a fenti két lépés végrehajtása előtt mindenképpen tartsa lenyomva az erőforrásra vonatkozó hivatkozást, kivéve, ha már megerősítette, hogy a GPU már nem használja az erőforrást.
A D3D11On12 által létrehozott összes többi erőforrást vagy objektumot a rendszer a megfelelő időpontban törli, amikor a GPU befejezte a használatukat a D3D11 késleltetett megsemmisítési mechanizmusának használatával. Ha azonban magát a D3D11On12 eszközt próbálja felszabadítani, miközben a GPU továbbra is fut, a megsemmisítés blokkolhatja, amíg a GPU be nem fejeződik.
Korlátozások
A D3D11On12 réteg a D3D11 API egy nagyon nagy részét implementálja, de vannak ismert hiányosságok (a megvalósítás hibái mellett, amelyek helytelen renderelést okozhatnak).
A Windows 10 1809-es verziójától (10.0; 17763-as build), amíg a D3D11On12 olyan illesztőprogramon fut, amely támogatja a Shader Model 6.0-s vagy újabb verzióját, akkor interfészeket használó árnyékolókat futtathat. A Windows korábbi verzióiban az árnyékoló felületi funkció nincs implementálva a D3D11On12-ben, és a funkció használatának megkísérlése hibákat és hibakeresési üzeneteket fog okozni.
A Windows 10 1803-as verziója (10.0; Az 17134-ben buildelt felcserélési láncok D3D11On12-eszközökön támogatottak. A Windows korábbi verzióiban nem.
A D3D11On12 nincs teljesítményre optimalizálva. A normál D3D11-illesztőhöz képest valószínűleg mérsékelt processzorterhelés, minimális GPU-többletterhelés, és ismert, hogy jelentős memóriaterhelés áll fenn. Ezért nem ajánlott a D3D11On12 használata bonyolult 3D jelenetekhez, és inkább egyszerű jelenetekhez vagy 2D-s rendereléshez ajánlott.
Api
Az 11on12 réteget alkotó API-kat az 11on12 referenciaismerteti.
Kapcsolódó témakörök
-
A Direct3D 12 ismertetése
-
A Direct3D 11, a Direct3D 10 és a Direct2D használata