web-dev-qa-db-fra.com

Qu'est-ce qu'un "Push-Constant" en vulkan?

J'ai parcouru un tas de tutoriels qui parlent des constantes Push, font allusion à des avantages possibles, mais je n'ai jamais vraiment vu, même dans les documents Vulkan, ce qu'est vraiment une "constante Push" ... Je ne comprends pas ce qu'elles sont censées être et quel est le but des constantes Push. La chose la plus proche que je peux trouver est ceci post qui ne demande malheureusement pas ce qu'ils sont, mais quelles sont les différences entre eux et un autre concept et ne m'a pas beaucoup aidé.

Qu'est-ce qu'une constante Push, pourquoi existe-t-elle et à quoi sert-elle? d'où vient son nom?

12
opa

Les constantes push sont un moyen de fournir rapidement une petite quantité de données uniformes aux shaders. Cela devrait être beaucoup plus rapide que les UBO, mais la taille des données est très limitée - la spécification nécessite 128 octets pour être disponible pour une plage de constantes Push. Les fournisseurs de matériel peuvent en prendre davantage en charge, mais par rapport à d'autres moyens, il est encore très peu (par exemple 256 octets).

Étant donné que les constantes Push sont beaucoup plus rapides que les autres descripteurs (ressources par lesquelles nous fournissons des données aux shaders), elles sont pratiques à utiliser pour les données qui changent entre les appels de dessin, comme par exemple les matrices de transformation.

Du point de vue du shader, ils sont déclarés via le qualificatif layout( Push_constant ) et un bloc de données uniformes. Par exemple:

layout( Push_constant ) uniform ColorBlock {
  vec4 Color;
} PushConstant;

Du point de vue de l'application, si les shaders souhaitent utiliser des constantes Push, elles doivent être spécifiées lors de la création de la disposition du pipeline. Ensuite, la commande vkCmdPushConstants() doit être enregistrée dans un tampon de commande. Cette fonction prend, entre autres, un pointeur vers une mémoire à partir de laquelle les données vers une plage de constantes Push doivent être copiées.

Différentes étapes de shader d'un pipeline donné peuvent utiliser le même bloc constant Push (de manière similaire aux UBO) ou des parties plus petites de toute la gamme. Mais, ce qui est important, chaque étape du shader ne peut utiliser qu'un seul bloc constant Push. Il peut cependant contenir plusieurs membres. Une autre chose importante est que la taille totale des données (sur toutes les étapes de shader qui utilisent des constantes Push) doit tenir dans la contrainte de taille. La contrainte n'est donc pas par étape mais par gamme entière.

Il y a un exemple dans le livre de recettes Vulkan référentiel montrant un scénario simple d'utilisation constante de Push. exemples Vulkan de Sascha Willems contiennent également un exemple montrant comment utiliser les constantes Push.

10
Ekzuzy