Sdílet prostřednictvím


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

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í:

  • BeginQuery nelze volat v dotazu časového razítka.

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