Eu tenho alguns shaders de computação que precisam ser executados em uma determinada ordem e cujas saídas dependem de entradas anteriores. Idealmente, nunca precisarei copiar um buffer do lado do cliente e fazer todo o meu trabalho na GPU.
Considere que eu tenho dois shaders de computação compilados e vinculados como program_one
e program_two
. Suponha que eu também tenha um GL_SHADER_STORAGE_BUFFER
que contém os dados que são gravados program_one
e lidos por program_two
. Posso simplesmente fazer o seguinte:
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);
É garantido que todas as invocações do primeiro sombreador de computação terminem antes de qualquer invocação do segundo (para evitar corridas de dados entre leitura e gravação buffer
)? Caso contrário, como os sincronizo?