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_onee program_two. Supponiamo di avere anche un file GL_SHADER_STORAGE_BUFFERcontenente i dati scritti program_onee 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?