Lekérdezések
A Direct3D 12-ben a lekérdezések lekérdezési halomnak nevezett lekérdezéstömbökbe vannak csoportosítva. A lekérdezési halom olyan típussal rendelkezik, amely meghatározza az adott halomhoz használható érvényes lekérdezéstípusokat.
- A Direct3D 11 és a Direct3D 12 közötti lekérdezések közötti különbségek
- lekérdezési halom
- Lekérdezési halom létrehozása
- Adatok kinyerése lekérdezési
- Kapcsolódó témakörök
A Lekérdezések különbségei a Direct3D 11 és a Direct3D 12 között
A következő lekérdezéstípusok már nem találhatók meg a Direct3D 12-ben, funkciójukat más folyamatokba építik be:
- Eseménylekérdezések – az eseményt most már kerítések kezelik.
- Különálló időbélyeg-lekérdezések – A GPU-órák a Direct3D 12-ben stabil állapotba állíthatók (lásd az Időzítés szakaszt). A GPU-óra összehasonlítása nem értelmezhető, ha a GPU az időbélyegek (más néven különálló lekérdezések) között egyáltalán nem tétlen. Stabil teljesítmény esetén a különböző parancslistákból kiadott két időbélyeg-lekérdezés megbízhatóan összehasonlítható. Az ugyanazon parancslistában szereplő két időbélyeg mindig megbízhatóan összehasonlítható.
- Stream kimeneti statisztikai lekérdezései – a Direct3D 12-ben nincs egyetlen streamkimeneti (SO) túlcsordulási lekérdezés az összes kimeneti adatfolyamhoz. Az alkalmazásoknak több egy streamelt lekérdezést kell kiadniuk, majd korrelálniuk kell az eredményeket.
- Stream kimeneti statisztikái predikálják és elzárják a lekérdezéseket – a lekérdezések (amelyek memóriába írnak) és Predikációs (amely a memóriából olvas) már nem lesznek összekapcsolva, ezért ezekre a lekérdezéstípusokra nincs szükség.
A Direct3D 12-be új bináris elzáródási lekérdezéstípus lett hozzáadva. Ez lehetővé teszi az olyan predikációs stratégiákat, amelyek csak azt figyelik, hogy egy objektum teljesen el van-e zárt, vagy sem (ahelyett, hogy hány képpont volt elzárva), hogy jelezzék ezt az eszköznek, amely hatékonyabban tudja elvégezni a lekérdezéseket.
Lekérdezési halom
A lekérdezések több típusból (D3D12_QUERY_HEAP_TYPE) is lehetnek, és lekérdezési halomba vannak csoportosítva, mielőtt elküldené őket a GPU-nak.
Egy új lekérdezéstípus D3D12_QUERY_TYPE_BINARY_OCCLUSION érhető el, és úgy működik, mint D3D12_QUERY_TYPE_OCCLUSION, kivéve, hogy bináris 0/1 eredményt ad vissza: a 0 azt jelzi, hogy a minták nem mentek át a mélységen és a rajzsablon tesztelésén, 1 azt jelzi, hogy legalább egy minta átment a mélységen és a rajzsablon tesztelésén. Ez lehetővé teszi, hogy az occlusion-lekérdezések ne zavarják a mélységi/rajzsablon-teszteléshez társított GPU-teljesítményoptimalizálást.
Lekérdezési halom létrehozása
A lekérdezési halom létrehozása szempontjából releváns API-k az enumerálási D3D12_QUERY_HEAP_TYPE, a strukturálási D3D12_QUERY_HEAP_DESCés a CreateQueryHeapmetódus.
Az alapvető futtatókörnyezet ellenőrzi, hogy a lekérdezés halomtípusa érvényes tagja-e a D3D12_HEAP_TYPE számbavételnek, és hogy a szám nagyobb-e 0-nál.
A lekérdezési halom minden egyes lekérdezéseleme külön indítható el és állítható le.
A lekérdezési halomok használatára szolgáló API-k az enumerálási D3D12_QUERY_TYPE, valamint a BeginQueryés EndQuerymetódusok.
D3D12_QUERY_TYPE_TIMESTAMP az egyetlen lekérdezés, amely csak EndQuery támogat. Minden más lekérdezéstípushoz BeginQuery és EndQueryszükséges.
A hibakeresési réteg a következőket ellenőrzi:
- Nem engedélyezett időbélyeg-lekérdezés indítása – csak a lekérdezést lehet befejezni
- A lekérdezést nem lehet kétszer elkezdeni anélkül, hogy befejezené (egy adott elem esetében). Az olyan lekérdezések esetében, amelyek mind a kezdést, mind a befejezést igénylik, a lekérdezést a megfelelő kezdés előtt (adott elem esetén) nem lehet befejezni.
- A BeginQueryátadott lekérdezéstípusnak meg kell egyeznie a EndQuery.
Az alapvető futtatókörnyezet a következőket ellenőrzi:
BeginQuery nem hívhatók meg időbélyeg-lekérdezésen.
Az BeginQuery és EndQuery egyaránt támogató lekérdezéstípusok esetében (az időbélyeg kivételével) egy adott elem lekérdezése nem terjedhet ki a parancslista határaira.
ElementIndex tartományon belül kell lennie.
A lekérdezés típusa a D3D12_QUERY_TYPE enumerálás érvényes tagja.
A lekérdezés típusának kompatibilisnek kell lennie a lekérdezési halommal. Az alábbi táblázat az egyes lekérdezéstípusokhoz szükséges lekérdezési halomtípust mutatja be:
Lekérdezés típusa Lekérdezési halom típusa D3D12_QUERY_TYPE_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_BINARY_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_TIMESTAMP D3D12_QUERY_HEAP_TYPE_TIMESTAMP D3D12_QUERY_TYPE_PIPELINE_STATISTICS D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS A lekérdezés típusát a parancslista típusa támogatja. Az alábbi táblázat azt mutatja be, hogy mely lekérdezések támogatottak a parancslista-típusok esetében.
Lekérdezés típusa Támogatott parancslistatípusok D3D12_QUERY_TYPE_OCCLUSION Közvetlen D3D12_QUERY_TYPE_BINARY_OCCLUSION Közvetlen D3D12_QUERY_TYPE_TIMESTAMP Közvetlen, számítási és opcionális másolási D3D12_QUERY_TYPE_PIPELINE_STATISTICS Közvetlen D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 Közvetlen D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 Közvetlen D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 Közvetlen D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 Közvetlen
Adatok kinyerése lekérdezésből
A lekérdezések adatainak kinyerése a ResolveQueryData metódus használatával történik. ResolveQueryData minden memóriatípussal működik (legyen az rendszermemória vagy az eszköz helyi memóriája), de a célerőforrásnak D3D12_RESOURCE_STATE_COPY_DESTkell lennie.