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


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.

D2D-t d3D11on12-bemutató

A Direct3D 12 ismertetése

A Direct3D 11, a Direct3D 10 és a Direct2D használata