Dotazy
V Direct3D 12 se dotazy seskupují do polí dotazů označovaných jako halda dotazu. Halda dotazu má typ, který definuje platné typy dotazů, které lze použít s danou haldou.
- rozdíly v dotazech z Direct3D 11 na Direct3D 12
- haldy dotazů
- vytváření hald dotazů
- extrahování dat z dotazu
- související témata
Rozdíly v dotazech z Direct3D 11 na Direct3D 12
Následující typy dotazů již nejsou v Direct3D 12 přítomny, jejich funkce jsou začleněny do jiných procesů:
- dotazy událostí – událost je nyní funkčně zpracována ploty.
- oddělené dotazy časového razítka – hodiny GPU je možné nastavit na stabilní stav direct3D 12 (viz část časování). Porovnání hodin GPU není smysluplné, pokud se GPU vůbec mezi časovými razítky (označuje se jako nesouvislý dotaz). S stabilním výkonem jsou dotazy ve dvou časových razítkech vydané z různých seznamů příkazů spolehlivě srovnatelné. Dvě časová razítka ve stejném seznamu příkazů jsou vždy spolehlivě srovnatelné.
- dotazy na výstupní statistiky streamu – v Direct3D 12 neexistuje žádný dotaz na přetečení jednoho datového proudu (SO) pro všechny výstupní streamy. Aplikace musí vydávat více dotazů s jedním datovým proudem a pak korelovat výsledky.
- predikátu a predikátu predikátu výstupu streamu dotazů – dotazy (které zapisují do paměti) a predikace (která čte z paměti) už nejsou svázané, a proto tyto typy dotazů nejsou potřeba.
Do Direct3D 12 byl přidán nový typ dotazu binárního okluze. To umožňuje strategii predikace, která se stará pouze o to, zda byl objekt zcela odlehlé (místo toho, kolik pixelů bylo odlehlé) indikovat toto zařízení, což by mohlo být schopno efektivněji provádět dotazy.
Haldy dotazů
Dotazy můžou být z řady typů (D3D12_QUERY_HEAP_TYPE) a před odesláním do GPU jsou seskupené do hald dotazů.
Nový typ dotazu D3D12_QUERY_TYPE_BINARY_OCCLUSION je k dispozici a funguje jako D3D12_QUERY_TYPE_OCCLUSION s tím rozdílem, že vrátí binární výsledek 0/1: 0 značí, že žádné vzorky neprošly hloubkou a testování vzorníku, 1 značí, že alespoň jeden vzorek prošel hloubkou a testováním vzorníku. To umožňuje, aby dotazy na okluzi nenarušovaly žádnou optimalizaci výkonu GPU spojenou s testováním hloubky nebo vzorníku.
Vytváření hald dotazů
Rozhraní API relevantní pro vytváření hald dotazů jsou výčtové D3D12_QUERY_HEAP_TYPE, struktura D3D12_QUERY_HEAP_DESCa metoda CreateQueryHeap.
Modul runtime jádra ověří, že typ haldy dotazu je platným členem D3D12_HEAP_TYPE výčtu a že počet je větší než 0.
Každý jednotlivý prvek dotazu v haldě dotazu lze spustit a zastavit samostatně.
Rozhraní API pro použití hald dotazů jsou výčtové D3D12_QUERY_TYPEa metody BeginQuery a EndQuery.
D3D12_QUERY_TYPE_TIMESTAMP je jediný dotaz, který podporuje pouze endQuery. Všechny ostatní typy dotazů vyžadujíBeginQuery a EndQuery .
Ladicí vrstva ověří následující:
- Zahájení dotazu s časovým razítkem je neplatné – můžete ho ukončit pouze
- Nelze zahájit dotaz dvakrát bez jeho ukončení (pro daný prvek). U dotazů, které vyžadují začátek i konec, je neplatné ukončit dotaz před odpovídajícím zahájením (pro daný prvek).
- Typ dotazu předaný BeginQuery musí odpovídat typu dotazu předaného EndQuery.
Základní modul runtime ověří následující:
Pro typy dotazů, které podporují BeginQuery a EndQuery (kromě časového razítka), nesmí dotaz pro daný prvek přesahovat hranice seznamu příkazů.
ElementIndex musí být v rozsahu.
Typ dotazu je platným členem výčtu D3D12_QUERY_TYPE.
Typ dotazu musí být kompatibilní s haldou dotazu. Následující tabulka ukazuje typ haldy dotazu vyžadovaný pro každý typ dotazu:
Typ dotazu Typ haldy dotazu 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 Typ dotazu je podporován typem seznamu příkazů. Následující tabulka ukazuje, které dotazy jsou podporovány u kterých typů seznamů příkazů.
Typ dotazu Podporované typy seznamů příkazů D3D12_QUERY_TYPE_OCCLUSION Nasměrovat D3D12_QUERY_TYPE_BINARY_OCCLUSION Nasměrovat D3D12_QUERY_TYPE_TIMESTAMP Přímé, výpočetní a volitelné kopírování D3D12_QUERY_TYPE_PIPELINE_STATISTICS Nasměrovat D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 Nasměrovat D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 Nasměrovat D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 Nasměrovat D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 Nasměrovat
Extrahování dat z dotazu
Způsob, jak extrahovat data z dotazu, je použít metodu ResolveQueryData. ResolveQueryData funguje se všemi typy paměti (ať už jde o systémovou paměť nebo místní paměť zařízení), ale vyžaduje, aby cílový prostředek byl v D3D12_RESOURCE_STATE_COPY_DEST.