Comment puis-je profiler séparément la vitesse de mes vertex et fragments shaders?

11

J'aimerais savoir comment vérifier si mon sommet ou mon fragment shader est un goulot d'étranglement dans mon pipeline de rendu.

J'ai lu comment utiliser glQueryCounteravec la GL_TIMESTAMPcible pour obtenir des points de contrôle d'horloge entre les commandes OpenGL, mais ceux-ci ne distinguent pas les différents types de shaders.

Par exemple, si une image du GPU a pris 8 ms pour être rendue, puis-je dire que le vertex shader a pris 7 ms et le fragment shader a pris 1 ms?

Tyler
la source

Réponses:

12

Les vertex et les shaders de fragments s'exécutent simultanément, pas séquentiellement, et le GPU équilibre automatiquement la charge entre eux, il n'est donc pas possible d'affecter de manière significative des temporisations spécifiques telles que 7 ms pour l'une et 1 ms pour l'autre.

Cependant, vous pouvez faire une expérience simple pour mesurer où se trouve le goulot d'étranglement: définissez la matrice de vue-projection sur tous les zéros pour tous vos appels de tirage. Cela fait que tous les sommets sortent zéro pour leurs positions et fait dégénérer tous les triangles; il court-circuite donc toute la pixellisation et l'ombrage des fragments, tout en gardant tout le travail du vertex shader (le compilateur du shader ne peut rien optimiser, car il ne sait pas que la matrice sera mise à zéro à l'exécution).

Lorsque vous mesurez les performances avec les matrices mises à zéro, vous verrez le temps nécessaire pour exécuter uniquement les vertex shaders, sans rasterisation simultanée ni travail d'ombrage de fragment dans le GPU. Vous pouvez ensuite comparer cela au temps nécessaire au rendu ordinaire pour chaque passage. Si les deux temps sont similaires, la passe est probablement fortement liée au sommet; si le rendu de la matrice mise à zéro est nettement plus rapide, il est probablement lié aux pixels. Il est également possible d'obtenir un résultat intermédiaire, indiquant que le travail est réparti à peu près également entre les deux.

Nathan Reed
la source