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_one
et program_two
. Supposons que j'en ai également un GL_SHADER_STORAGE_BUFFER
qui contient les données écrites par program_one
et 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?
la source