Définition et remplissage des tas de descripteurs

Les types de tas de descripteurs qui peuvent être définis dans une liste de commandes sont ceux qui contiennent des descripteurs pour lesquels des tables de descripteurs peuvent être utilisées (au plus une de chacune à la fois).

Définition des tas de descripteurs

Les types de tas de descripteur qui peuvent être définis dans une liste de commandes sont les suivants :

D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV
D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER

Les tas définis dans la liste de commandes doivent également avoir été créés en tant que nuanceur visible. Il existe trois types de liste de commandes : DIRECT, BUNDLE et COMPUTE.

Une fois qu’un tas de descripteur est défini dans une liste de commandes, les appels suivants qui définissent des tables de descripteurs font référence au tas de descripteur actuel. L’état de la table de descripteur n’est pas défini au début d’une liste de commandes et après la modification des tas de descripteurs dans une liste de commandes. La définition redondante du même tas de descripteur n’entraîne pas la non-définition des paramètres de la table de descripteur.

Dans un bundle, en revanche, les tas de descripteurs ne peuvent être définis qu’une seule fois (les appels redondants définissant deux fois le même tas ne produisent pas d’erreur) ; sinon, le comportement n’est pas défini. Les tas de descripteurs définis doivent correspondre à l’état quand une liste de commandes appelle le bundle ; sinon, le comportement n’est pas défini. Cela permet aux bundles d’hériter et de modifier les paramètres de table de descripteur de la liste de commandes. Les bundles qui ne modifient pas les tables de descripteurs (en héritent uniquement) n’ont pas besoin de définir un tas de descripteurs et héritent simplement de la liste de commandes appelante.

Lorsque les tas de descripteurs sont définis (à l’aide de ID3D12GraphicsCommandList::SetDescriptorHeaps), tous les tas utilisés sont définis dans un seul appel (et tous les tas précédemment définis sont non définis par l’appel). Au maximum un tas de chaque type listé ci-dessus peut être défini dans l’appel.

Remplissage des tas de descripteurs

Une fois qu’une application a créé un tas de descripteurs, elle peut ensuite utiliser des méthodes sur l’appareil pour générer des descripteurs directement dans le tas ou copier des descripteurs d’un emplacement à un autre.

Le contenu initial de la mémoire du tas de descripteur n’étant pas défini, demander au GPU ou au pilote de référencer la mémoire non initialisée pour le rendu peut entraîner des résultats non définis, tels qu’une réinitialisation de périphérique.

Si l’application configure un tas de descripteur pour qu’il soit visible par le processeur, l’UC peut appeler des méthodes pour créer des descripteurs dans le tas et les copier d’un endroit à l’autre (y compris entre les tas) de manière immédiate et libre. Si le tas a été configuré comme SHADER_VISIBLE, la lecture par le processeur n’est pas autorisée.

Tas de descripteurs