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


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 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.