Tengo un par de sombreadores de cómputo que deben ejecutarse en un cierto orden y cuyas salidas dependen de entradas anteriores. Idealmente, nunca necesitaré copiar un búfer del lado del cliente y hacer todo mi trabajo en la GPU.
Considere que tengo dos sombreadores de cómputo compilados y vinculados como program_one
y program_two
. Supongamos que también tengo un GL_SHADER_STORAGE_BUFFER
archivo que contiene los datos escritos program_one
y leídos por program_two
. ¿Puedo simplemente hacer lo siguiente:
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);
¿Se garantiza que todas las invocaciones del primer sombreador de cómputo terminarán antes de cualquier invocación del segundo (para evitar carreras de datos entre lectura y escritura buffer
)? Si no, ¿cómo los sincronizo?