Synchronisation des appels successifs d'OpenGL Compute Shader

12

J'ai quelques shaders de calcul qui doivent être exécutés dans un certain ordre et dont les sorties dépendent des entrées précédentes. Idéalement, je n'aurai jamais besoin de copier un tampon côté client et de faire tout mon travail sur le GPU.

Considérez que j'ai deux shaders de calcul compilés et liés comme program_oneet program_two. Supposons que j'en ai également un GL_SHADER_STORAGE_BUFFERqui contient les données écrites par program_oneet lues par program_two. Puis-je simplement faire ce qui suit:

glUseProgram(program_one);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);

glUseProgram(program_two);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);

Est-il garanti que toutes les invocations du premier shader de calcul se termineront avant toutes les invocations du second (pour éviter les courses de données entre la lecture et l'écriture buffer)? Sinon, comment les synchroniser?

Mokosha
la source

Réponses:

12

Non, ce n'est pas garanti, car la spécification OpenGL permet que deux Compute Shader s'exécutent simultanément ou même dans un ordre différent.

Vous devez appeler glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)avant la seconde glDispatchComputepour assurer la visibilité des écritures program_one.


Extrait de l'article wiki d'OpenGL.org sur le modèle de mémoire :

[...] les invocations entre les étapes peuvent être exécutées dans n'importe quel ordre. Cela inclut les appels lancés par différentes commandes de rendu. Bien qu'il soit peut-être peu probable que deux vertex shaders d'opérations de rendu différentes puissent s'exécuter en même temps, il est également possible, donc OpenGL ne fournit aucune garantie .

Extrait de l'article wiki d'Opengl.org sur Shader Storage Buffer :

Les opérations de lecture et d'écriture SSBO utilisent des accès mémoire incohérents, elles ont donc besoin des barrières appropriées, tout comme les opérations de chargement de l'image.

Wumpf
la source