2017-02-16 1 views
0

Supposons que je le code suivant (simplifié):Synchronisez les mises à jour tampons uniformes en métal

id<MTLBuffer> uniforms = ...; 
MTLRenderCommandEncoder encoder = ...; 

[uniforms contents] = some_data; 
[encoder setVertexbuffer: uniforms ...]; 

DrawSomethingWithShader("myshader"); 

[uniforms contents] = some_other_data; // WRONG! overwrites previous draw call's uniforms 
[encoder setVertexbuffer: uniforms ...]; 

DrawSomethingElseWithShader("myshader"); 

En Vulkan il y a un mécanisme appelé pour cette vkCmdPipelineBarrier(). Cependant, je ne pouvais pas trouver quelque chose de similaire dans Metal (MTLFence est un candidat, mais apparemment il est utilisé pour d'autres types de choses). Donc, ma question est de savoir comment synchroniser cette mise à jour du tampon?

(ps .: mon idée actuelle est de suivre les modifications dans la mémoire tampon et copier la « seconde données uniforme » à un autre endroit, mais il serait assez compliqué à mettre en œuvre de manière robuste) Vous

Répondre

1

Vous devez vous assurer que les données uniformes pour chaque appel de dessin codé dans un tampon de commande sont accessibles non seulement jusqu'à la fin du codage, mais jusqu'à ce que le tampon de commande lui-même soit terminé. Cela signifie que vous devez ajouter un décalage au pointeur de contenu de la mémoire tampon et écrire les données uniformes pour les appels de dessin consécutifs dans des parties consécutives du tampon. Vous ne devriez alors pas écrire dans la zone de la mémoire tampon correspondant à cette trame jusqu'à ce qu'elle se termine. Comme vous obtiendrez probablement un rappel pour dessiner l'image suivante avant la fin de l'image que vous êtes en train de coder, vous devriez utiliser un groupe de tampons et faire un cycle entre eux, en contrôlant l'accès avec un sémaphore de comptage. Cette recommandation est détaillée dans le Metal Best Practices Guide.

+0

C'est ce dont j'avais peur ... Merci quand même. (Ps .: je laisse la question ouverte pour quelques jours de plus) – Asylum