Sdílet prostřednictvím


Použití popisovačů přímo v kořenovém podpisu

Abyste se vyhnuli nutnosti procházet haldu popisovače, můžete popisovač vložit přímo do kořenové signatury (root signature). Tyto popisovače zabírají hodně místa v kořenovém podpisu (viz omezení kořenových podpisů), takže doporučujeme je používat střídmě.

Příkladem použití by bylo umístit do kořenového rozložení zobrazení konstantní vyrovnávací paměti (CBV), které se mění pro každý vykreslovací cyklus. To znamená, že prostor haldy deskriptorů nemusí být přidělen aplikací pro každou kresbu (a šetří potřebu ukazovat tabulku popisovačů na nové místo v haldě popisovačů). Když něco vložíte do kořenového podpisu, aplikace pouze dává ovladači odpovědnost za správu verzí; ale to je infrastruktura, kterou už ovladače mají.

Při vykreslování s extrémně nízkými nároky na prostředky nemusí být vůbec potřeba používat tabulky/haldy deskriptorů, pokud lze všechny potřebné popisovače umístit přímo do kořenového podpisu.

Jedná se o jediné typy popisovačů podporovaných v kořenovém podpisu.

  • Zobrazení konstantní vyrovnávací paměti (CBVs).
  • Zobrazení prostředků shaderu (SRV) / neuspořádaná přístupová zobrazení (UAV) prostředků vyrovnávací paměti, u kterých není vyžadován převod formátu (nezatypované vyrovnávací paměti). Mezi příklady netypových vyrovnávacích pamětí, které lze svázat s kořenovými popisovači, patří StructuredBuffer<type>, RWStructuredBuffer<type>, ByteAddressBuffer a RWByteAddressBuffer. Typované vyrovnávací paměti, jako jsou Buffer<uint> a Buffer<float2> nemůžou.
  • SRV pro urychlovací struktury raytracingu, v lokální nebo globální kořenové signatuře.

UAV v kořeni nemůže mít přidružené čítače. Popisovače v kořenovém podpisu se zobrazují jako samostatné popisovače – nedají se dynamicky indexovat.

struct SceneData
{
   uint foo;
   float bar[2];
   int moo;
};
ConstantBuffer<SceneData> mySceneData : register(b6);

V předchozím příkladu nelze mySceneData deklarovat jako pole, stejně jako v cbuffer mySceneData[2], pokud se namapuje na popisovač v kořenovém podpisu. Je to proto, že indexování napříč popisovači není v kořenovém podpisu podporováno. V případě potřeby můžete definovat samostatné jednotlivé vyrovnávací paměti konstant a definovat je jako samostatnou položku v kořenovém podpisu. Všimněte si, že v mySceneData výše je pole bar[2]. Dynamické indexování v rámci konstantního bufferu je platné – popisovač v kořenovém podpisu se chová stejně jako stejný popisovač, kdyby byl přístupný prostřednictvím haldy popisovačů. To je na rozdíl od vkládání konstant přímo v kořenovém podpisu, který se také zobrazuje jako konstantní vyrovnávací paměť, s omezením, že dynamické indexování uvnitř vložených konstant není povoleno, takže bar[2] by tam nebyl povolen.

Tato rozhraní API (z rozhraní ID3D12GraphicsCommandList) slouží k nastavení popisovačů přímo v kořenovém podpisu.

Poznámka

Neexistuje koncept pole kořenového popisovače v Direct3D 12. Pole deskriptorů jsou podporována pouze v haldách deskriptorů.