Ho un paio di shader di calcolo che devono essere eseguiti in un certo ordine e le cui uscite dipendono dagli ingressi precedenti. Idealmente, non dovrò mai copiare un buffer lato client e fare tutto il mio lavoro sulla GPU.
Considera che ho due shader di calcolo compilati e collegati come program_one
e program_two
. Supponiamo di avere anche un file GL_SHADER_STORAGE_BUFFER
contenente i dati scritti program_one
e letti da program_two
. Posso semplicemente fare quanto segue:
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);
È garantito che tutte le invocazioni del primo shader di calcolo finiranno prima di qualsiasi invocazione del secondo (per evitare corse di dati tra lettura e scrittura buffer
)? In caso contrario, come posso sincronizzarli?