Aufeinanderfolgende OpenGL Compute Shader-Aufrufe synchronisieren

12

Ich habe ein paar Compute-Shader, die in einer bestimmten Reihenfolge ausgeführt werden müssen und deren Ausgabe von vorherigen Eingaben abhängt. Im Idealfall muss ich niemals einen Pufferspeicher clientseitig kopieren und die gesamte Arbeit an der GPU ausführen.

Angenommen, ich habe zwei Compute-Shader kompiliert und als program_oneund verknüpft program_two. Angenommen, ich habe auch eine GL_SHADER_STORAGE_BUFFER, die die Daten enthält, in die geschrieben und von denen program_onegelesen wird program_two. Kann ich einfach folgendes machen:

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);

Ist sichergestellt, dass alle Aufrufe des ersten Compute-Shaders vor den Aufrufen des zweiten beendet werden (um Datenrennen zwischen Lesen und Schreiben zu vermeiden buffer)? Wenn nicht, wie synchronisiere ich sie?

Mokosha
quelle

Antworten:

12

Nein, das kann nicht garantiert werden, da die OpenGL-Spezifikation es erlaubt, dass zwei Compute Shader gleichzeitig oder sogar in unterschiedlicher Reihenfolge ausgeführt werden.

Sie müssen glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)vor der zweiten anrufen glDispatchCompute, um die Sichtbarkeit der Schreibvorgänge zu gewährleisten program_one.


Aus dem OpenGL.org-Wiki-Artikel zum Speichermodell :

Aufrufe zwischen Stufen können in beliebiger Reihenfolge ausgeführt werden. Dies schließt Aufrufe ein, die von verschiedenen Rendering-Befehlen gestartet werden. Es ist zwar unwahrscheinlich, dass zwei Vertex-Shader aus verschiedenen Rendering-Vorgängen gleichzeitig ausgeführt werden, dies ist jedoch auch möglich, sodass OpenGL keine Garantien bietet .

Aus dem Opengl.org-Wiki-Artikel zum Shader-Speicherpuffer :

Beim Lesen und Schreiben von SSBOs werden inkohärente Speicherzugriffe verwendet, daher benötigen sie die entsprechenden Barrieren, genau wie beim Laden von Abbildern.

Wumpf
quelle