Comment fonctionne le cache de texture dans le GPU de rendu basé sur les tuiles

9

Comment le cache fonctionne-t-il avec le rendu basé sur les tuiles?

Y a-t-il des conseils sur la façon d'améliorer le taux d'accès au cache pour cela? (par exemple, si les tuiles sont traitées horizontalement et que j'ai des segments verticaux de triangles avec la même texture, cela fonctionne-t-il moins bien pour le cache que si j'avais des triangles disposés horizontalement?)

Felipe Lira
la source
1
Qu'entendez-vous par disposition verticale ou horizontale des triangles?
Mokosha
@Mokosha désolé, cela est en quelque sorte passé inaperçu pour moi. Je viens de le voir maintenant. C'est plus une question théorique que pratique et je ne sais même pas si cela a du sens maintenant. Quoi qu'il en soit, ce que je voulais dire, disons qu'un triangle intersecte les tuiles (x, y) et (x + 1, y) et que ces deux tuiles sont traitées l'une après l'autre. Serait-ce mieux pour le cache de texture que si j'avais un triangle coupant (x, y) et (x, y + 1)? (En raison des pixels de bordure et de la disposition des triangles n'étant pas dans la même direction que le traitement des tuiles)
Felipe Lira

Réponses:

19

Qu'il s'agisse d'un GPU basé sur des tuiles ou non, cela n'affecte pas vraiment l'architecture du cache de texture. La disposition de la mémoire de la texture ressemblera à une saveur de l' ordre de Morton ou de la courbe de Hilbert dans tous les GPU.

En conséquence, il est plus efficace de rendre les triangles proches des triangles équilatéraux car le système de mémoire GPU récupère les lignes de cache des texels.

Donc, évidemment, sur les bordures de tuiles, il peut arriver que vous deviez chercher deux texels. Cela a un faible coût car les bordures de tuiles ne sont que «quelques» pixels.

On peut dire que les GPU de bureau se comportent de manière identique aux GPU basés sur des tuiles comme le montrent des expériences telles que les suivantes: http://www.g-truc.net/post-0597.html

La taille des tuiles diffère, mais les deux architectures traitent en fait des fragments dans une hiérarchie de tuiles de différentes tailles.

Lors du codage de GPU basés sur des tuiles, ma recommandation est de toujours avoir à l'esprit:

  1. Ne changez pas d'objet framebuffer sauf si vous en avez vraiment besoin.
  2. Lors de la liaison d'un nouvel objet framebuffer, si vous n'avez pas besoin d'enregistrer le contenu du framebuffer actuel, jetez-le. Si vous ne souhaitez pas charger le contenu du nouveau framebuffer, vous devez effacer le framebuffer.
Christophe
la source
J'ai mis à jour le deuxième élément car la modification n'était pas ce que je voulais dire. Sinon, ça a l'air super!
Christophe
Salut Christophe, tu voulais dire des triangles "équilatéraux" plutôt que "isocèles"? Plutôt que "Hilbert", j'aurais dit "Morton" car l'adressage est beaucoup plus facile dans le matériel.
Simon F
@Christophe merci! C'est vraiment utile. Donc, pour les pixels de bordure, le cache de texture n'a-t-il pas d'importance? C'est un peu ce que je me demandais. Donc, si j'ai un triangle qui coupe les carreaux (x, y) et (x + 1, y) et le GPU juste tramé (x, y). En supposant que la tuile (x + 1, y) sera la prochaine, même si une unité d'exécution différente la traite, ne bénéficierai-je pas du cache de texture lors de l'échantillonnage de texels pour ce triangle?
Felipe Lira
Aussi, je suis devenu curieux au sujet du motif Hilbert. J'ai toujours supposé que c'était vrai pour les textures compressées par blocs. Est-ce vrai pour toutes les textures? PS: Je n'ai pas non plus suivi le dernier paragraphe.
Felipe Lira du
PVRTC encode les blocs de texture dans un ordre morton
ashleysmithgpu