Utilisation de descripteurs directement dans la signature racine

Pour éviter d’avoir à passer par un tas de descripteur, vous pouvez placer un descripteur directement dans la signature racine. Ces descripteurs occupent beaucoup d’espace dans la signature racine (voir Limites de signature racine). Nous vous recommandons donc de les utiliser avec parcimonie.

Un exemple d’utilisation consiste à placer dans la disposition racine une vue tampon constante (CBV) qui change par dessin. Ainsi, l’espace du tas de descripteur n’a pas à être alloué par l’application par dessin (et enregistre le fait de pointer une table de descripteur vers le nouvel emplacement dans le tas de descripteur). En plaçant quelque chose dans la signature racine, l’application ne fait que confier la responsabilité du contrôle de version au pilote ; mais c’est une infrastructure que les pilotes ont déjà.

Pour un rendu qui utilise très peu de ressources, l’utilisation de table/tas de descripteurs peut ne pas être nécessaire du tout si tous les descripteurs nécessaires peuvent être placés directement dans la signature racine.

Il s’agit des seuls types de descripteurs pris en charge dans la signature racine.

  • Vue tampon constante (CBV).
  • Affichages de ressources du nuanceur (SMV) / vues d’accès non ordonnées (UAV) des ressources de mémoire tampon où la conversion de format n’est pas requise (mémoires tampons non typées). Voici quelques exemples de mémoires tampons non typées qui peuvent être liées à des descripteurs racine : StructuredBuffer<type>, RWStructuredBuffer<type>ByteAddressBuffer et RWByteAddressBuffer. Les mémoires tampons typées telles que Buffer<uint> et Buffer<float2> ne peuvent pas.
  • SSV des structures d’accélération de raytracing, dans des signatures racines locales ou globales.

Un UAV à la racine ne peut pas avoir de compteurs associés. Les descripteurs de la signature racine apparaissent chacun sous forme de descripteurs distincts individuels. Ils ne peuvent pas être indexés dynamiquement.

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

Dans l’exemple ci-dessus, mySceneData ne peut pas être déclaré en tant que tableau, comme s’il cbuffer mySceneData[2] devait être mappé à un descripteur dans la signature racine. En effet, l’indexation entre descripteurs n’est pas prise en charge dans la signature racine. Si vous le souhaitez, vous pouvez définir des mémoires tampons constantes individuelles distinctes et les définir chacune en tant qu’entrée distincte dans la signature racine. Notez que dans ci-dessus mySceneData , il existe un tableau bar[2]. L’indexation dynamique au sein de la mémoire tampon constante est valide: un descripteur dans la signature racine se comporte exactement comme le même descripteur se comporterait s’il était accessible via un tas de descripteur. Cela contraste avec les constantes inline directement dans la signature racine, qui ressemble également à une mémoire tampon constante, sauf avec la contrainte selon laquelle l’indexation dynamique au sein des constantes inline n’est pas autorisée.bar[2]

Ces API (de l’interface ID3D12GraphicsCommandList ) permettent de définir des descripteurs directement sur la signature racine.

Notes

Il n’existe aucun concept de tableau de descripteur racine dans Direct3D 12. Les tableaux de descripteurs sont pris en charge uniquement dans les tas de descripteurs.